Додавання одного дня до побачення


172

Мій код, щоб додати один день до дати, повертає дату перед днем ​​додавання: 2009-09-30 20:24:00дата після додавання одного дня БУДЬ перенесена на наступний місяць:1970-01-01 17:33:29

<?php

    //add day to date test for month roll over

    $stop_date = date('Y-m-d H:i:s', strtotime("2009-09-30 20:24:00"));

    echo 'date before day adding: '.$stop_date; 

    $stop_date = date('Y-m-d H:i:s', strtotime('+1 day', $stop_date));

    echo ' date after adding one day. SHOULD be rolled over to the next month: '.$stop_date;
?>

Я раніше використовував досить подібний код, що я тут роблю неправильно?

Відповіді:


333
<?php
$stop_date = '2009-09-30 20:24:00';
echo 'date before day adding: ' . $stop_date; 
$stop_date = date('Y-m-d H:i:s', strtotime($stop_date . ' +1 day'));
echo 'date after adding 1 day: ' . $stop_date;
?>

Для PHP 5.2.0+ ви також можете зробити наступне:

$stop_date = new DateTime('2009-09-30 20:24:00');
echo 'date before day adding: ' . $stop_date->format('Y-m-d H:i:s'); 
$stop_date->modify('+1 day');
echo 'date after adding 1 day: ' . $stop_date->format('Y-m-d H:i:s');

3
Дякую. Вирішено як: $ stop_date = date ('Ymd H: i: s', strtotime ("$ stop_date + 1 день"));
ian

11
Не слід використовувати змінну в рядку. Ви повинні використовувати: date('Y-m-d H:i:s', strtotime($stop_date . ' + 1 day'));як у відповіді, яку вам дав @ w35l3y.
Cas Bloem

Ви повинні додати дзвінок до функції date_default_timezone_set перед запуском цього коду. Наприклад додайте date_default_timezone_set ("Європа / Рим");
Лука Мастростефано

96
$date = new DateTime('2000-12-31');

$date->modify('+1 day');
echo $date->format('Y-m-d') . "\n";

6
Це більш новітнє рішення - ідеальне.
Cas Bloem

... Поки це не спричиняє фатальних помилок під час запуску вашого хоста;)
Генрік Ерландссон

Не вибачайтесь. Деякі люди опублікували відповідь дами через 3 роки після того, як ви це зробили
Мавг каже, що поверніть Моніку

1
Ви повинні додати дзвінок до функції date_default_timezone_set перед запуском цього коду. Наприклад додайте date_default_timezone_set ("Європа / Рим");
Лука Мастростефано

@LucaMastrostefano ні, у вас повинен бути встановлений часовий пояс на вашому сервері ...
MH

28

Найпростіше рішення:

$date = new DateTime('+1 day');
echo $date->format('Y-m-d H:i:s');

Мені подобається твій шлях в одному лайнеріecho (new DateTime('+1 day'))->format('Y-m-d H:i:s');
Aba

@Aba Я не думаю, що ваш один лайнер працює у старих версіях PHP, тому що я спробував це, і я отримав помилку:Unexpected T_OBJECT_OPERATOR” error in PHP
Zachary Weixelbaum

25

Це працювало для мене: на поточну дату

$date = date('Y-m-d', strtotime("+1 day"));

для будь-якого дати:

date('Y-m-d', strtotime("+1 day", strtotime($date)));

2
спасибі це працювало на мене. Найпростіше з усіх заданих рішень.
Пунеет Верма

2
вам не потрібно повторювати і strtotime()date('Y-m-d', strtotime($date . " +1 day"));
вкладати

2
Приємно, це найпростіше рішення! Дякую
Ангел


6

Простий для читання та розуміння спосіб:

$original_date = "2009-09-29";

$time_original = strtotime($original_date);
$time_add      = $time_original + (3600*24); //add seconds of one day

$new_date      = date("Y-m-d", $time_add);

