Это та же идея, что и временная метка, но с Днями, чтобы вы могли легко вычислить разницу в днях или сравнить даты.
Зачем нужен дневной штамп?
У нас, как у людей, странное представление о времени. Позвольте мне показать вам, что я имею в виду.
It is... Referring to... We say... 1. Jan 20:00. 2. Jan 9:00. Tomorrow morning 2. Jan 12:00. 1. Jan 20:00. Yesterday evening
Что мы узнаем из этого? На самом деле нам нужна разница в днях, а не во времени.
Нельзя ли просто разделить временную метку на 86400?
Это будет что-то вроде Math.floor(timestamp / 86400)
.
К сожалению нет. Вы должны соблюдать часовой пояс и переход на летнее время.
Как правило, никогда ничего не предполагайте о датах, всегда старайтесь получить каждую деталь из библиотеки дат.
Нельзя ли просто разделить разницу во времени на 86400?
Это будет что-то вроде (timestamp1 — timestamp2) / 86400
.
Но не каждый день - это 24 часа, а расстояние между 23:00 и 4:00 всего 5 часов, но вы все равно скажете завтра.
Как это сделать правильно
Идея Daystamp решает все вышеперечисленные случаи. Это делает сравнения и расчеты различий настолько простыми, насколько это возможно:
daystamp1 == daystamp2 // same day daystamp2 - daystamp1 // day difference
Вычислите, используя смещение часового пояса.
Это самое простое решение, если ваша библиотека дат дает вам смещение.
В этом примере используется объект JavaScript Date
.
function daystamp (date) { const minutes = date.getTime() / 1000 / 60; const days = (minutes - date.getTimezoneOffset()) / 60 / 24; return Math.floor(days); }
Это решает проблему перехода на летнее время и смещения часового пояса.
Вычислите, переведя годы в дни
Если вы работаете в среде, которая не знает о смещении часового пояса или не можете его получить по какой-либо причине, вы все равно можете вычислить его, переведя годы в дни. Это означает, что вы сами должны уважать високосные годы, но это не самое сложное.
В этом примере используется объект tm
стандартной библиотеки C time.h
.
int daystamp (const tm &tm) { int days = tm.tm_yday; // start with day of the year days += (tm.tm_year - 70) * 365; // days of year since 1970 days += (tm.tm_year - 68) / 4; // a day every 4 years since 1972 days -= (tm.tm_year - 100) / 100; // remove every 100th year days += (tm.tm_year - 100) / 400; // add every 400th year return days; }
Вывод
Может быть, я использую неправильную команду поиска или, может быть, это очевидно, но я не нашел большого обсуждения расчета с днями, а не с секундами.
Тем не менее, я думаю, что так проще справляться с календарными различиями.