Czy UTC przestrzega czasu letniego?

83

Próbuję napisać skrypt, w którym chcę przekonwertować dowolną strefę czasową do UTCi odwrócić. Ale z niektórych miejsc, z których dowiedziałem się, że podczas konwersji dowolnej strefy czasowej na UTC z uwzględnieniem czasu letniego lub bez uwzględnienia czasu letniego, da ten sam UTCczas. Na przykład: Jeśli spróbuję przekonwertować ten:

$mytime = '2011-03-31 05:06:00.000';
$myzone = 'America/New_York';

do UTC z czasem letnim i bez czasu letniego, dostanę ...

(New_York->UTC DST=Yes)2011-03-31 09:06:00
(New_York->UTC DST=No)2011-03-31 09:06:00 ..........

Czy to jest poprawne? Jeśli tak, to dlaczego ??? Proszę, niech ktoś mi odpowie.

0001
źródło
Jeśli pokażesz nam skrypt, pomożemy Ci trochę lepiej.
Kevin Lacquement
4
Odpowiadając na pytanie tytułowe, żadne UTC nie przestrzega czasu letniego; jednak inne strefy mogą.
Kevin Lacquement

Odpowiedzi:

140

Nie, sam UTC nigdy nie ma czasu letniego. Jest to stały układ odniesienia, względem którego wyrażone są inne strefy czasowe.

Ze strony Wikipedii UTC :

Czas UTC nie zmienia się wraz ze zmianą pór roku, ale czas lokalny lub cywilny może ulec zmianie, jeśli jurysdykcja strefy czasowej przestrzega czasu letniego lub letniego. Na przykład UTC wyprzedza czas lokalny o 5 godzin na wschodnim wybrzeżu Stanów Zjednoczonych zimą, a latem o 4 godziny do przodu.

Innymi słowy, gdy strefa czasowa obserwuje czas letni, jej przesunięcie względem czasu UTC zmienia się, gdy następuje przejście na czas letni, ale jest to ta strefa czasowa, w której obserwuje się czas letni, a nie UTC.

Nie wiedząc zbyt wiele o obsłudze stref czasowych w PHP, wydaje mi się dziwne, że możesz określić "z czasem letnim" lub "bez czasu letniego" w konwersji - same strefy czasowe określają, kiedy zaczyna się czas letni ... nie powinno to być coś, co sam określisz.

Jon Skeet
źródło
1
„Nie wiedząc zbyt wiele na temat obsługi stref czasowych w PHP, wydaje mi się dziwne, że podczas konwersji można określić„ z czasem letnim ”lub„ bez czasu letniego ”” ... to prawdopodobnie dlatego, że nie zrobiłeś zbyt wiele programowalnego makaronu hiperłączowego. To jest język z wbudowaną date_sunrisefunkcją informującą o wschodzie słońca. Nie jestem pewien, czy do konwersji potrzebny jest czas letni, ale jest to obywatel pierwszej klasy obiektu daty: php.net/manual/en/function.date.php .
Paul Draper,
@PaulDraper: Bycie obywatelem pierwszej klasy obiektu daty ma pewien sens - po prostu nie określanie go osobno dla konwersji. Od tamtej pory dowiedziałem się trochę więcej o niektórych podstawowych procedurach C i podejrzewam, że mają z tym wiele wspólnego ...
Jon Skeet
1
Myślę, że można zapytać, czy to czas letni. Nie można przejść z czasu lokalnego + strefy czasowej do jednoznacznego czasu UTC bez tej dodatkowej informacji. Dzieje się tak, ponieważ niektóre czasy lokalne występują dwukrotnie podczas przejścia z czasu letniego.
Tom
@Tom: Doskonale zdaję sobie sprawę z czasu lokalnego występującego dwukrotnie, ale to nie znaczy, że dobrym pomysłem jest określenie, czy czas lokalny jest w czasie letnim w samej konwersji. Lepiej - IMO - określić sposób rozwiązania niejednoznaczności, jeśli jest niejednoznaczna. Wolę interfejsy API, aby unikać wyrażania niemożliwych sytuacji, takich jak EDT w styczniu.
Jon Skeet
1
Jeśli nie wiesz, jak ustawić strefę czasową w PHP, to dlatego, że PHP to bałagan, oto fantastyczny opis, dlaczego php powinien zostać wycofany: eev.ee/blog/2012/04/09/php-a-fractal- of-bad-design
Lucent Fox
2

Mam ten sam problem, używając tego kodu:

date_default_timezone_set('UTC');
$nowdate = date('l jS \of F Y h:i:s A');
echo "Current date and time is: " . $nowdate;

Teraz jest lato, a czas, który generuje ten kod, jest opóźniony o godzinę - więc nie sądzę, aby czas UTC w PHP dostosowywał się do czasu letniego.

Ciekawe, czy ktoś ma rozwiązanie ...

EDYTOWAĆ:

Znalazłem ten kod na forum, działa idealnie !!

date_default_timezone_set('Europe/London');
$TIME =  date("m/d/Y H:i",time());

Możesz więc wywołać bieżącą datę i godzinę, używając $ TIME. Wyjście można dostosować tak, aby wyświetlało się inaczej, zmieniając bit wewnątrz znacznika date (). Jeśli chcesz dostosować wyjście date (), skorzystaj z tego przewodnika: http://php.net/manual/en/function.time.php

Mam nadzieję że to pomoże :)

MattFiler
źródło