我想在现有的DateTime
值(采用{{Y,M,D},{H,m,s}}
的格式上增加一定的时间,但是看不到函数(例如Calendar
)模块),使我可以直接操作DateTime
值。
如何向这样的值添加(例如)10秒,10分钟或10小时?
答案 0 :(得分:4)
您可以使用Calendar
模块将DateTime
转换为秒,从而更轻松地添加所需的秒,分钟,小时等。
例如,增加10秒:
Date = {{2018,8,14},{13,10,25}}.
DateInSeconds = calendar:datetime_to_gregorian_seconds(Date). % 63701471425
NewDateInSeconds = DateInSeconds + 10. % 63701471435
calendar:gregorian_seconds_to_datetime(NewDateInSeconds). % {{2018,8,14},{13,10,35}}
在10分钟或10个小时内,只需做一点数学运算即可:
Date = {{2018,8,14},{13,10,25}}.
DateInSeconds = calendar:datetime_to_gregorian_seconds(Date). % 63701471425
NewDateInSeconds = DateInSeconds + (10 * 60 * 60). % 63701507425 (10 hours)
calendar:gregorian_seconds_to_datetime(NewDateInSeconds). % {{2018,8,14},{23,10,25}}
为使生活更轻松,您甚至可以为此创建一个函数,以向现有DateTime
上增加时间(或从中减去时间):
-type datetime() :: {{non_neg_integer(), pos_integer(), pos_integer()},
{non_neg_integer(), non_neg_integer(), non_neg_integer()}}.
-type timespan() :: {integer(), integer(), integer()}.
-spec add_time_to_datetime(datetime(), timespan()) -> datetime().
add_time_to_datetime(Date, {Hour, Min, Sec}) ->
DateInSeconds = calendar:datetime_to_gregorian_seconds(Date),
NewDateInSeconds = DateInSeconds + (Hour * 60 * 60) + (Min * 60) + Sec,
calendar:gregorian_seconds_to_datetime(NewDateInSeconds).
答案 1 :(得分:3)
您还可以使用特殊的时间管理库,例如qdate。
示例用法,添加一年,月份和分钟,并删除3天5个小时。
NewDate = qdate:add_date({{1, 2, -3}, {-5, 1, 0}}, {{2018, 8, 16}, {11, 0, 1}}).
答案 2 :(得分:2)
如果要接受两个日期时间结构并从第一个中减去第二个,则转换为公历秒,执行减法,然后重新转换是最常见的方法:
sub_datetime(DT1, DT2) ->
Seconds1 = calendar:datetime_to_gregorian_seconds(DT1),
Seconds2 = calendar:datetime_to_gregorian_seconds(DT2),
Diff = Seconds1 - Seconds2,
calendar:gregorian_seconds_to_datetime(Diff).
加法是一回事,只是相反的操作(当然,这也是可交换的。)
add_datetime(DT1, DT2) ->
Seconds1 = calendar:datetime_to_gregorian_seconds(DT1),
Seconds2 = calendar:datetime_to_gregorian_seconds(DT2),
Sum = Seconds1 + Seconds2,
calendar:gregorian_seconds_to_datetime(Sum).
这在所有情况下都有效,除了单个操作(无论如何代表您)之外,不需要解密任何内容或数学运算。您当然会注意到这里有机会抽出这两个功能的一个独特部分-但是,仅使用两个功能并不是真正需要这种DRY。嗯。
如果您想通过“参数列表友好”的方式来调用上面的方法:
add_time(Years, Months, Days, Hours, Minutes, Seconds, Target) ->
AddedTime = {{Years, Months, Days}, {Hours, Minutes, Seconds}},
add_datetime(AddedTime, Target).