2013-01-17 2 views
1

을 std.datetime의 날짜에 추가 할 수없는 이유는 무엇입니까? 월과 년을 추가 할 수 있지만 일은 추가 할 수 없습니다.std.datetime을 사용하여 요일 추가하기

최근 부활절 주일 날짜를 계산해야했는데, 마지막 날 (39, 10, 7, 4)을 추가하여 관련 휴일 (승천, 오순절, 삼위 일체, 코퍼스)을 계산해야했습니다. 날짜.

나는 DAYOFYEAR를 사용하여 종료 :

date.dayOfYear(date.dayOfYear + offset); 

이것은 잘 작동하지만 때문에 같은 해 안에 남아 있었다. dec 28에 50 일을 추가해야한다면 어떻게 될까요?

내가 간과 한이 작업을 수행하는 쉬운 방법이 있습니까?

+0

거기에는 함수 int가 있어야합니다. weekDay (d_time t); 하지만 지금은 더 이상 사용되지 않습니다 http://dlang.org/phobos/std_date.html 당신은 여전히 ​​그것을 파싱하여 생각할 수 있습니다. –

답변

5

당신은 core.time에서 Duration를 사용할 수 있습니다. 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()Duration 구조체를 구성 dur!"days"() 별칭이다. 자세한 내용은 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

그것은 며칠의 경우 기술적으로 작동하지만'Duration '을 추가하는 것은 작동하는 방법입니다. –

3

std.datetime에 this article을 아직 읽지 않았다면 아마도 사용법에 대한 기본적인 질문에 대한 대답 일 것입니다.

그러나 일반적으로

, 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 함수는 Duration를 생성하는 일반적인 방법이지만, 그것을 지원하는 각 유닛에 대한 별명이 그렇게 물건과 같은 코드 seconds(5) 또는 22.minutes()처럼 작동합니다.)

add 기능 (특정 날짜없이 그들과 작은 단위 사이의 변환을 할 수 없기 때문에)을 Duration이 달 또는 몇 년을 보유 할 수 없기 때문에, "months""years"을 위해 존재하고 추가 할 수있는 방법이있을 필요가있다 몇 달 또는 몇 해를 한 시점으로 또한 한 달 또는 한 달을 날짜에 더하거나 뺄 때해야 할 일의 질문이 있습니다. 이동하는 달에는 해당 날짜가 포함되지 않으므로 add은이를 제어하기 위해 을 허용합니다. 더 작은 단위들과 함께 필요함).당신은 단순히 Duration와 일반 산술 연산을 사용할 수 있기 때문에

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이됩니다. (같은

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""years"보다 종류의 유닛을 모두 수용하지만 +에서 다른 작업을하고, 그래서 추가하거나 Duration 작동하지 않습니다 뺀 있기 때문에 그건 이미 더하기 또는 빼기). 오히려 roll은 다른 유닛에 추가하지 않고 특정 유닛에 추가됩니다.

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