2013-01-17 40 views
1

爲什麼您不允許將添加到std.datetime中的日期?您可以添加幾個月和幾年,但不能添加幾天。使用std.datetime將日期添加到日期

最近我不得不計算一個復活節的日期,然後我不得不計算相關的節假日(昇天,五旬節,三位一體,語料庫)通過添加一定天數(39,10,7,4)到最後日期。

我最終使用DAYOFYEAR:

date.dayOfYear(date.dayOfYear + offset); 

這個效果不錯,但僅僅是因爲我仍然在同一年度內。如果我必須增加50天,例如12月28日怎麼辦?

有沒有簡單的方法做到這一點,我忽略了?

+0

那裏曾經有一個函數int weekDay(d_time t);但現在不推薦使用http://dlang.org/phobos/std_date.html,您仍然可以通過解析它來使用它 –

回答

5

您可以使用Durationcore.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()是一個別名dur!"days"()它構建一個Duration結構。 查看core.timehttp://dlang.org/phobos/core_time.html的文檔以獲取更多信息。

+0

這比我發現的還要好。 – fwend

0

您可以使用roll方法:

date.roll!"days"(50); 
+1

滾動方法不會影響較大的單位,例如幾個月或幾年。 – fwend

+0

然後你可以使用'add'。不要問爲什麼有兩種方法。 – Hauleth

+0

「add」不接受天數爲單位 – fwend

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 
} 
+0

這將在技術上工作在幾天的情況下,但添加'持續時間'是它的工作原理。 –

3

如果您還沒有閱讀std.datetime上的this article,那麼您可能應該這樣做,因爲它可能會回答您關於如何使用它的大多數基本問題。

但總的來說,core.time.Duration是你應該用什麼在std.datetime(SysTimeDateTimeDate,或TimeOfDay)從任何時間點類型的加法和減法單位。所以,你會得到這樣的代碼

auto date = Date(2012, 12, 21); 
date += dur!"days"(50); 

auto date = Date(2012, 12, 21); 
date += days(50); 

(模板化dur功能是生成一個Duration通用的方式,但它的別名爲每個支持的單位,這樣的東西像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)); 

不像addroll接受所有單位的類型,而不是僅僅"months""years",但這是因爲它是從+做不同的操作,所以加上或減去Duration將無法​​正常工作(如已經增加或減少)。而不是roll增加到一個特定的單位,而不增加其他。

auto d = Date(2010, 1, 1); 
d.roll!"days"(33); 
assert(d == Date(2010, 1, 3));