按秒递增日期时间

Incrementing datetime by second

我正在尝试获取日期字符串,例如2020-03-04 06:22:59.012315131 并将其增加一秒,使其变为 2020-03-04 06:23:00。 ms 结束部分无关紧要。

使用 date 库我已经能够成功地以分钟为单位增加时间。

:- use_module(library(date)).

get_dt(Datestring, Y, M, D, H, Mn, S, X) :-
    parse_time(Datestring, Stamp1),
    stamp_date_time(Stamp1, DateTime1, 'UTC'),
    DateTime1 = date(Y1, M1, D1, H1, Mn1, S1, _, _, _),
    Mn2 is Mn1 + X,
    date_time_stamp(date(Y1, M1, D1, H1, Mn2, S1, _, _, _), Stamp2),
    stamp_date_time(Stamp2, DateTime2, 'UTC'),
    DateTime2 = date(Y, M, D, H, Mn, S, _, _, _).

当运行以下时,它成功地将时间增加到下一个小时,例如第 6 小时到第 7 小时并将分钟值从 22 重置为 0。这只是将 38 添加到 Mn 值。

?- get_dt('2020-03-04 06:22:59.012315131', Y, M, D, H, Mn, S, 38).
Y = 2020,
M = 3,
D = 4,
H = 7,
Mn = 0,
S = 59.012315034.

我正在尝试用秒而不是分钟做同样的事情,并将 59 的秒的值增加 1 到 60,这样分钟的值就会增加 1。但是,当将秒增加1 所以分钟必须增加,因为秒现在是 60,它将分钟从 22 增加 2 到 24。我不明白为什么。

:- use_module(library(date)).

get_dt(Datestring, Y, M, D, H, Mn, S, X) :-
    parse_time(Datestring, Stamp1),
    stamp_date_time(Stamp1, DateTime1, 'UTC'),
    DateTime1 = date(Y1, M1, D1, H1, Mn1, S1, _, _, _),
    S2 is S1 + X,
    date_time_stamp(date(Y1, M1, D1, H1, Mn1, S2, _, _, _), Stamp2),
    stamp_date_time(Stamp2, DateTime2, 'UTC'),
    DateTime2 = date(Y, M, D, H, Mn, S, _, _, _).
?- get_dt('2020-03-04 06:22:59.012315131', Y, M, D, H, Mn, S, 1).
Y = 2020,
M = 3,
D = 4,
H = 6,
Mn = 24,
S = 0.012315034.

编辑:上面的最后一个例子应该显示 23 的 Mn 值,或者我认为无论如何都应该如此。

谢谢

我使用 Dealing with date in prolog

找到了另一个更清洁的解决方案

我仍然想知道为什么我以前的代码不起作用。

get_dt(Datestring, Y, M, D, H, Mn, S, X) :-
    parse_time(Datestring, Stamp),
    Stamp1 is Stamp + X,
    stamp_date_time(Stamp1, DateTime, 'UTC'),
    DateTime = date(Y, M, D, H, Mn, S, _, _, _).

复制自Discourse

不知道为什么,但如果你真的传递了时区信息,它工作正常:

:- use_module(library(date)).

get_dt(Datestring, Y, M, D, H, Mn, S, X) :-
    parse_time(Datestring, Stamp1),
    stamp_date_time(Stamp1, DateTime1, 'UTC'),
    DateTime1 = date(Y1, M1, D1, H1, Mn1, S1, Off, TZ, DST),
    S2 is S1 + X,
    date_time_stamp(date(Y1, M1, D1, H1, Mn1, S2, Off, TZ, DST), Stamp2),
    stamp_date_time(Stamp2, DateTime2, 'UTC'),
    DateTime2 = date(Y, M, D, H, Mn, S, _, _, _).
?- get_dt('2020-03-04 06:22:59.012315131', Y, M, D, H, Mn, S, 1).
Y = 2020,
M = 3,
D = 4,
H = 6,
Mn = 23,
S = 0.012315034.

传递当然是个好主意。恐怕我现在没有时间弄清楚如果你传递变量到底会发生什么。

当然,如果你想计算第二个偏移量,那么根据时间戳这样做会容易得多。如果您想按月或年更改日期,时间戳的 non-normalized 值很有用,因为这些值没有定义的秒数。