echo $new_date;

3
Іноді це не вдасться при зміні літнього часу, коли тривалість дня не становить 24 годин.
Nik Dow

3

Я завжди просто додаю 86400 (секунди в день):

$stop_date = date('Y-m-d H:i:s', strtotime("2009-09-30 20:24:00") + 86400);

echo 'date after adding 1 day: '.$stop_date; 

Це, мабуть, не найрізноманітніший спосіб, але це працює!


Як у вас справи з високосними секундами, коли додавання 86400 не буде працювати, оскільки в цей день є 86401 секунда? (гаразд, я знаю, що це відбувається лише кожні кілька років, але залежно від програми це може бути важливо)
Глен,

1
Не всі дні в них 86400 секунд. Насправді в більшості місць у США двічі на рік є 3600 менше або додаткових секунд.
Пітер Ковач

1
Ви можете сміливо ігнорувати стрибкові секунди, оскільки це "Unix time". Це дещо складно, але читайте цю статтю для отримання додаткової інформації: derickrethans.nl/leap_seconds_and_what_to_do_with_them.php
Christian Davén

2
Вам слід уникати цього рішення. Ось чому: stackoverflow.com/questions/2613338 / ...
mspir

1
Не додайте дату, додавши 86400 секунд до попереднього дня! У вас буде помилка у коді! Це не працює в літній день!
sbrbot

1

Хоча я погоджуюся з відповіддю Дуга Хейса, я задзвоню тут, щоб сказати, що причина, по якій ваш код не працює, полягає в тому, що strtotime () очікує INT як другий аргумент, а не рядок (навіть той, який представляє дату)

Якщо ви ввімкнете максимум повідомлень про помилки, ви побачите це як помилку "Не добре сформоване числове значення", що є рівнем E_NOTICE.


1

modify()Метод , який може бути використаний для додавання збільшення до існуючогоDateTime значенням.

Створіть новий DateTimeоб’єкт із поточною датою та часом:

$due_dt = new DateTime();

Отримавши DateTimeоб’єкт, ви можете маніпулювати його значенням, додаючи або віднімаючи часові періоди:

$due_dt->modify('+1 day');

Ви можете прочитати більше про керівництві PHP .


0

Наступний код отримує перший день січня поточного року (але це може бути інша дата) і додає до цього день 365 днів (але це може бути N кількість днів), використовуючи клас DateTime та його метод модифікувати () та форматувати ( ):

echo (new DateTime((new DateTime())->modify('first day of January this year')->format('Y-m-d')))->modify('+365 days')->format('Y-m-d');

0

Оскільки у вас вже є відповідь на те, що не так з вашим кодом, я можу запропонувати інший погляд на те, як ви можете грати з датами в цілому, і вирішити свою проблему конкретно.

Часто у вас виникає проблема з точки зору вирішення. Це лише одна з причин, коли ви закінчите імперативний код. Чудово, якщо це працює, хоча; Є лише інші, напевно, більш доцільні альтернативи. Один з них - декларативний код. Сенс у тому, щоб запитати, що вам потрібно, а не як туди дістатися.

У вашому конкретному випадку це може виглядати наступним чином. По-перше, вам потрібно з’ясувати, що саме ви шукаєте, тобто виявити абстракції. У вашому випадку, схоже, вам потрібна побачення . Не просто будь-яку дату, а ту, яка має якесь стандартне представлення. Скажіть, дата ISO8601. Є щонайменше дві реалізації: перша - це дата, розібрана з рядка, відформатованого ISO8601 (або рядок у будь-якому іншому форматі, фактично), а друга - деяка майбутня дата, яка буде через день. Таким чином, весь код може виглядати так:

(new Future(
    new DateTimeParsedFromISO8601('2009-09-30 20:24:00'),
    new OneDay()
))
    ->value();

Щоб дізнатися більше прикладів із жонглюванням на даті, ознайомтесь із цим .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.