如果您尚未阅读有关 std.datetime 的这篇文章,那么您可能应该阅读,因为它可能会回答您对如何使用它的最基本问题。
但总的来说,core.time.Duration
您应该使用 std.datetime ( SysTime
、DateTime
、Date
或TimeOfDay
) 中的任何时间点类型来添加和减去单位。所以,你会得到类似的代码
auto date = Date(2012, 12, 21);
date += dur!"days"(50);
或者
auto date = Date(2012, 12, 21);
date += days(50);
(模板化dur
函数是生成 a 的通用方法Duration
,但它为它支持的每个单元都有别名,所以类似seconds(5)
or的东西也22.minutes()
可以工作)。
该add
函数存在于"months"
and "years"
,因为 aDuration
不能保存月或年(因为您无法在没有特定日期的情况下在它们和较小的单位之间进行转换),并且需要有一种方法可以将月或年添加到时间点。此外,还有一个问题是,当您从某个日期添加或减去一个月或一年时该怎么做,并且它移动到的月份不包括那一天,因此add
接受AllowDayOverflow
以控制它(这不会对于较小的单位是必要的)。
auto d3 = Date(2000, 2, 29);
d3.add!"years"(1);
assert(d3 == Date(2001, 3, 1));
auto d4 = Date(2000, 2, 29);
d4.add!"years"(1, AllowDayOverflow.no);
assert(d4 == Date(2001, 2, 28));
但add
不接受任何其他单位,因为您可以简单地将普通算术运算与Duration
. 此外,减去两个时间点将导致Duration
.
assert(Date(2012, 12, 5) - Date(2002, 11, 17) == dur!"days"(3671));
assert(Date(2012, 12, 5) - dur!"days"(3671) == Date(2002, 11, 17));
与add
, 不同的是,roll
接受类型中的所有单位,而不仅仅是"months"
and "years"
,但那是因为它执行与 不同的操作+
,因此添加或减去 aDuration
将不起作用(因为它已经添加或减去)。而是roll
添加到特定单元而不添加到其他单元。
auto d = Date(2010, 1, 1);
d.roll!"days"(33);
assert(d == Date(2010, 1, 3));