Potrzebuję łatwego sposobu na przekonwertowanie znacznika czasu na UTC (z dowolnej strefy czasowej, w której znajduje się serwer) NADZIEJA bez korzystania z bibliotek.
90
Wypróbuj metody getTimezone i setTimezone , zobacz przykład
(Ale to używa klasy)
AKTUALIZACJA:
Bez zajęć możesz spróbować czegoś takiego:
$the_date = strtotime("2010-01-19 00:00:00");
echo(date_default_timezone_get() . "<br />");
echo(date("Y-d-mTG:i:sz",$the_date) . "<br />");
echo(date_default_timezone_set("UTC") . "<br />");
echo(date("Y-d-mTG:i:sz", $the_date) . "<br />");
UWAGA: Może być również konieczne przywrócenie oryginalnej strefy czasowej
gmdate
zamiast zmieniać domyślną strefę czasową na UTC. Ponieważgmdate
automatycznie używa UTC.Użyj strtotime, aby wygenerować znacznik czasu z podanego ciągu (interpretowanego jako czas lokalny) i użyj gmdate, aby uzyskać go jako sformatowaną datę UTC z powrotem.
Przykład
Zgodnie z prośbą, oto prosty przykład:
echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));
źródło
Korzystanie z DateTime:
$given = new DateTime("2014-12-12 14:18:00"); echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 14:18:00 Asia/Bangkok $given->setTimezone(new DateTimeZone("UTC")); echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 07:18:00 UTC
źródło
Zrób w ten sposób:
gmdate('Y-m-d H:i:s', $timestamp)
lub po prostu
gmdate('Y-m-d H:i:s')
aby otrzymać „TERAZ” w UTC.
Sprawdź referencje:
http://www.php.net/manual/en/function.gmdate.php
źródło
Jeśli masz datę w tym formacie RRRR-MM-HH dd: mm: ss, możesz faktycznie oszukać php, dodając UTC na końcu swojego "ciągu datetime" i użyć strtotime do konwersji.
date_default_timezone_set('Europe/Stockholm'); print date('Y-m-d H:i:s',strtotime("2009-01-01 12:00"." UTC"))."\n"; print date('Y-m-d H:i:s',strtotime("2009-06-01 12:00"." UTC"))."\n";
Spowoduje to wydrukowanie tego:
2009-01-01 13:00:00 2009-06-01 14:00:00
I jak widać rozwiązuje również problem czasu letniego.
Trochę dziwny sposób na rozwiązanie tego .... :)
źródło
:D
Konwertuj ciąg lokalnej strefy czasowej na ciąg UTC.
np. strefa czasowa Nowej Zelandii
$datetime = "2016-02-01 00:00:01"; $given = new DateTime($datetime, new DateTimeZone("Pacific/Auckland")); $given->setTimezone(new DateTimeZone("UTC")); $output = $given->format("Y-m-d H:i:s"); echo ($output);
jeśli $ datetime = "2016-02-01 00:00:01", $ output = "2016-01-31 11:00:01";
if $ datetime = "2016-02-29 23:59:59", $ output = "2016-02-29 10:59:59";
jeśli $ datetime = "2016-05-01 00:00:01", $ output = "2016-04-30 12:00:01";
if $ datetime = "2016-05-31 23:59:59", $ output = "2016-05-31 11:59:59";
https://en.wikipedia.org/wiki/Time_in_New_Zealand
źródło
Jeśli nie masz nic przeciwko używaniu klasy DateTime w PHP , która była dostępna od PHP 5.2.0, to istnieje kilka scenariuszy, które mogą pasować do Twojej sytuacji:
Jeśli masz
$givenDt
obiekt DateTime, który chcesz przekonwertować na UTC, spowoduje to przekonwertowanie go na UTC:$givenDt->setTimezone(new DateTimeZone('UTC'));
Jeśli potrzebujesz
$givenDt
później oryginału , możesz alternatywnie sklonować dany obiekt DateTime przed konwersją sklonowanego obiektu:$utcDt = clone $givenDt; $utcDt->setTimezone(new DateTimeZone('UTC'));
Jeśli masz na przykład tylko ciąg znaków z datą i godziną,
$givenStr = '2018-12-17 10:47:12'
najpierw tworzysz obiekt datetime, a następnie konwertujesz go. Zauważ, że przy założeniu, że$givenStr
jest to strefa czasowa skonfigurowana w PHP.$utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
Jeśli podany ciąg daty i godziny znajduje się w innej strefie czasowej niż ta w konfiguracji PHP, utwórz obiekt daty i godziny, podając odpowiednią strefę czasową (zobacz listę stref czasowych obsługiwanych przez PHP ). W tym przykładzie zakładamy lokalną strefę czasową w Amsterdamie:
$givenDt = new DateTime($givenStr, new DateTimeZone('Europe/Amsterdam')); $givenDt->setTimezone(new DateTimeZone('UTC'));
źródło
Ponieważ strtotime wymaga określonego formatu wejściowego, można użyć DateTime :: createFromFormat ( wymagane jest php 5.3+ )
// set timezone to user timezone date_default_timezone_set($str_user_timezone); // create date object using any given format $date = DateTime::createFromFormat($str_user_dateformat, $str_user_datetime); // convert given datetime to safe format for strtotime $str_user_datetime = $date->format('Y-m-d H:i:s'); // convert to UTC $str_UTC_datetime = gmdate($str_server_dateformat, strtotime($str_user_datetime)); // return timezone to server default date_default_timezone_set($str_server_timezone);
źródło
Czasami używam tej metody:
// It is not importnat what timezone your system is set to. // Get the UTC offset in seconds: $offset = date("Z"); // Then subtract if from your original timestamp: $utc_time = date("Y-m-d H:i:s", strtotime($original_time." -".$offset." Seconds"));
Działa
przezwiększość czasu.źródło
http://php.net/manual/en/function.strtotime.php lub jeśli nie chcesz używać łańcucha, ale zamiast tego składników czasu, to http://us.php.net/manual/en/function.mktime. php
źródło
W PHP 5 lub nowszym możesz używać funkcji datetime :: format (patrz dokumentacja http://us.php.net/manual/en/datetime.format.php )
echo strftime( '%e %B %Y' , date_create_from_format('Y-d-m G:i:s', '2012-04-05 11:55:21')->format('U') ); // 4 May 2012
źródło
próbować
wyświetli:
powinieneś zmienić czas formatowania, aby zobaczyć inne wyniki
źródło
Funkcja normalizacji ogólnego przeznaczenia do formatowania dowolnego znacznika czasu z dowolnej strefy czasowej do innej. Bardzo przydatne do przechowywania sygnatur czasowych użytkowników z różnych stref czasowych w relacyjnej bazie danych. W przypadku porównań baz danych przechowuj znacznik czasu w formacie UTC i używaj go z
gmdate('Y-m-d H:i:s')
/** * Convert Datetime from any given olsonzone to other. * @return datetime in user specified format */ function datetimeconv($datetime, $from, $to) { try { if ($from['localeFormat'] != 'Y-m-d H:i:s') { $datetime = DateTime::createFromFormat($from['localeFormat'], $datetime)->format('Y-m-d H:i:s'); } $datetime = new DateTime($datetime, new DateTimeZone($from['olsonZone'])); $datetime->setTimeZone(new DateTimeZone($to['olsonZone'])); return $datetime->format($to['localeFormat']); } catch (\Exception $e) { return null; } }
Stosowanie:
źródło
alternatywnie możesz spróbować tego:
<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Y-m-d H:i:s e"); ?>
to da:
możesz użyć tego wewnątrz atrybutu value pola tekstowego, jeśli chcesz wyświetlić tylko datę tylko do odczytu.
usuń „e”, jeśli nie chcesz pokazywać swojego regionu / kraju.
źródło
Wykonaj następujące kroki, aby uzyskać czas UTC z dowolnej strefy czasowej ustawionej w systemie lokalnym użytkownika (to będzie wymagane dla aplikacji internetowych, aby zapisać różne strefy czasowe UTC):
Javascript (po stronie klienta):
var dateVar = new Date(); var offset = dateVar.getTimezoneOffset(); //getTimezoneOffset - returns the timezone difference between UTC and Local Time document.cookie = "offset="+offset;
PHP (po stronie serwera):
public function convert_utc_time($date) { $time_difference = isset($_COOKIE['offset'])?$_COOKIE['offset']:''; if($time_difference != ''){ $time = strtotime($date); $time = $time + ($time_difference*60); //minutes * 60 seconds $date = date("Y-m-d H:i:s", $time); } //on failure of js, default timezone is set as UTC below return $date; } .. .. //in my function $timezone = 'UTC'; $date = $this->convert_utc_time($post_date); //$post_date('Y-m-d H:i:s') echo strtotime($date. ' '. $timezone)
źródło
Jako ulepszenie odpowiedzi Philla Pafforda (nie zrozumiałem jego „Yd-mTG: i: sz” i zasugerował przywrócenie strefy czasowej). Proponuję więc to (skomplikowałem, zmieniając format HMTL na zwykły / tekstowy ...):
<?php header('content-type: text/plain;'); $my_timestamp = strtotime("2010-01-19 00:00:00"); // stores timezone $my_timezone = date_default_timezone_get(); echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date)\n"; // changes timezone date_default_timezone_set("UTC"); echo date("Y-m-d\TH:i:s\Z", $my_timestamp)."\t\t (ISO8601 UTC date)\n"; echo date("Y-m-d H:i:s", $my_timestamp)."\t\t (your UTC date)\n"; // reverts change date_default_timezone_set($my_timezone); echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date is back)\n"; ?>
źródło