2014-07-08 3 views
0

현재 PHP 응용 프로그램의 시간대를 사용하고 있습니다.php strtotime 이상한 동작

strtotime이 일관된 동작을하지 않는 것으로 나타났습니다. 이 예는 I'am이 무슨 말 것을 강조 :

var_dump("strtotime('now'), UTC, Europe/Paris and America/New_York"); 
date_default_timezone_set('UTC'); 
var_dump(strtotime('now')); 
date_default_timezone_set('Europe/Paris'); 
var_dump(strtotime('now')); 
date_default_timezone_set('America/New_York'); 
var_dump(strtotime('now')); 

var_dump("strtotime('now UTC'), UTC, Europe/Paris and America/New_York"); 
date_default_timezone_set('UTC'); 
var_dump(strtotime('now UTC')); 
date_default_timezone_set('Europe/Paris'); 
var_dump(strtotime('now UTC')); 
date_default_timezone_set('America/New_York'); 
var_dump(strtotime('now UTC')); 

var_dump("strtotime('today'), UTC, Europe/Paris and America/New_York"); 
date_default_timezone_set('UTC'); 
var_dump(strtotime('today')); 
date_default_timezone_set('Europe/Paris'); 
var_dump(strtotime('today')); 
date_default_timezone_set('America/New_York'); 
var_dump(strtotime('today')); 

var_dump("strtotime('today UTC'), UTC, Europe/Paris and America/New_York"); 
date_default_timezone_set('UTC'); 
var_dump(strtotime('today UTC')); 
date_default_timezone_set('Europe/Paris'); 
var_dump(strtotime('today UTC')); 
date_default_timezone_set('America/New_York'); 
var_dump(strtotime('today UTC')); 

결과 : 항상 UTC 타임 스탬프, 어떤 date_default_timezone_get() 수익률을 반환해야

string 'strtotime('now'), UTC, Europe/Paris and America/New_York' 
int 1404821878 
int 1404821878 
int 1404821878 
string 'strtotime('now UTC'), UTC, Europe/Paris and America/New_York' 
int 1404821878 
int 1404829078 
int 1404807478 
string 'strtotime('today'), UTC, Europe/Paris and America/New_York' 
int 1404777600 
int 1404770400 
int 1404792000 
string 'strtotime('today UTC'), UTC, Europe/Paris and America/New_York' 
int 1404777600 
int 1404777600 
int 1404777600 

strtotime('foo UTC').

strotime('today UTC')의 경우이 예제에서는 항상 1404777600이 반환됩니다. 또한 strtotime('today')은 시간대가 설정된 시간에 따라 다른 시간 소인을 예상대로 반환합니다.

그러나 strtotime('now UTC')을 호출 할 때 반대 동작이 발생합니다. strtotime('now UTC')은 시간대 설정의 다른 타임 스탬프 기능을 반환하고 strtotime('now')을 호출하면 항상 1404821878을 반환합니다.

버그입니까? 아니면 오해 했습니까?

답변

2

strtotime('now UTC')이 시간대의 현재 시간이 걸립니다 사전에

감사는 현지 시간으로 UTC로 해석하고 결과를 반환합니다. 즉 :

strtotime('now UTC') → strtotime('2014-07-08 14:35:00 UTC') → result 

당신은 세계 어느 곳에서, 생략 "UTC" "지금" "지금"이기 때문에 경우에 변환이 발생하지 않습니다.

제쳐두고 : 나는 종종 정의가 잘되어 있지 않기 때문에 strtotime의 어법 오토 매 시간 계산에 의존하지 않을 것입니다. strtotime은 초 단위의 정확한 시간 소인을 리턴합니다. 그 맥락에서 "오늘"은 정확히 무엇을 의미합니까? "지금 UTC"란 정확히 무슨 뜻입니까? '+1 달'은 정확히 무엇을 의미합니까? strtotime 타임 스탬프 문자열을 2014-07-08 14:35:00 Europe/Berlin과 같이 UNIX 타임 스탬프로 변환하는 데 유용합니다. 어쨌든 그보다 모호한 것은 일반적으로 정의되지 않은 결과를 낳습니다.