Какая разница между 2 днями и 48 часами в php - PullRequest
0 голосов
/ 30 августа 2018

$new_date = date('Y-m-d', strtotime("+2 days"));

или

$new_date = date('Y-m-d', strtotime("+48 hours"));

Они одинаковые или разные

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Семантически они различны, о чем свидетельствует Фил в другом ответе. Это означает, что в некоторых других библиотеках, которые объясняют это, разница реальна.

Однако реализация strtotime () не принимает это во внимание, поэтому, учитывая ваш пример, это не имеет значения.

Мне было интересно, можно ли выполнить его через исходный код, так что вот так:

Реализация strtotime () делает это:

  1. strtotime () запускается , вызывая timelib_strtotime () для создания начальной конструкции ts
  2. timelib_strtotime () вызывает scan () для анализа строки
  3. он читает строку, которую вы ему дали, и один из получаемых им токенов - это +2 days или +48 hours, который считается относительным текстом .
  4. для относительного текста, между прочим, timelib_set_relative () называется
  5. в timelib_set_relative () выполняет поиск из с использованием timelib_lookup_relunit () , который использует timelib_relunit_lookup массив , обнаружив, что вы предоставили либо конструкцию с введите TIMELIB_DAY, значение 1, множитель 2 или конструкцию TIMELIB_HOUR, значение 1, множитель 24
  6. Он сохраняет информацию из предыдущего вызова в s-> time-> относительную конструкцию
  7. эта конструкция передается, пока strtotime не вызовет timelib_update_ts с ней (и с информацией о часовом поясе!)
  8. in timelib_update_ts мы вызываем do_adjust_relative () , чтобы принять меры. Мы делаем это без использования параметра часового пояса , что я считаю критической ошибкой
  9. do_adjust_relative () вызывает timelib_do_normalize ()
  10. timelib_do_normalize () для часов: do_range_limit(0, 24, 24, &time->h, &time->d), увеличение дней и уменьшение часов, если часы превышают жестко заданный предел, равный 24, и для дней do_range_limit_days () , увеличение месяцы и уменьшающиеся дни, если мы превысили лимит, принимая во внимание високосное время (но НЕ часовые пояса!).
  11. вернувшись к timelib_update_ts, мы вызываем do_adjust_timezone с параметром часового пояса, но на данный момент мы уже внесли все корректировки и больше не знаем, было ли это сделано с +48 hours или с +2 days. Таким образом, это не имеет значения.

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

0 голосов
/ 30 августа 2018

Они одинаковые или разные

Они совершенно разные. Объективно говоря, 2 дня не всегда равны 48 часам .

Подумайте о пересечении дневной границы.

Например, 2019-04-07T02:00:00+1100 (AEDT -> AEST)

$twoDays = new DateInterval('P2D');
$fortyEightHours = new DateInterval('PT48H');

$ref = new DateTimeImmutable('2019-04-07T01:00:00',
        new DateTimeZone('Australia/Melbourne'));

echo 'Reference:     ', $ref->format('r'), PHP_EOL;
echo 'Plus 2 days:   ', $ref->add($twoDays)->format('r'), PHP_EOL;
echo 'Plus 48 hours: ', $ref->add($fortyEightHours)->format('r'), PHP_EOL;

Это производит

Reference:     Sun, 07 Apr 2019 01:00:00 +1100
Plus 2 days:   Tue, 09 Apr 2019 01:00:00 +1000
Plus 48 hours: Tue, 09 Apr 2019 00:00:00 +1000

Обратите внимание, что HHVM по какой-то причине дает другой результат

Демо ~ https://3v4l.org/L4tKo

Этот список распространенных ложных данных, связанных с датой и временем, стоит проверить ~ https://github.com/kdeldycke/awesome-falsehood#dates-and-time


Стоит отметить, что использование одной и той же контрольной даты и манипулирование ею с помощью strtotime() дает результаты, отличные от указанных выше.

Демо ~ https://3v4l.org/O6MTd

Я подозреваю, что это потому, что его расчеты относительного времени не такие нюансы, как DateInterval.

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