- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
static function anyToTimestamp($date) {
// 2009-09-03 12:10:55
if (preg_match('/^([0-9]{4})\-([0-9]{2})\-([0-9]{2})(?: ([0-9]{2})\:([0-9]{2})\:([0-9]{2}))?$/', $date, $arr)) {
$ts = mktime($arr[4], $arr[5], $arr[6], $arr[2], $arr[3], $arr[1]);
// 03.04.2008 10:12:11
} elseif (preg_match('/^([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})(?: ([0-9]{1,2})\:([0-9]{1,2})(?:\:([0-9]{2}))?)?$/', $date, $arr)) {
$ts = mktime($arr[4], $arr[5], $arr[6], $arr[2], $arr[1], $arr[3]);
// MySQL timestamp YYYYMMDDHHMISS
} elseif (preg_match('/^\d{14}$/', $date)) {
$ts = mktime(substr($string, 8, 2), substr($string, 10, 2), substr($string, 12, 2), substr($string, 4, 2), substr($string, 6, 2),
substr($string, 0, 4));
// PHP timestamp
} elseif (is_int($date)) {
$ts = $date;
// давно заметил, что предыдущее условие не всегда срабатывает. добавил условие ниже. если передается timestamp 100% сработает
}elseif(strlen((int)$date)>=10 && is_int((int)$date)) {
$ts = $date;
}
return ($ts && $ts!=-1)?$ts:null;
}
Копаюсь как обычно в проекте, а этот довольно большой на протяжении нескольких лет над ним трудились разные программисты.
Причем бывает читаю смешные комментарии.
Однако весь смысл не в этом как вы уже поняли.
kipar 14.01.2014 15:13 # 0
krypt 14.01.2014 16:02 # 0
eth0 14.01.2014 20:23 # +1
Ход рассуждения.
1) $date приводится к int по php-правилам (например, "123456shit" = 123456, "shit123456" = 0).
2) Поскольку strlen принимает не абы что, а строку, число неявно преобразуется в строку.
3) В строке, полученной из числа, будет столько символов, сколько десятичных цифр содержится в числе после его преобразования.
А вот в $ts = $date; они к числу преобразование не делают, что может привести к непредсказуемым последствиям.
Ruslyakan 16.01.2014 18:28 # 0