1

为什么不允许在 std.datetime 中为日期添加天数?您可以添加月份和年份,但不能添加天数。

最近我必须计算复活节星期日的日期,然后我必须通过在最后一个日期上加上一定天数(39、10、7、4)来计算相关的假期(升天、五旬节、三位一体、语料库)。

我最终使用了 dayOfYear:

date.dayOfYear(date.dayOfYear + offset);

这很有效,但这只是因为我留在了同一年。如果我必须在 12 月 28 日加上 50 天怎么办?

有没有一种我忽略的简单方法?

4

4 回答 4

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());
}

顺便说一句,是构造结构days()的别名。查看http://dlang.org/phobos/core_time.html的文档以获取更多信息。dur!"days"()Durationcore.time

于 2013-01-17T16:41:28.463 回答
3

如果您尚未阅读有关 std.datetime 的这篇文章,那么您可能应该阅读,因为它可能会回答您对如何使用它的最基本问题。

但总的来说,core.time.Duration您应该使用 std.datetime ( SysTimeDateTimeDateTimeOfDay) 中的任何时间点类型来添加和减去单位。所以,你会得到类似的代码

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));
于 2013-01-17T17:58:16.280 回答
0

您可以使用roll方法:

date.roll!"days"(50);
于 2013-01-17T12:30:01.407 回答
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
}
于 2013-01-17T12:41:06.653 回答