PHP: добавить секунды к дате

У меня есть $adate;, который содержит:

Tue Jan 4 07:59:59 2011

Я хочу добавить к этой дате следующее:

$duration=674165; // in seconds

После добавления секунд мне нужен результат обратно в формат даты.

Я не знаю, что я делаю, но я получаю странные результаты.

Примечание: обе переменные являются динамическими. Сейчас они равны заданным значениям, но при следующем запросе они будут иметь другие значения.


person ADM    schedule 27.12.2010    source источник


Ответы (7)


Если вы используете php 5.3+, вы можете использовать новый способ сделать это.

<?php 
$date = new DateTime();
echo $date->getTimestamp(). "<br>";
$date->add(new DateInterval('PT674165S')); // adds 674165 secs
echo $date->getTimestamp();
?>
person Elzo Valugi    schedule 27.12.2010
comment
Думаю, проще так: $date->add(DateInterval::createFromDateString('2 seconds')); Если вам нужен другой интервал, посмотрите здесь: php. net/manual/en/dateinterval.createfromdatestring.php - person Pablo S G Pacheco; 30.01.2015
comment
что такое PT и S в PT674165S? - person Andrew; 12.01.2017
comment
@Andrew Формат начинается с буквы P для точки. Каждый период продолжительности представлен целочисленным значением, за которым следует указатель периода. Если продолжительность содержит элементы времени, этой части спецификации предшествует буква T. php .net/manual/en/dateinterval.construct.php - person Elzo Valugi; 12.01.2017
comment
Ах, спасибо, под элементом времени вы имеете в виду время на часах, а не дни, из комментария в документах: чтобы устранить двусмысленность, P1M - это продолжительность в один месяц, а PT1M - это продолжительность в одну минуту (обратите внимание на указатель времени , T, которое предшествует значению времени). Но зачем использовать этот, а не метод, предложенный @PabloSGPacheco. Его кажутся более читабельными. - person Andrew; 12.01.2017
comment
Конечно, используйте то, что вы хотите или что лучше всего подходит для вашей программы. - person Elzo Valugi; 12.01.2017
comment
Относительную дату и время легче читать (и запоминать) — см. комментарий @gondo. - person cottton; 14.08.2019
comment
Я думаю, что это легче читать: $date = new DateTime(); $date->modify("+ 2 seconds"); - person Nick Johnson; 01.10.2019

Просто используйте некоторые приятные функции даты/времени PHP:

$adate="Tue Jan 4 07:59:59 2011";
$duration=674165;
$dateinsec=strtotime($adate);
$newdate=$dateinsec+$duration;
echo date('D M H:i:s Y',$newdate);
person DiglettPotato    schedule 27.12.2010
comment
Я работаю с php некоторое время, и это здорово и все такое (ну, за исключением случаев, когда это отстой [что не имеет значения]), но я просто не могу привыкнуть к тому, сколько кода требуется для простейших манипуляций с датой и временем задачи, лол - person ashleedawg; 05.07.2019

Учитывая тот факт, что $adate является отметкой времени (если это так), вы можете сделать что-то вроде этого:

$duration = 674165;
$result_date = strtotime(sprintf('+%d seconds', $duration), $adate);
echo date('Y-m-d H:i:s', $result_date);
person ncuesta    schedule 27.12.2010
comment
Или, что то же самое, вы можете добавить $duration к $adate. - person ncuesta; 27.12.2010

Сделай это:

$seconds = 1;
$date_now = "2016-06-02 00:00:00";

echo date("Y-m-d H:i:s", (strtotime(date($date_now)) + $seconds));
person user1211927    schedule 02.06.2016

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

$seconds_to_add = 30;
$time = new DateTime();
$time->setTimezone(new DateTimeZone('Europe/London'));
$time2 = $time->format("Y/m/d G:i:s");
$time->add(new DateInterval('PT' . $seconds_to_add . 'S'));
$timestamp = $time->format("Y/m/d G:i:s");
echo $timestamp;
echo '========';
echo $time2;

Результат:

2018/06/17 3:16:23========2018/06/17 3:15:53
person Alexandre Pereira    schedule 17.06.2018

У меня возникли проблемы с strtotime(), чтобы решить мою проблему добавления динамических данных/значения времени в текущее время

Это было мое решение:

$expires = 3600; //my dynamic time variable (static representation here)
$date = date_create(date('Y-m-d H:i:s')); //create a date/time variable (with the specified format - create your format, see (1))
echo date_format($date, 'Y-m-d H:i:s')."<br/>"; //shows the date/time variable without add seconds/time
date_add($date, date_interval_create_from_date_string($expires.' seconds')); //add dynamic quantity of seconds to data/time variable
echo date_format($date, 'Y-m-d H:i:s'); //shows the new data/time value

шрифт: https://secure.php.net/manual/en/datetime.add.php (см. также объектно-ориентированный стиль, решение Elzo Valugi)

(1) https://secure.php.net/manual/en/function.date.php

person Carlos Rafael    schedule 20.03.2018

Когда мне нужно выполнить какой-то расчет, я всегда помню, что мне нужно. Например, если мне нужно добавить несколько секунд к дате и времени, мне нужно дату и время где-то в будущем. То есть мне нужен класс с именем Future. Как это определяется? Какие данные нужны для работы? Кажется, что должно быть как минимум два значения: дата-время, относительно которого мне нужна будущая дата, и интервал, определяющий временной интервал между начальной датой-временем и желаемой датой-временем.

Итак, вот код:

use Meringue\ISO8601DateTime\FromISO8601 as DateTimeFromISO8601String;

$f =
    new Future(
        new DateTimeFromISO8601String('2011-01-04T07:59:59+00'),
        new NSeconds(674165)
    );

Затем вы можете вывести его в формате ISO8601:

$f->value(); // returns 2011-01-12T03:16:04+00:00

Если ваше исходное время и дата не в формате ISO8601, как в вашем примере, вы должны создать дату и время из пользовательского формата, следовательно, имя класса - FromCustomFormat. Поскольку это это дата и время, которое представляет себя в формате ISO8601, оно расширяет абстрактный класс с именем ISO8601DateTime. Вот полный пример:

(new Future(
    new FromCustomFormat(
        'D M j H:i:s Y',
        'Tue Jan 4 07:59:59 2011'
    ),
    new NSeconds(674165)
))
    ->value();

Подробнее об этом подходе.

person Vadim Samokhin    schedule 01.07.2020