按秒递增日期时间
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 值很有用,因为这些值没有定义的秒数。
我正在尝试获取日期字符串,例如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 值很有用,因为这些值没有定义的秒数。