2008-10-21 4 views
216

많은 검색을 해왔지만 해결책을 찾지 못했습니다. 초기화되지 않은 값 (null과 동등)을 포함 할 수 있어야하는 DateTime은 어떻게 처리합니까? DateTime 속성 값이 설정되어 있거나 설정되어 있지 않은 클래스가 있습니다. 나는 그때 쉽게 점검 할 수있는 DateTime.MinValue에 대한 속성 홀더를 초기화하려고 생각하고있었습니다. 나는 이것이 아주 일반적인 질문이라고 생각합니다. 어떻게합니까?DateTime "null"값

답변

332

정상적인 DateTimes의 경우 아무 것도 초기화하지 않으면 참조 유형이 아닌 값 유형이므로 DateTime.MinValue과 일치합니다.

DateTime? MyNullableDate; 

또는 더 긴 형태 :

또한이 같은 널 (NULL) 날짜 시간 사용할 수 있습니다

Nullable<DateTime> MyNullableDate; 

그리고를, 마지막으로, 모든 종류의 기본을 참조하는 방식으로 지어있다 . 이 참조 유형에 대한 null 반환하지만 우리의 날짜 시간, 예를 들어이 DateTime.MinValue 같은를 반환합니다

default(DateTime) 
+7

그것은 크게하면 도움이 될 것이다 : 나는 ArgumentNullException.It 다음과 같은 옵션을 사용하여 내 경우에는 근무 예외에 대한 단위 테스트를 수행하는 동안 날짜 시간에 대한 매개 변수로 널 포기했다으로 –

+6

그것들을 초기화하고 null을 사용하면, 그것들은 별개의 질문처럼 보이는 – jlafay

+1

@ kirk.burleson처럼'DateTime.MinValue'라는 값을 할당 받음을 기억하십시오. – CompuChip

10

나는 nullable types을 사용하는 것이 좋습니다 것입니다.

DateTime? myDate 대신 DateTime myDate입니다.

71

당신이 (또는 이상) .NET 2.0을 사용하고 당신이 nullable 형식 사용할 수있는 경우 : 당신

dt = new DateTime(); 

: 그리고 이후 다음

DateTime? dt = null; 

또는

Nullable<DateTime> dt = null; 

을 값을 확인할 수 있습니다 :

if (dt.HasValue) 
{ 
    // Do something with dt.Value 
} 

또는 당신이 그것을 좋아 사용할 수 있습니다

DateTime dt2 = dt ?? DateTime.MinValue; 

당신은 여기에서 더 읽을 수 있습니다
http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx

+1

이전 버전의 .NET에서도 null 가능 유형을 사용할 수 있으며 3.0은 필요하지 않습니다. – stephenbayer

+1

Typo, 업데이트했습니다. –

+1

.NET 2.0에서 제공됩니까? ? 구문은 3.5에서 VB.NET에 추가되었지만 2.0에서 C#으로 변경되었습니다. –

5

당신은 널 (NULL) 클래스를 사용할 수 있습니다.

DateTime? date = new DateTime?(); 
5

nullable DateTime을 사용할 수 있습니다.

Nullable<DateTime> myDateTime; 

또는 다음과 같이 작성 같은 일 : 난 항상 DateTime.MinValue에 시간을 설정

DateTime? myDateTime; 
5

. 이 방법은 어떤 NullErrorException도 얻지 못한다. 그리고 내가 알고있는 날짜와 비교할 수있다.

+8

즉, "여기에 DateTime이 정말로 필요합니다"와 "선택 사항입니다"의 차이점을 알 수 없다는 뜻입니다. Nullable 은 IMO보다 훨씬 좋은 해결책입니다. –

+0

? 나는 정말로 당신의 코멘트를 얻지 않는다. 그래, 나는 DateTime이 지금까지 현실의 진실성이 널 (null)이었던 것과 같을 때를 알고있다 ... –

+0

나는 다른 해결책을 제안하고있다. 이미 10 번 제안 된 것을 반복하는 대신 –

4

DateTime을 Nullable로 설정할 수 있습니다. 기본적으로 DateTime은 null을 허용하지 않습니다. 몇 가지 방법으로 nullable로 만들 수 있습니다. DateTime 유형 뒤에 물음표 사용? myTime 또는 일반 스타일 Nullable을 사용합니다. msdn에 몇 개의 링크를 추가했습니다.

Using Nullable

Nullable

20

날짜 시간 ? MyDateTime는 {얻을; 설정;}

MyDateTime = (drOrder["Field1"] == DBNull.Value) ? (DateTime?)null : ((DateTime)drOrder["Field1"]); 
1

당신이 경우, 때때로이 같은 것을 사용할 수 있습니다 널 기대 :

var orderResults = Repository.GetOrders(id, (DateTime?)model.DateFrom, (DateTime?)model.DateTo) 

를 저장소 사용 널 수 날짜에.

public Orders[] GetOrders(string id, DateTime? dateFrom, DateTime? dateTo){...} 
5

이 컴파일러 오류없이 DateTime 변수가 null 할 수는 없지만, 그것은 여전히 ​​null 비교 될 수 있다는 지적 가치가있다 :

DateTime date; 
... 
if(date == null) // <-- will never be 'true' 
    ... 
3

그냥 경고 - Null 허용을 사용하는 경우는 분명히 더 이상 '순수한'datetime 객체가 아니기 때문에 DateTime 멤버에 직접 액세스 할 수 없습니다. 나는 설명하려고 노력할 것이다.

