php konwertuje datę i godzinę na UTC


90

Potrzebuję łatwego sposobu na przekonwertowanie znacznika czasu na UTC (z dowolnej strefy czasowej, w której znajduje się serwer) NADZIEJA bez korzystania z bibliotek.

Odpowiedzi:


30

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


55
Powinieneś po prostu użyć gmdatezamiast zmieniać domyślną strefę czasową na UTC. Ponieważ gmdateautomatycznie używa UTC.
poke

30
-1, ponieważ nie chcesz w tym celu zmieniać globalnej domyślnej strefy czasowej. Po prostu prosi o niezamierzone skutki uboczne.
Ward Bekker,

@Phill Co to jest „sz”?
Shahid Karimi,

2
Myślę, że powinno to być „Ym-dTG…” zamiast „Yd-mTG…”
Alex Angelico

To nie działa dla mnie w projekcie Laravel. Jego powrót tego samego dnia
Dharmender Tuli

109

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'));

7
Może mały przykład?
cherouvim

2
@cherouvim Nie myśl, że jest to konieczne, ale i tak dodałem… Mam nadzieję, że to pomoże.
poke

5
gmdate () jest jedną z tych funkcji PHP, na które żałuję, że nie natknąłem się dawno temu. nl2br, ktoś?
Charlie Schliesser

1
GMT i UTC nie zawsze są takie same.
Jay Sheth

1
@poke GMT szanuje czas letni, UTC nie i dlatego jest używany, więc nie musisz brać pod uwagę niczego innego
Necro

72

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

Pytanie mówi, że przekonwertuj znacznik czasu na znacznik czasu, a DateTime nie akceptuje znacznika czasu jako danych wejściowych. Musiałbyś jakoś przekonwertować go na łańcuch, a następnie przekonwertować go z powrotem.
felwithe


14

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 .... :)


Naprawdę nie rozumiem, dlaczego OP nie wybrał twojej sugestii:D
php_nub_qq

@php_nub_qq prawdopodobnie dlatego, że działa poprzez zmianę strefy czasowej dla całego skryptu, co może być niepożądane i może mieć niezamierzone konsekwencje.
felwithe

@felwithe Nie byłoby, gdybyś pominął pierwszą linię, która jest tylko do demonstracji
php_nub_qq

11

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);
  • NZDT: UTC + 13: 00,
    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";
  • NZST: UTC + 12: 00,
    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


5

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:

  1. Jeśli masz $givenDtobiekt DateTime, który chcesz przekonwertować na UTC, spowoduje to przekonwertowanie go na UTC:

    $givenDt->setTimezone(new DateTimeZone('UTC'));
    
  2. Jeśli potrzebujesz $givenDtpóźniej oryginału , możesz alternatywnie sklonować dany obiekt DateTime przed konwersją sklonowanego obiektu:

    $utcDt = clone $givenDt;
    $utcDt->setTimezone(new DateTimeZone('UTC'));
    
  3. 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 $givenStrjest to strefa czasowa skonfigurowana w PHP.

    $utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
    
  4. 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'));
    

4

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);

4

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 przez większość czasu.


3
Tutaj są dwa problemy. Najpierw nie odejmuj, powinieneś dodać przesunięcie. Po drugie, to nie działa, jeśli lokalna strefa czasowa jest obecnie na czas letni, a żądana data nie jest na czas letni. Przesunięcie będzie przesunięte o godzinę. Lub odwrotnie. Więc tak, to działa W większości przypadków, ale nie zawsze.
ajon,



0

próbować

echo date ('F d Y', strtotime ('2010-01-19 00:00:00'));

wyświetli:

19 stycznia 2010

powinieneś zmienić czas formatowania, aby zobaczyć inne wyniki


0

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 zgmdate('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:

$from = ['localeFormat' => "d/m/Y H:i A", 'olsonZone' => 'Asia/Calcutta'];

$to = ['localeFormat' => "Y-m-d H:i:s", 'olsonZone' => 'UTC'];

datetimeconv("14/05/1986 10:45 PM", $from, $to); // returns "1986-05-14 17:15:00"

0

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:

2017-10-25 17:13:20 Azja / Singapur

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.


0

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):

  1. 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;
    
  2. 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)
    

-1

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"; 
?>

2
Powinieneś zmienić swoją odpowiedź, aby wyjaśnić, jak to poprawia odpowiedź Phila. Co zmieniłeś w kodzie i dlaczego jest lepszy?
Cody Gray

Zmiana domyślnej strefy czasowej PHP w celu konwersji dwóch znaczników czasu to hack, który działa, ale nie jest eleganckim rozwiązaniem.
The Coprolal
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.