Pytanie Uzyskaj aktualną datę, biorąc pod uwagę strefę czasową w PHP?


Chcę uzyskać dzisiejszą datę ze względu na strefę czasową w formacie Paula Eggerta (America/New_York) w PHP?


46
2017-11-04 08:40


pochodzenie




Odpowiedzi:


Najpierw ustaw domyślną strefę czasową, a następnie wybierz datę, a data będzie podana we wskazanej strefie czasowej:

<?php 
 date_default_timezone_set('America/New_York');
 $date= date('m-d-Y') ;
 ?>

http://php.net/manual/en/function.date-default-timezone-set.php


41
2017-11-04 09:03



Zauważ, że za pomocą date_default_timezone_set() ustawia go na wszystkie użycie date() po tym punkcie. Zobacz moją odpowiedź na przykład, jak zarządzać wieloma strefami czasowymi. - DesignerGuy
Obecnie złą praktyką, jeśli chcesz uzyskać tylko 1 datę w tej strefie czasowej, zobacz poniżej odpowiedź DesignerGuy na bardziej rozbudowane rozwiązanie. - Ward D.S.
Byłoby miło mieć ogólny sposób wyboru strefy czasowej. - Zan


Pozostałe odpowiedzi określają strefę czasową dla wszystkich dat w systemie. To nie zawsze działa dobrze, jeśli chcesz obsługiwać wiele stref czasowych dla użytkowników.

Oto krótka wersja:

<?php
$date = new DateTime("now", new DateTimeZone('America/New_York') );
echo $date->format('Y-m-d H:i:s');

Działa w PHP> = 5.2.0

Lista obsługiwanych stref czasowych: php.net/manual/en/timezones.php


Oto wersja z istniejącą strefą czasową według czasu i ustawienia według ustawień użytkownika

<?php

$usersTimezone = 'America/New_York';
$date = new DateTime( 'Thu, 31 Mar 2011 02:05:59 GMT', new DateTimeZone($usersTimezone) );
echo $date->format('Y-m-d H:i:s');

Oto bardziej szczegółowa wersja, aby pokazać proces nieco jaśniej

<?php

// Date for a specific date/time:
$date = new DateTime('Thu, 31 Mar 2011 02:05:59 GMT');

// Output date (as-is)
echo $date->format('l, F j Y g:i:s A');     

// Output line break (for testing)
echo "\n<br />\n";

// Example user timezone (to show it can be used dynamically)
$usersTimezone = 'America/New_York';

// Convert timezone
$tz = new DateTimeZone($usersTimezone);
$date->setTimeZone($tz);

// Output date after 
echo $date->format('l, F j Y g:i:s A');

Biblioteki

  • Węgiel - Bardzo popularna biblioteka dat.
  • Chronos - Zastąpienie zamiennika dla Carbon koncentruje się na niezmienności. Zobacz poniżej, dlaczego jest to ważne.
  • jenssegers / date - Rozszerzenie Carbon, które dodaje obsługę wielu języków.

Jestem pewien, że dostępnych jest wiele innych bibliotek, ale to jest kilka, które znam.


Lekcja premiowa: niezmienne obiekty Data

Kiedy już tu jesteś, pozwól, że zaoszczędzę ci przyszłego bólu głowy. Załóżmy, że chcesz obliczyć 1 tydzień od dzisiaj i 2 tygodnie od dzisiaj. Możesz napisać coś w rodzaju:

<?php

// Create a datetime (now, in this case 2017-Feb-11)
$today = new DateTime();

echo $today->format('Y-m-d') . "\n<br>";
echo "---\n<br>";

$oneWeekFromToday = $today->add(DateInterval::createFromDateString('7 days'));
$twoWeeksFromToday = $today->add(DateInterval::createFromDateString('14 days'));

echo $today->format('Y-m-d') . "\n<br>";
echo $oneWeekFromToday->format('Y-m-d') . "\n<br>";
echo $twoWeeksFromToday->format('Y-m-d') . "\n<br>";
echo "\n<br>";

Wyjście:

2017-02-11 
--- 
2017-03-04 
2017-03-04 
2017-03-04

Hmmmm ... To nie jest dokładnie to, czego chcieliśmy. Modyfikowanie tradycyjnego DateTime obiekt w PHP nie tylko zwraca zaktualizowaną datę, ale także modyfikuje oryginalny obiekt.

To jest gdzie DateTimeImmutable wchodzi.

$today = new DateTimeImmutable();

echo $today->format('Y-m-d') . "\n<br>";
echo "---\n<br>";

$oneWeekFromToday = $today->add(DateInterval::createFromDateString('7 days'));
$twoWeeksFromToday = $today->add(DateInterval::createFromDateString('14 days'));

echo $today->format('Y-m-d') . "\n<br>";
echo $oneWeekFromToday->format('Y-m-d') . "\n<br>";
echo $twoWeeksFromToday->format('Y-m-d') . "\n<br>";

Wyjście:

2017-02-11 
--- 
2017-02-11 
2017-02-18 
2017-02-25 

W tym drugim przykładzie otrzymujemy daty, których oczekiwaliśmy. Używając DateTimeImmutable zamiast DateTime, zapobiegamy przypadkowym mutacjom stanu i zapobiegamy potencjalnym błędom.


111
2018-06-24 18:53



Doceń odpowiedź @DesignerGuy, ale tutaj jest właściwy lista obsługiwanych stref czasowych: php.net/manual/en/timezones.php - Chris Harrison
Dzięki @ChrisHarrison. Właśnie zaktualizowałem odpowiedź. - DesignerGuy
To powinna być zaakceptowana odpowiedź i właśnie tego szukałem. Dzięki! - Brett


Jeśli masz dostęp do PHP 5.3, to rozszerzenie wewnętrzne jest bardzo miły dla robienia takich rzeczy.

Oto przykład z podręcznika:

$fmt = new IntlDateFormatter( "en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
    'America/Los_Angeles',IntlDateFormatter::GREGORIAN  );
$fmt->format(0); //0 for current time/date

W twoim przypadku możesz:

$fmt = new IntlDateFormatter( "en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
        'America/New_York');
 $fmt->format($datetime); //where $datetime may be a DateTime object, an integer representing a Unix timestamp value (seconds since epoch, UTC) or an array in the format output by localtime(). 

Możesz ustawić strefę czasową, taką jak America/New_York, jest to znacznie lepsze niż użycie przesunięcia GMT lub UTC, ponieważ uwzględnia ono również okresy oszczędzania światła dziennego.

W końcu, ponieważ rozszerzenie intl używa danych ICU, który zawiera wiele bardzo przydatnych funkcji, jeśli chodzi o tworzenie własnych formatów daty / czasu.


3
2017-11-04 08:55





Stworzyłem prostą funkcję, której możesz użyć do konwersji czasu na dowolną strefę czasową:

function convertTimeToLocal($datetime,$timezone='Europe/Dublin') {
        $given = new DateTime($datetime, new DateTimeZone("UTC"));
        $given->setTimezone(new DateTimeZone($timezone));
        $output = $given->format("Y-m-d"); //can change as per your requirement
        return $output;
}

2
2017-09-19 07:03





<?php
date_default_timezone_set('GMT-5');//Set New York timezone
$today = date("F j, Y")
?>

-1
2017-11-04 08:48