2009-12-10 5 views
0

strtotime ('3 января 2010') возвращает 1230993600 в GMT + 5: 30.PHP strtotime возвращает неверные результаты

В то время как согласно this, временная отметка unix 1230993600 - 3 января, . Так что он отключен на один год.

Это происходит на PHP 5.2.6, а также 5.2.11.

+0

WFM на PHP 5.2.10-2ubuntu6.3: 'эхо StrToTime ('3 января 2010');' возвращает '1231009800' – 2009-12-10 22:29:41

+0

На самом деле, в соответствии с этим сайтом, то Отметка времени Unix 1230993600 составляет 01/03/09 @ 8:40:00. –

ответ

2

Проблема: , в строке даты. Кажется отделить дату от времени элементов в строке, так как

echo date('Y-m-d H:i:s', strtotime('3rd January, 2010')); 

возвращает

2009-01-03 20:10:00 

тогда

echo date('Y-m-d H:i:s', strtotime('3rd January 2010')); 

(, удален) возвращает правильную дату:

2010-01-03 00:00:00 
3

W У вас есть запятая после месяца, она предполагает, что 2010 год - военное время, а не год. Если вы хотите, чтобы он интерпретировал 2010 год как год, пропустите запятую.

1

strtotime() не является непогрешимым. Это контекстный анализатор, который пытается преобразовать английские описания даты в метку времени. Формат, который вы используете, кажется непригодным для правильного разбора.

Вы можете увидеть различия в следующих примерах:

echo strtotime('3rd January,2010')."<BR>"; 
echo strtotime('3 January, 2010')."<BR>"; 
echo strtotime('January 3rd, 2010')."<BR>"; 
echo strtotime('January 3, 2010')."<BR>"; 

приводит:

1231042200 
1231042200 
1262505600 
1262505600 

Первые два возврата другой временной метки, чем последние два. Из форматов последние два более семантически (по-английски) правильные, и я бы попытался их использовать.

EDIT

Как отметили другие плакаты, запятая путает парсер о дате части из-за того, ваши даты лексем.

echo strtotime('3rd January 2010')."<BR>"; 

возвращает правильную временную метку для вашего формата.

+0

Очень хороший ответ. Просто добавьте немного информации: когда strtotime() не может проанализировать год, он использует текущий год (который является 2009), так же, как он не был указан. – Savageman

+0

, но почему он работает с 2009 годом? Кроме того, первый формат - совершенно правильный формат. – understack

+0

ОК, Савагеман ответил. – understack

Смежные вопросы