Дата арифметики в Эрланге - PullRequest
10 голосов
/ 14 июля 2011

У меня есть дата в этом формате {Y,M,D}. Существуют ли какие-либо хорошие вспомогательные библиотеки или приемы, которые я могу использовать, чтобы просто, скажем, вычесть три месяца из этой даты, не сталкиваясь с проблемами с недействительными датами, високосными годами и т. Д.

Мое последнее подобное использование в MySql, где вы можете ввести:

Select '2011-05-31' - Interval 3 Month;

, что дает '2011-02-28'. Я не заинтересован в том, чтобы написать эту библиотеку сам, этого я бы хотел избежать.

Ответы [ 3 ]

22 голосов
/ 14 июля 2011
1> calendar:gregorian_days_to_date(calendar:date_to_gregorian_days({2011, 7, 14}) - 90).     
{2011,4,15}

http://www.erlang.org/doc/man/calendar.html

18 голосов
/ 14 июля 2011

Используйте edate - в частности, функцию сдвига.

> edate:shift({2011,5,31}, -3, months).
{2011,2,28}

Под капотом используется модуль календаря, поэтому он правильно обрабатывает все угловые случаи.

3 голосов
/ 15 июля 2011

Я создал GitHub Gist с некоторыми полезными утилитами для такого рода вещей.Не стесняйтесь воровать у него, если хотите.

https://gist.github.com/104903

...