2011-11-04 17 views

Odpowiedz

36

najpierw ustawić domyślną strefę czasową i uzyskać datę wtedy, data będzie w strefie czasowej należy podać:

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

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

+6

Zauważ, że używanie 'date_default_timezone_set()' ustawia go dla wszystkich wykorzystania 'date()' po tym punkcie. Zobacz moją odpowiedź na przykład, jak zarządzać wieloma strefami czasowymi. – DesignerGuy

+5

Obecnie złą praktyką, jeśli chcesz uzyskać tylko 1 datę w tej strefie czasowej, zobacz poniżej odpowiedź DesignerGuy na bardziej rozbudowane rozwiązanie. –

+0

Byłoby miło mieć ogólny sposób wyboru strefy czasowej. – Zan

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

Jeśli masz dostęp do PHP 5.3, intl extension jest bardzo dobry do robienia rzeczy takich jak to.

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żna to zrobić:

$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(). 

Jak można ustawić strefę czasową, takich jak America/New_York, jest to o wiele lepsze niż przy użyciu Przesunięcie GMT lub UTC, ponieważ uwzględnia również dzienne okresy oszczędzania światła.

W końcu, jako rozszerzenie wewnętrzne wykorzystuje dane ICU, które zawierają wiele bardzo przydatnych funkcji, jeśli chodzi o tworzenie własnych formatów daty/czasu.

94

innych odpowiedzi ustawić strefę czasową dla wszystkich dat w twojej system. 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'); 

Pracuje w PHP> = 5.2.0

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


Oto wersja z istniejącym czasu i ustawienia strefa czasowa 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 gadatliwy wersja pokazać proces trochę bardziej wyraźnie

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

  • Carbon - bardzo popularny termin bibliotece.
  • Chronos - Zastąpienie zamiennika dla węgla skupionego 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 znanych mi osób.


Bonus Lekcja: Niezmienne Data Objects

Chociaż jesteś tu, pozwól mi zaoszczędzić trochę przyszłej głowy. Załóżmy, że chcesz obliczyć 1 tydzień od dzisiaj i 2 tygodnie od dzisiaj. Możecie napisać kod jak:

<?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(new DateInterval('P7D')); 
$twoWeeksFromToday = $today->add(new DateInterval('P14D')); 

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

dane wyjściowe:

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

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

To gdzie DateTimeImmutable przychodzi

$today = new DateTimeImmutable(); 

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

$oneWeekFromToday = $today->add(new DateInterval('P7D')); 
$twoWeeksFromToday = $today->add(new DateInterval('P14D')); 

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 mamy daty możemy oczekiwać powrotem. Używając DateTimeImmutable zamiast DateTime, zapobiegamy przypadkowym mutacjom stanu i zapobiegamy potencjalnym błędom.

+0

Doceń odpowiedź @DesignerGuy, ale tutaj znajduje się * właściwa * lista obsługiwanych stref czasowych: http://php.net/manual/en/timezones.php –

+1

Dzięki @ChrisHarrison. Właśnie zaktualizowałem odpowiedź. – DesignerGuy

+1

To powinna być akceptowana odpowiedź i właśnie tego szukałem. Dzięki! – Brett

1

Stworzyłem pewną prostą funkcję można wykorzystać do konwersji czasu do dowolnej strefy czasowej:

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; 
} 
Powiązane problemy