Складання та віднімання дат

Завдання Необхідно додати або відняти інтервал з дати.

Рішення Залежно від способу подання дати та інтервалу, слід застосовувати функцію strtotime() або деякі прості арифметичні функції. Якщо дата та інтервал представлені у відповідному форматі, то простіше звернутися до функції strtotime():

$birthday = 'March 10, 1975'; $whoopee_made = strtotime("$birthday - 9 місяців тому");

Якщо дата представлена ​​у вигляді мітки часу UNIX, а інтервал можна виразити в секундах, треба відняти інтервал з мітки часу:

$birthday = 163727100; $gestation = 36*7*86400; // 36 weeks $whoopee_made = $birthday - $gestation;

Обговорення Функцію strtotime() зручно використовувати з інтервалами змінної довжини, такими як місяці. Якщо не можна використовувати цю функцію, можна перетворити дату на позначку часу і додати або відняти інтервал у секундах. Це найзручніше для інтервалів з фіксованим часом, таких як дні чи тижні:

$now = time(); $next_week = $now + 7*86400;

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

У цьому випадку довжина одного з днів не дорівнюватиме 86 400 секунд, а складе або 82 800, або 90 000 секунд, залежно від сезону. Якщо програма працює виключно з UTC, то про це можна не турбуватися. Але якщо необхідно враховувати місцевий час, уникнути труднощів при підрахунку днів допоможе юліанське подання дат. Перетворення між мітками часу та юліанськими датами забезпечують функції unixtojd() та jdtounix():

$now = time(); $today = unixtojd($now); $next_week = jdtounix($today + 7); // Don't forget to add back hours, minutes, andseconds $next_week += 3600 * date('H',$now) + 60 * date('i',$now) + date('s',$now);

Функції unixtojd() і jdtounix() входять у модуль calendar і тому доступні, лише якщо PHP зібрано з його підтримкою (версія для Windows має вбудовану підтримку цього розширення).