Nullable <을 사용하면 기본적으로 컨테이너에 DateTime을 래핑합니다 (제네릭을 고맙습니다). nullable은 분명히 그 용도입니다. 이 컨테이너에는 위에서 언급 한 DateTime 객체에 대한 액세스를 제공 할 수있는 자체 속성이 있습니다. 올바른 속성 -이 경우 Nullable.Value -을 사용하면 표준 DateTime 멤버, 속성 등에 액세스 할 수 있습니다.

이제는 DateTime 객체에 액세스하는 가장 좋은 방법에 대해 염두에 두어야합니다. 몇 가지 방법이 있습니다. 1 번은 FAR이 가장 좋고 2 번은 "왜 그런가"입니다.

  1. Nullable.Value 속성을 사용

    ,

    DateTime date = myNullableObject.Value.ToUniversalTime(); //Works

    DateTime date = myNullableObject.ToUniversalTime(); //Not a datetime object, fails

  2. Convert.ToDateTime()을 사용하여 날짜에 널 객체 변환,

    DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //works but why...

답변은이 시점에서 잘 설명되어 있지만, Nullable의 사용법은 게시 가치가 있다고 생각합니다. 동의하지 않으면 죄송합니다.

편집 : 약간 지나치게 구체적이고 대소 문자를 구별 했으므로 세 번째 옵션을 삭제했습니다.

2

모두가 이미 당신에게 대답을 제공했지만, 내가 함수에

[ERROR를 날짜 시간을 통과하기 쉽게 만드는 방법을 언급합니다 : system.datetime을 변환 할 수 있습니까? ] system.datetime하는

DateTime? dt = null; 
DateTime dte = Convert.ToDateTime(dt); 

지금 당신은 어떤 문제없이 함수 내에서 DTE를 전달할 수 있습니다.

-1

날짜/시간 데이터 유형의 성격을 감안할 때 null 값을 포함 할 수 없습니다. 즉, 값을 포함해야하며 비워 둘 수 없으며 아무 것도 포함 할 수 없습니다. 날짜/시간 변수를 nullable으로 표시하면 null 값만 할당 할 수 있습니다. 그래서 당신이 찾고있는 것은 두 가지 중 하나입니다 (이있을 수 있습니다 더 그러나 나는 두 생각할 수) : 당신이없는 경우

  • 이 변수에 최소 날짜/시간 값을 할당 그것을위한 가치. 당신에게 가장 적합한 날짜/시간 값을 지정할 수 있습니다. 날짜/시간 값을 확인할 때 사이트 전체에서 일관성이 있는지 확인하십시오. min 또는 max을 사용하기로 결정하고 붙어 있습니다.

  • 날짜/시간 변수를 nullable으로 표시하십시오. 이렇게하면 변수가없는 경우 날짜/시간 변수를 null으로 설정할 수 있습니다.

예제를 사용하여 첫 번째 요점을 설명해 드리겠습니다. DateTime 변수 유형을 null로 설정할 수 없으므로 값이 필요합니다.이 경우 값이없는 경우이 값을 DateTime의 최소값으로 설정하려고합니다.

내 시나리오는 BlogPost 클래스입니다. 그것은 여러 가지 필드/속성을 가지고 있지만이 예제에서는 두 가지만 사용하도록 선택했습니다. DatePublished은 게시물이 웹 사이트에 게시되고 날짜/시간 값을 포함해야하는 경우입니다. DateModified은 게시물이 수정되어 값을 포함 할 필요가 없지만 값을 포함 할 수 있습니다. 데이터베이스에서 데이터를 얻을 수 ADO.NET를 사용

public class BlogPost : Entity 
{ 
    public DateTime DateModified { get; set; } 

    public DateTime DatePublished { get; set; } 
} 

(DateTime.MinValue를 할당은 값이없는 것입니다) :

BlogPost blogPost = new BlogPost(); 
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? DateTime.MinValue : sqlDataReader.GetFieldValue<DateTime>(0); 
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1); 

당신은 nullableDateModified 필드를 표시하여 내 두 번째 점을 수행 할 수 있습니다. 그것에 대한 값이없는 경우 이제 null으로 설정할 수 있습니다 :

public DateTime? DateModified { get; set; } 

는 데이터베이스에서 데이터를 얻을 수 ADO.NET를 사용하여, 그것은 그것 위에서 이루어졌다 방식과 다른 조금을 볼 것이다 (대신 null을 할당 DateTime.MinValue) :

BlogPost blogPost = new BlogPost(); 
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? (DateTime?)null : sqlDataReader.GetFieldValue<DateTime>(0); 
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1); 

나는이 혼란을 정리하는 데 도움이되기를 바랍니다. 내 대답은 약 8 년 후에는 지금 :

7

아마뿐만 아니라

myClass.PublishDate = toPublish ? DateTime.Now : (DateTime?)null; 

그 속성 PublishDate이 날짜 시간이어야한다주의 작업을 그런 식으로 전문가의 C# 프로그래머임을 감안할 때?

Assert.Throws<ArgumentNullException>(()=>sut.StartingDate = DateTime.Parse(null)); 
1

나는 같은 문제가 있었다 그것을 사용하는 방법의 예를 제공하십시오. DBNull 일 수있는 데이터베이스의 DateTime을 nullable DateTime에 어떻게 할당합니까?