2016-02-04 3 views
0

Я работаю над проектом, где пользователь может ввести дату и время, я что-то вычисляю из него, и я хочу сохранить его в базе данных.Преобразование DateTime в Unix и обратно

Потому что MySql может хранить дату и время только от 1000-01-01, тогда кажется хорошей идеей хранить его в метке времени.

Теперь, я хочу проверить, могу ли я создать объект DateTime, получить временную метку и попытаться преобразовать ее обратно.

$UtcTime = \DateTime::createFromFormat("Y-m-d H:i:s", '0-01-01 00:00:00', new \DateTimeZone('UTC')); 
var_dump($UtcTime); 
var_dump($UtcTime->format('U')); 
var_dump(\DateTime::createFromFormat('U', $UtcTime->format('U'), new \DateTimeZone('UTC'))); 

Выход заключается в следующем:

object(DateTime)[8] 
public 'date' => string '0000-01-01 00:00:00.000000' (length=26) 
public 'timezone_type' => int 3 
public 'timezone' => string 'UTC' (length=3) 

string '-62167219200' (length=12) 

boolean false 

Я пытался использовать createFromFormat('-U'..., но не помогло. Может кто-нибудь сказать мне, что мне не хватает, когда я хочу его вернуть?

UPDATE

Хорошо, теперь я проверил другую тему, и попытался это:

$dt = new \DateTime(); 
$dt->setTimestamp($UtcTime->format('U')); //<--- Pass a UNIX TimeStamp 
var_dump($dt->format('Y-m-d H:i:s')); 

И получите: 1905-06-06 19:35:44 что не 0000-01-01 00:00:00

UPDATE2

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

1782-01-01 00:00:001918-02-08 07:28:16 с TS -5932656000.

Так что я проверил руководство:

До PHP 5.1.0, не все платформы поддерживают отрицательные временные метки, поэтому диапазон дат может быть ограничен не ранее эпохи Unix. Это означает, что, например, даты до 1 января 1970 г. не будут работать в Windows, некоторых дистрибутивах Linux и нескольких других операционных системах.

Я работаю на локальном хосте с этим:

  • для Windows 10 Enterprise N 64-разрядные
  • Apache 2.4.4 64bit
  • PHP 5.6.5 64bit

Когда я выгрузите его в наш linux box, у меня есть подходящее время.

+0

Вы хотите использовать даты до года 1000? Вероятно, вы найдете очень плохую или воинственную поддержку для всего этого, так как даты точно не были точно прибиты. – deceze

+0

секунд - это всего лишь секунды до BC. Это проект астрологии, и что, если я хочу знать что-то о Гомерусе? – vaso123

+1

что не так с native 'strtotime'? –

ответ

-1

Я считаю, что это то, что вам нужно.

$date1 = new DateTime(); 

$timestamp = $date1->getTimestamp(); 

sleep(2); 

$date2 = new DateTime(); 
$date3 = new DateTime(); 

$date2->setTimestamp($timestamp); 

var_dump($date1 == $date2); // true 
var_dump($date1 == $date3); // false 
Смежные вопросы