Странная работа функции strtotime

BRat

o_0
Странная работа функции strtotime

Интересно баг, или нет
PHP 5.3.1 (built: Nov 28 2009 08:11:28)

<?php
var_dump(strtotime("23.12.09 15:20"));
var_dump(strtotime("25.12.09 10:29"));
var_dump(strtotime("18.12.09 11:25"));
var_dump(strtotime("28.12.09 09:34"));
?>

Результаты -
bool(false)
int(1261726140)
bool(false)
int(1261982040)

Раньше помню, что функция strtotime работала с GNU date input formats. Сейчас же, судя по документации и этому обсуждению http://bugs.php.net/bug.php?id=45658 , авторы php расширили поддерживаемые форматы даты, но списка поддерживаемых я не нашел

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

Фанат

oncle terrible
Команда форума
давай пока оставим функцию в покое
попробуй сам с уверенностью ответить, вот это - какая дата: 12-05-10? А 09-12-11?
 

BRat

o_0
Есть какие-то стандартные форматы, напр. 2009-10-11, или 10/11/09, или 09-10-11. Если твои даты в одном из этих форматов, то вполне можно определить.
Это я привел форматы "GNU Date Input Formats".
Но функция strtotime старается быть умнее, и формат 23.12.09 для нее тоже стал стандартным. Если не указывать время, этот формат определится верно. Косяк только если указывать и дату и время.
 

SiMM

Новичок
> Косяк только если указывать и дату и время.
Так почему поведение не одинаково во всех приведённых случаях? На примеры Фaнaта ни одна из дат не похожа.
 

Вурдалак

Продвинутый новичок
Автор оригинала: BRat
Но функция strtotime старается быть умнее, и формат 23.12.09 для нее тоже стал стандартным. Если не указывать время, этот формат определится верно. Косяк только если указывать и дату и время.
PHP:
<?php
echo date('Y-m-d H:i:s', strtotime('23.12.09'));
?>
— посмотри.

Так ты не ответил на вопрос &#1060;&#1072;&#1085;&#1072;&#1090;а, что есть «12-05-10»? Это 12-е марта (по-европейски) или 5-е декабря (по-американски)? :)
 

dimagolov

Новичок
Вурдалак,
интересно, что за определитель формата там зашит, если тот же пример, но для 25.12.09 отрабатывает ожидаемо?
 

Вурдалак

Продвинутый новичок
dimagolov
25 часов быть не может, вот и strtotime() пытается по-другому интерпретировать строку.

Но это всё неважно — запись страдает неоднозначностью и её просто нельзя использовать.
 

dimagolov

Новичок
во блин, я не сообразил, что оно как время всосало 23.12.09.

но на самом деле неоднозначности в записи "23.12.09 15:20" я не вижу, так как есть две части, одно разделенное точками, второе двоеточиями, можно и догадаться о том, что считать временем, а что датой
 

Вурдалак

Продвинутый новичок
В записи «23.12.09 15:20» — допустим, а если будет «08.09.09 15:20»? Опять же непонятно то ли это MM.DD.YY, то ли DD.MM.YY.

Я просто не готов назвать багом поведение функции при не вполне корретных параметрах.
 

vovanium

Новичок
dimagolov
Проблема наверное в том, что точками разделять дату принято по большей части только у нас, в штатах "/", и эта функция ведет себя по разному в зависимости от разделителей.
 

BRat

o_0
Вурдалак
> — посмотри.

забавно. Был не прав

> Так ты не ответил на вопрос *****а
человек будет долго думать, машина воспримет вполне однозначно - GNU Date Input Formats

> Я просто не готов назвать багом поведение функции при не вполне корретных параметрах.
вот и я не готов, поэтому и завел тему


Раз оно как время воспринимает "23.12.09", то вопрос исчерпан, данный формат ей неизвестен и считать багом такое поведение нельзя
 

fixxxer

К.О.
Партнер клуба
Я не проверял, но есть суровое подозрение, что поведение зависит от локали.
 
Сверху