Fix some logic, add a few more tests
This commit is contained in:
parent
8cd386bb40
commit
58f75fc966
1 changed files with 33 additions and 11 deletions
|
@ -356,11 +356,22 @@ add_weeks(Weeks, Date) ->
|
||||||
|
|
||||||
add_months(Months, Date) ->
|
add_months(Months, Date) ->
|
||||||
{{Y,M,D}, Time} = to_date(Date),
|
{{Y,M,D}, Time} = to_date(Date),
|
||||||
to_unixtime(fix_maybe_improper_date({{Y, M+Months, D}, Time})).
|
{TargetYear, TargetMonth} = fix_year_month({Y,M+Months}),
|
||||||
|
DaysInMonth = calendar:last_day_of_the_month(TargetYear, TargetMonth),
|
||||||
|
NewD = lists:min([DaysInMonth, D]),
|
||||||
|
to_unixtime(fix_maybe_improper_date({{Y, M+Months, NewD}, Time})).
|
||||||
|
|
||||||
add_years(Years, Date) ->
|
add_years(Years, Date) ->
|
||||||
{{Y,M,D}, Time} = to_date(Date),
|
{{Y,M,D}, Time} = to_date(Date),
|
||||||
to_unixtime(fix_maybe_improper_date({{Y+Years, M, D}, Time})).
|
TargetYear = Y+Years,
|
||||||
|
NewD = case M of
|
||||||
|
2 ->
|
||||||
|
DaysInMonth = calendar:last_day_of_the_month(TargetYear, M),
|
||||||
|
lists:min([DaysInMonth, D]);
|
||||||
|
_ ->
|
||||||
|
D
|
||||||
|
end,
|
||||||
|
to_unixtime({{Y+Years, M, NewD}, Time}).
|
||||||
|
|
||||||
add_date({{AddY, AddM, AddD}, {AddH, AddI, AddS}}, Date) ->
|
add_date({{AddY, AddM, AddD}, {AddH, AddI, AddS}}, Date) ->
|
||||||
{{Y, M, D}, {H, I, S}} = to_date(Date),
|
{{Y, M, D}, {H, I, S}} = to_date(Date),
|
||||||
|
@ -377,12 +388,20 @@ fix_maybe_improper_date({Date0, Time}) ->
|
||||||
Date = fmid(Date0),
|
Date = fmid(Date0),
|
||||||
{Date, Time}.
|
{Date, Time}.
|
||||||
|
|
||||||
fmid({Y, M, D}) when M > 12 ->
|
fix_year_month({Y, M}) when M > 12 ->
|
||||||
YearsOver = M div 12,
|
YearsOver = M div 12,
|
||||||
fmid({Y+YearsOver, M-(YearsOver*12), D});
|
{Y + YearsOver, M-(YearsOver*12)};
|
||||||
fmid({Y, M, D}) when M < 1 ->
|
fix_year_month({Y, M}) when M < 1 ->
|
||||||
YearsUnder = abs(M-1) div 12 + 1,
|
YearsUnder = (abs(M-1) div 12) + 1,
|
||||||
fmid({Y-YearsUnder, M+(YearsUnder*12), D});
|
{Y - YearsUnder, M+(YearsUnder*12)};
|
||||||
|
fix_year_month({Y, M}) ->
|
||||||
|
{Y, M}.
|
||||||
|
|
||||||
|
|
||||||
|
fmid({Y, M, D}) when M > 12;
|
||||||
|
M < 1 ->
|
||||||
|
{NewY, NewM} = fix_year_month({Y, M}),
|
||||||
|
fmid({NewY, NewM, D});
|
||||||
|
|
||||||
fmid({Y, M, D}) when (D > 30 andalso (
|
fmid({Y, M, D}) when (D > 30 andalso (
|
||||||
M=:=4 orelse
|
M=:=4 orelse
|
||||||
|
@ -808,11 +827,14 @@ arith_tests(_) ->
|
||||||
?_assertEqual({{2015,1,1},{23,59,59}}, to_date(add_days(1, {{2014,12,31},{23,59,59}}))),
|
?_assertEqual({{2015,1,1},{23,59,59}}, to_date(add_days(1, {{2014,12,31},{23,59,59}}))),
|
||||||
?_assertEqual({{2015,1,7},{23,59,59}}, to_date(add_weeks(1, {{2014,12,31},{23,59,59}}))),
|
?_assertEqual({{2015,1,7},{23,59,59}}, to_date(add_weeks(1, {{2014,12,31},{23,59,59}}))),
|
||||||
?_assertEqual({{2015,1,31},{23,59,59}}, to_date(add_months(1, {{2014,12,31},{23,59,59}}))),
|
?_assertEqual({{2015,1,31},{23,59,59}}, to_date(add_months(1, {{2014,12,31},{23,59,59}}))),
|
||||||
%% currently fails the following test. Passing it will require improved logic
|
?_assertEqual({{2015,2,28},{0,0,0}}, to_date(add_months(2, {{2014,12,31},{0,0,0}}))),
|
||||||
?_assertEqual({{2015,3,1},{0,0,0}}, to_date(add_months(2, {{2014,12,31},{0,0,0}}))),
|
?_assertEqual({{2016,2,28},{0,0,0}}, to_date(add_years(1, {{2015,2,28},{0,0,0}}))),
|
||||||
|
?_assertEqual({{2014,2,28},{0,0,0}}, to_date(add_months(-24, {{2016,2,29},{0,0,0}}))),
|
||||||
|
?_assertEqual({{2012,2,29},{0,0,0}}, to_date(add_months(-48, {{2016,2,29},{0,0,0}}))),
|
||||||
|
?_assertEqual({{2016,2,29},{0,0,0}}, to_date(add_months(-1, {{2016,3,31},{0,0,0}}))),
|
||||||
|
?_assertEqual({{2017,2,28},{0,0,0}}, to_date(add_years(1, {{2016,2,29},{0,0,0}}))),
|
||||||
?_assertEqual({{2015,3,1},{0,0,0}}, to_date(add_days(1, {{2015,2,28},{0,0,0}}))),
|
?_assertEqual({{2015,3,1},{0,0,0}}, to_date(add_days(1, {{2015,2,28},{0,0,0}}))),
|
||||||
?_assertEqual({{2015,3,3},{0,0,0}}, to_date(add_days(3, {{2015,2,28},{0,0,0}}))),
|
?_assertEqual({{2015,3,3},{0,0,0}}, to_date(add_days(3, {{2015,2,28},{0,0,0}})))
|
||||||
?_assertEqual({{2017,3,1},{0,0,0}}, to_date(add_years(1, {{2016,2,29},{0,0,0}})))
|
|
||||||
]}.
|
]}.
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue