为什么不允许将天添加到std.datetime中的日期?您可以添加月份和年份,但不能添加天数。
最近我必须计算复活节星期日的日期,然后我必须通过在最后日期添加一定天数(39,10,7,4)来计算相关假期(阿森松岛,五旬节,三位一体,语料库)
我最终使用dayOfYear:
date.dayOfYear(date.dayOfYear + offset);
这很好用,但仅仅因为我在同一年内。如果我要在50年代增加50天怎么办?
有没有一种简单的方法可以做到这一点我忽略了?
答案 0 :(得分:5)
您可以使用Duration
中的core.time
。
导入std.datetime
将导入core.time
,因此您可以直接使用它,如下所示。
import std.stdio, std.datetime;
void main() {
auto date = Date(2013, 12, 28);
writefln("%s + %s = %s", date, 10.days(), date + 10.days());
}
BTW,days()
是构造dur!"days"()
结构的Duration
的别名。
有关详细信息,请查看core.time
http://dlang.org/phobos/core_time.html的文档。
答案 1 :(得分:3)
如果你还没有在std.datetime上阅读this article,那么你可能应该这样做,因为它可能会回答你对如何使用它的大多数基本问题。
但一般情况下,core.time.Duration
是您应该用于在std.datetime(SysTime
,DateTime
,{{1}中添加和减去任何时间点类型的单位的内容},或Date
)。所以,你得到像
TimeOfDay
或
auto date = Date(2012, 12, 21);
date += dur!"days"(50);
(模板auto date = Date(2012, 12, 21);
date += days(50);
函数是生成dur
的通用方法,但它为每个支持的单位都有别名,所以像Duration
或{{1也会起作用。)
seconds(5)
和22.minutes()
存在add
函数,因为"months"
无法保持数月或数年(因为您无法在它们和较小的单位之间进行转换)没有具体日期),需要有一种方法可以在一个时间点上添加数月或数年。此外,还有一个问题是当您在某个日期添加或减去一个月或一年时该怎么做,而且它移动到的月份不包括那一天,因此"years"
接受Duration
为了控制它(对于较小的单位不需要)。
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
,但那是因为它正在执行与{{1}不同的操作因此添加或减去"months"
将不起作用(因为已经添加或减去)。而是"years"
添加到特定单位而不添加其他单位。
+
答案 2 :(得分:0)
您可以使用roll
方法:
date.roll!"days"(50);
答案 3 :(得分:0)
我确实忽略了它:你可以使用dayOfGregorianCal:
import std.stdio, std.datetime;
void main() {
auto d = Date(2012, 12, 28);
writeln(d); // 2012-Dec-28
d.dayOfGregorianCal(d.dayOfGregorianCal + 50);
writeln(d); // 2013-Feb-16
}