如何将 xx 秒、分钟或小时添加到日期时间结构?



我想向现有的DateTime值添加一段时间(以{{Y,M,D},{H,m,s}}格式(,但没有看到允许我直接操作DateTime值的函数(例如在Calendar模块中(。

如何向此类值添加(例如(10 秒、10 分钟或 10 小时?

您可以使用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).

您也可以使用特殊的时间管理库,例如 qdate。

示例用法,添加年、月和分钟,并删除 3 天和 5 小时。

NewDate = qdate:add_date({{1, 2, -3}, {-5, 1, 0}}, {{2018, 8, 16}, {11, 0, 1}}).

如果要接受两个日期时间结构并从第一个结构中减去第二个,则转换为公历秒,执行减法,然后重新转换是最常见的方法:

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).

最新更新