2009-08-20 5 views
1

한 번에 한 번에 C#으로 한 번에 DateTime을 구성하려고합니다. 전체 날짜가 생성자에없는 것입니다. 나는 무엇이 잘못되었는지 이해하지 못합니다. 그 d.Years한 번에 한 단계 씩 DateTime 만들기

DateTime d = new DateTime((long)0); 
d.AddYears(2000); 

그래도 여전히 1과 동일 할 것이다. 또한 날짜를 long으로 저장해야합니다. 그래서 저는 거대한 생성자로 날짜를 만들 수 없으며 지속되는 DateTime 인스턴스를 가질 수 없으므로 장시간 덤프 한 다음 복원하고 다시 0의 값으로 시작합니다. 제로와 다른 값으로 시작한다고 생각합니까?

정확히 무엇이 잘못 되었나요?

답변

16

DateTime 구조는 변경할 수 없으므로 속성을 변경할 수 없습니다.

AddYears 방법을 사용합니다 새로운 날짜 시간을 반환

날짜 시간 생성자에 대한 12 가지 오버로드가 있습니다
DateTime d = new DateTime((long)0); 
d = d.AddYears(2000); 
+0

+1 불변의 설명입니다. –

1

. 적어도 하나는 당신이 당신의 사용에 적응할 수 있어야합니다.

이 :

DateTime d = new DateTime((long)0); 
d = d.AddYears(2000); 

그냥 당신이 앞에 넣어 다른 매개 변수에 대한 제로에서 할 수있는 날짜를 기준으로 많이 구성 :

DateTime d = new DateTime(2000,0,0); 

는보다 낫다.

+0

나는 그것이 만들어 질 때 전체 datetime을 모른다. 그래서 실패 할 것이다. (페이지 업데이트를 통해 생성됩니다.) – Earlz

+0

당신은 요점을 놓쳤습니다 : 당신은 그 당시에 알고있는만큼 사용하고 다른 곳에서는 0을 넣습니다. –

2

주제가 아닐 수도 있지만 DateTimelong으로 유지해야하는 경우 Ticks 속성에 의해 반환 된 값을 유지하지 않는 것이 좋습니다.

그런 다음 the constructor that takes a ticks parameter를 사용하여 DateTime 인스턴스를 복원 할 수 있습니다

// stage 1 
DateTime dt = DateTime.MinValue.AddYears(2009); 
PersistTicksToSomewhere(dt.Ticks); 

// stage 2 
long ticks = GetPersistedTicksFromSomewhere(); 
DateTime dt = new DateTime(ticks).AddMonths(8); 
PersistTicksToSomewhere(dt.Ticks); 

// stage 3 
long ticks = GetPersistedTicksFromSomewhere(); 
DateTime dt = new DateTime(ticks).AddDays(20); 
PersistTicksToSomewhere(dt.Ticks); 

// etc etc 
+0

'DateTimeKind'를 보존하는 것이 중요하다면 틱 대신에'ToBinary'와'FromBinary' 메소드를 사용할 수도 있습니다. – LukeH

0

날짜 시간은 불변 당신이 그것을 변경해야하므로 그래서 DateTime d = new DateTime(); d d.AddYears(2000);

그러나이 시간의 새로운 날짜 시간 99.9 %의 인스턴스를 괜찮아요. 그러나 반복적으로 실행되는 루프에 중첩 된 경우 많은 DateTime 생성자 중 하나를 사용하는 것이 좋습니다. 문자열 및 StringBuilder와 동일한 규칙을 사용하십시오.

관련 문제