Добавляем время в PHP - PullRequest
       50

Добавляем время в PHP

0 голосов
/ 22 сентября 2009

Я извлекаю дату и время из базы данных mysql, и я хотел бы добавить к ней X часов, а затем сравнить с текущим временем. Пока я получил

$dateNow = strtotime(date('Y-m-d H:i:s'));
$dbTime = strtotime($row[0]);

тогда я попробовал $ dbTime + strtotime ("4 часа"); но 4 часа, кажется, добавляют 4 часа к текущему времени вместо сырых 4 часов. Как добавить X часов в dbTime?

ПРИМЕЧАНИЕ: я использую php 5.1.2, поэтому date_add не работает (5.3.0)

Ответы [ 8 ]

3 голосов
/ 22 сентября 2009

У вас есть несколько вариантов здесь:

1

$result = mysql_query("SELECT myDate FROM table");
$myDate = mysql_result($result, 0);
$fourHoursAhead = strtotime("+4 hours", strtotime($myDate));

2

// same first two lines from above
$fourHoursAhead = strtotime($myDate) + 4 * 60 * 60;

3.

$result = mysql_query("SELECT UNIX_TIMESTAMP(myDate) FROM table");
$myDate = mysql_result($result, 0);
$fourHoursAhead = $myDate + 4 * 60 * 60;

4

$fourHoursAhead = strtotime("+4 hours", $myDate);

5

$result = mysql_query("SELECT UNIX_TIMESTAMP(DATE_ADD(myDate, INTERVAL 4 HOUR))");
$fourHoursAhead = mysql_result($result, 0);
3 голосов
/ 22 сентября 2009

тогда я попробовал $ dbTime + strtotime ("4 часа"); но 4 часа, кажется, добавляют 4 часа к текущему времени вместо сырых 4 часов. Как добавить X часов в dbTime?

strtotime имеет необязательный второй аргумент. Предоставьте там метку времени Unix, и выходные данные будут относиться к этой дате, а не к текущей.

$newTime = strtotime('+4 hours', $dbTime);

Вы также можете использовать тот факт, что временные метки Unix основаны на секундах - если вы знаете, что такое четыре часа в секундах, вы можете просто добавить это к целочисленному значению времени.

2 голосов
/ 22 сентября 2009

time () и strtotime () приводят к меткам времени Unix в секундах, поэтому вы можете сделать что-то вроде следующего, предоставив свою базу данных и сделав сравнение:

$fourHours = 60 * 60 * 4;
$futureTime = time() + $fourHours;
1 голос
/ 22 сентября 2009

strtotime ("+ 4 часа", $ dbTime);

Второй аргумент - это отметка времени, которая используется в качестве базы для расчета относительных дат; по умолчанию используется текущее время. Ознакомьтесь с документацией .

Edit: Для коротких периодов времени, максимум 1 неделя, добавление секунд к отметке времени вполне допустимо. Всегда есть (7 * 24 * 3600) секунд в неделю; то же самое нельзя сказать в течение месяца или года. Кроме того, метка времени Unix - это количество секунд, прошедших с начала эпохи Unix (1 января 1970 г., 00:00:00 по Гринвичу) На это не влияют часовые пояса или летнее время. Часовые пояса и летнее время важны только при преобразовании метки времени Unix в фактические календарные день и время.

0 голосов
/ 22 сентября 2009

Предполагая, что метка времени, возвращаемая БД в формате SQL, должна нормально работать:

$dbTime = strtotime($row[0]);
$nowTime = time();

$future_dbTime = strtotime("+4 hours", $dbTime);

$diff_time_seconds = $nowTime - $dbTime;

if ($diff_time_seconds > 0) {
       echo "The current time is greater than the database time by:\n";
       $not_equal = true;

    }
if ($diff_time_seconds == 0) {
       echo "The current time is equal to the database time!";
    }
if ($diff_time_seconds < 0) {
       echo "The current time is less than the database time by:\n";
       $not_equal = true;
    }

if ($not_equal) {
$diff_time_abs_seconds = abs($diff_time_seconds);
echo date('h:m:s', $diff_time_abs_seconds);
}
0 голосов
/ 22 сентября 2009

Вероятно, самый безопасный способ сравнения - это правильный вариант в SQL

SELECT * FROM my_table WHERE someDateTimeColumn < DATE_ADD(NOW(), INTERVAL 4 hour)

И так как вы собираете его на PHP, вы можете динамически заменить бит «4 часа» на то, что нужно сравнить вашему коду.

(Примечание: размещение всего вычисления на другой стороне сравнения в столбце позволяет MySQL выполнять вычисления один раз для запроса, а не один раз для строки, а также использовать индекс таблицы, если он есть в этом столбце.)

0 голосов
/ 22 сентября 2009

Вот как бы я это сделал:

  1. Извлечение времени из базы данных с помощью функции UNIX_TIMESTAMP().

  2. Отметка времени UNIX указана в секундах, поэтому добавьте к ней 4*60*60.

  3. Преобразование измененной временной метки UNIX в дату с использованием PHP localtime () или strftime () .

    query("SELECT UNIX_TIMESTAMP(someDatetimeColumn) ...");
    . . .
    $dbTimeAdjusted = localtime($row[0] + 4*60*60);
    
0 голосов
/ 22 сентября 2009

Я, как правило, использую функцию time (), и на этой странице руководства они показывают дату недели в будущем: http://us3.php.net/manual/en/function.time.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...