Добавьте 13 часов к отметке времени - PullRequest
12 голосов
/ 14 июля 2009

У меня есть таблица со значениями меток времени, например:

    2009-07-14 02:00:00

Мне нужно отобразить их во время выполнения с добавлением 13 часов, например:

    2009-07-14 15:00:00

Какой самый простой способ сделать это в PHP?

Ответы [ 8 ]

19 голосов
/ 14 июля 2009

Я знаю, что

date( "Y-M-d H:i:s", strtotime( $timestamp_from_array ) + 13 * 3600 );

вонючий, но это даст вам представление.

strtotime преобразует строку метки времени в значение метки времени, затем мы добавляем часы и преобразуем их обратно в формат метки времени в массиве с помощью функции date.

Но я полагаю, что вы действительно хотите использовать часовые пояса .

Edit: igstan правильно, вы также должны учитывать изменения летнего времени между этими смещениями.

15 голосов
/ 14 июля 2009

Существует много проблем с часовыми поясами и летним временем при использовании базовой арифметики для расчета времени. Лучшее решение - использовать собственные функции даты / времени в PHP, такие как strtotime () или mktime () . Я написал о проблемах DST в своем блоге .

echo date('Y-M-d H:i:s', strtotime('2009-07-14 02:00:00 + 13 hours'));
2 голосов
/ 14 июля 2009

Можете ли вы сделать добавление, когда оно выходит из базы данных?

SELECT ... DateAdd(hh, 13, DateField) AS DateField

(SQL Server)

1 голос
/ 28 ноября 2017

Я знаю, что об этом спрашивали давным-давно, и я уже выбрал ответ, но я полагал, что важно указать новым пользователям в более современном и правильном направлении, которое использует фантастическую библиотеку Carbon :

>>> Carbon\Carbon::parse('2009-07-14 02:00:00')
... ->addHours(13)
... ->format('Y-m-d H:i:s');
=> Carbon\Carbon {#869
     +"date": "2009-07-14 15:00:00.000000",
     +"timezone_type": 3,
     +"timezone": "UTC",
   }

Углерод не только упрощает выполнение запрошенного расчета, но также защищает вас от возможных ошибок, которые вы можете совершить, пытаясь сделать то же самое вручную.

Оболочкой в ​​приведенном выше примере вывода является Laravel Tinker. Laravel поставляется с Carbon, поэтому вышеприведенное утверждение работает «из коробки». Если вы не используете современный PHP-фреймворк, вам следует. К нему легко добавить углерод.

1 голос
/ 14 июля 2009

У вас есть таблица с отметками времени? Если это база данных MySQL, вы можете просто сделать это в базе данных, используя addtime : SELECT ADDTIME('2007-12-31 23:59:59.999999', '1 1:1:1.000002');

Если вы используете PHP Zend Framework, вы можете сделать что-то вроде:

 $date=new Zend_Date(Array('year'=>$iYear,'month'=>$iMonth,'day'=>$iDay));
 // changes $date by adding 12 hours
 $date->add('12:00:00', Zend_Date::TIMES);

В качестве альтернативы, вы можете сделать это, используя встроенные функции PHP4, такие как: [быстрее, менее точно: не учитывает високосные секунды / изменения часового пояса и т. д.]

$datestamp=strtotime('2009-07-14 02:00:00'); // It'll probably be better using mktime
$datestamp=$datestamp+(60*60*13); // 60 seconds times 60 minutes times 13 hours

или [медленнее, точнее]

  $datestamp = strtotime('2009-07-14 02:00:00'); // It'll probably be better using mktime
  $newDate = date('Y-m-d H:i:S', mktime(date('H',$datestamp)+13, date('i',$datestamp), date('s',$datestamp), date('m',$datestamp), date('d',$datestamp), date('Y',$datestamp)));

или, если вы используете PHP 5 с использованием Datetime functions

$date = new DateTime('2009-07-14 02:00:00');
date_add($date, new DateInterval("P13H"));
1 голос
/ 14 июля 2009

вы можете использовать http://de3.php.net/manual/en/function.strptime.php, чтобы преобразовать его в метку времени Unix. Тогда вы можете легко добавить к этому 13 * 60 * 60 и использовать http://de3.php.net/manual/en/function.date.php, чтобы преобразовать его обратно в метку времени, как вам нравится.

другим способом было бы использование функции разнесения, но я думаю, что это может быть более сложным, потому что вам нужно посмотреть, изменятся ли дни / месяц / годы и прочее

0 голосов
/ 06 октября 2014

Допустим, вы выбирали конкретное поле даты из таблицы с именем " datetime_field " из строки ID 3000. Это было бы так просто!

SELECT *, ADDTIME(`datetime_field`,'0 13:00:00') as new_datetime
FROM `table_name`
WHERE id = 3000

Очевидно, что это можно использовать и в запросах на обновление, если, конечно, кто-то хочет обновить.

И наоборот, если вы просто добавляете к запросу 13 часов (разница часовых поясов). Можно использовать MySQL NOW () в качестве исходного времени и просто добавить время, как указано выше. Выбор, обновление или вставка это все та же методология! Было бы:

SELECT *, NOW() as current_datetime,
          ADDTIME(NOW(),'0 13:00:00') as new_datetime
FROM `table_name`
WHERE id = 3000

Сохраняйте это простым и быстрым!

: о)

0 голосов
/ 22 октября 2009
<?php
echo date('Y-m-d H:i:s', strtotime('+13 hours', strtotime('2009-07-14 02:00:00')));
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...