Jun 30, 2016 11:29
Когда пришлось чуть интенсивнее поработать с датами (в перле, но проблема явно шире) стало понятно насколько отвратительный синтаксис работы с датами в языках программирования, его обычно вообще нет, а есть сторонние библиотеки, которые не позволяют просто и изящно выполнять все операции с датами.
Единственным известным мне исключением является SQL, там работа с датами реализована в синтаксисе языка и реально близка к нормальному человеческому языку, странно, что у других этого нет, вроде как базовый тип.
Попробую описать как с моей точки зрения должен выглядеть интерфейс работы с датами:
0. Типы данных:
- Datetime - максимально точная дата со временем, переменную будем именовать dt.
- Duration - длительность в единицах времени, если единица месяц или год, то возникают подводные камни из-за того что это не фиксированные единицы, но это особенность типа, переменную будем именовать duration.
- Interval - множество дат с одной даты, до другой, переменную будем именовать interval.
1. Парсинг даты из строки и юникстайма - когда мы получаем дату извне в виде строки/числа нам её нужно привести к типу данных Datetime, думаю что это должна быть встроенная в язык функция (это точно не метод объекта Datetime, метод класса может быть, но удлиннение записи ни к чему, это важная часть языка)
parse_datetime - которая либо по заданному формату парсит ('%Y-%m'), либо по имени формата, например iso8601, новые именованные форматы должны подключаться плагинами
2. Сравнение дат
dt1 > dt2
dt1 == dt2
dt1 in (dt1 .. dt3)
3. Вычисления с датами
duration = dt1 - dt2
dt1 - dt2 < 15 min
dt1 + 15 hour < dt2
4. Получение атрибутов
dt1.year
dt.time
dt.timezone
...
interval1.duration
duration1.days
5. Конвертация даты во внешнее представление, это уже могут быть методы объекта:
dt.iso8601
dt.format('%Y-%m')
dt.epoch
и т.п.
Часть этих плюшек можно получить если дату хранить как число секунд, а часть если использовать специальный объект, а хотелось бы всё в одном.
it,
технологии,
программирование