Преобразование даты (в миллисекундах) в метку времени

У меня есть формат даты, например '25 May 2016 10:45:53:567'.

Я хочу преобразовать в отметку времени.

Функция strtotime возвращает пустое значение.

$date = '25 May 2016 10:45:53:567';
echo strtotime($date); 
// returns empty

Когда я удалил миллисекунды, это работает.

$date = '25 May 2016 10:45:53';
echo strtotime($date);
// returns 1464153353

Пожалуйста, разберитесь с моей проблемой. Заранее спасибо.


person Tamilvanan    schedule 28.05.2016    source источник
comment
метка времени - alco, называемый unixtime, это секунды, прошедшие с 1 января 1970 года. Секунды!! Не миллисекунды. Вы не можете сделать это, используя strtotime .   -  person Michał G    schedule 28.05.2016
comment
Временные метки — это секунды, прошедшие с 1 января 1970 года. Они хранятся в виде целых чисел. Вы не можете хранить (или преобразовывать) миллисекунды в метки времени. Но вы можете преобразовать их в две переменные.   -  person Prokhor Sednev    schedule 28.05.2016
comment
Я получил ваши баллы @MichałG и Проктор. Я собираюсь разделить свое поле на два. Один для даты со временем, а другой для миллисекунд.   -  person Tamilvanan    schedule 28.05.2016
comment
@John Conde Никто не обсуждает и не спрашивает о миллисекундах в отметке времени даты или микровремени в этом вопросе (stackoverflow.com/questions/2167916/). Тогда как этот вопрос стал дубликатом?   -  person Tamilvanan    schedule 28.05.2016
comment
@tamilvanan: это упоминается в ответе, опубликованном Джоном Конде.   -  person Nisse Engström    schedule 28.05.2016
comment
@NisseEngström: в этом ответе миллисекунды обрезаются с заданной метки даты и времени. Это не мой точный ответ. Но это хорошая ссылка   -  person Tamilvanan    schedule 30.05.2016


Ответы (3)


Разделить строку:

$date = '25 May 2016 10:45:53:001';
preg_match('/^(.+):(\d+)$/i', $date, $matches);
echo 'timestamp: ' . strtotime($matches[1]) . PHP_EOL;
echo 'milliseconds: ' . $matches[2] . PHP_EOL;
// timestamp: 1464162353 
// milliseconds: 001 
person Prokhor Sednev    schedule 28.05.2016
comment
Я собираюсь использовать ваш метод. Меня интересует ваше регулярное выражение. Не могли бы вы рассказать, как это работает? - person Tamilvanan; 28.05.2016
comment
^ - начало строки, (.+) - захватываемая группа всех символов, : - символ ':', (\d+) - захватываемая группа цифр $ - конец строки. Довольно просто. Я бы порекомендовал использовать сайт regex101.com - вы можете легко создать регулярное выражение и протестировать его там. - person Prokhor Sednev; 28.05.2016

Используйте 1_:

$date = DateTime::createFromFormat('d M Y H:i:s:u', '25 May 2016 10:45:53:000');
echo $date->getTimestamp();
// 1464165953

// With microseconds
echo $date->getTimestamp().'.'.$date->format('u');
// 1464165953.000000
person Pyton    schedule 28.05.2016
comment
Спасибо. Я получил тот же результат для миллисекунд и без них. Какова причина ? - person Tamilvanan; 28.05.2016
comment
В миллисекундах $date1 = DateTime::createFromFormat('d M Y H:i:s:u', '25 мая 2016 г., 10:45:53:567'); эхо $date1->getTimestamp(); // 1464153353 Без миллисекунд $date2 = DateTime::createFromFormat('d M Y H:i:s', '25 мая 2016 10:45:53'); эхо $date2->getTimestamp(); // 1464153353 (по моему местному времени) - person Tamilvanan; 28.05.2016
comment
Я обновил ответ. Обычно временная метка представляет собой целочисленное значение. - person Pyton; 28.05.2016

Используйте Datetime вместо date и strtotime.

//using date and strtotime
$date = '25 May 2016 10:45:53:000';
echo "Using date and strtotime: ".date("Y-m-d H:i:s.u", strtotime($date)); 

echo "\n";\

//using DateTime
$date = new DateTime();
$date->createFromFormat('d M Y H:i:s.u', '25 May 2016 10:45:53:000');
echo "Using DateTime: ".$date->format("Y-m-d H:i:s.u"); 
// since you want timestamp
echo $date->getTimestamp();
// Output
// Using date and strtotime: 1969-12-31 16:00:00.000000
// Using DateTime: 2016-05-28 03:25:22.000000

Пример

person Community    schedule 28.05.2016