DateTime "널"값


273

많이 검색했지만 해결책을 찾지 못했습니다. 초기화되지 않은 값 (null에 해당)을 포함 할 수있는 DateTime을 어떻게 처리합니까? DateTime 속성 값이 설정되었거나 설정되지 않은 클래스가 있습니다. 속성 홀더를 DateTime.MinValue로 초기화하여 쉽게 확인할 수 있다고 생각했습니다. 나는 이것이 매우 일반적인 질문이라고 생각합니다. 어떻게합니까?

답변:


420

일반적인 DateTimes의 경우 초기화하지 않으면 DateTime.MinValue참조 유형이 아닌 값 유형이기 때문에 일치 합니다.

다음과 같이 nullable DateTime을 사용할 수도 있습니다.

DateTime? MyNullableDate;

또는 더 긴 형태 :

Nullable<DateTime> MyNullableDate;

마지막으로 모든 유형의 기본값을 참조하는 내장 된 방법이 있습니다. 이것은 null참조 유형을 반환 하지만 DateTime 예제에서는 다음과 동일을 반환합니다 DateTime.MinValue.

default(DateTime)

또는 최신 버전의 C #에서는

default

8
사용 방법의 예를 제공하면 크게 도움이 될 것입니다. 데이터베이스의 DateTime (DBNull 일 수 있음)을 nullable DateTime에 어떻게 할당합니까?
kirk.burleson

9
당신이 그들과 null를 초기화 할 때, 그들은이 할당되어 있는지 또한 주에 좋은 DateTime.MinValue아니라
제프 LaFay에게

2
별도의 질문처럼 보이는 @ kirk.burleson.
CompuChip

당신은 MyNullableDate=date; 그것을 설정하고, 그것을 MyDate = MyNullableDate.Value;읽고, if(MyNullableDate.HasValue)널인지 확인해야합니다
satibel

응답의 "최종"비트를 명확하게하기 위해 Nullable <T>이 참조 유형을 생성하므로 Nullable <DateTime> (DateTime?)의 기본값은 null입니다.
ryanwebjackson

88

.NET 2.0 이상을 사용하는 경우 널 입력 가능 유형을 사용할 수 있습니다.

DateTime? dt = null;

또는

Nullable<DateTime> dt = null;

나중에 :

dt = new DateTime();

그리고 당신은 값을 확인할 수 있습니다 :

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

또는 다음과 같이 사용할 수 있습니다.

DateTime dt2 = dt ?? DateTime.MinValue;

자세한 내용은 여기 ( http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx)를 참조하십시오.


1
3.0 이전 버전의 .NET에서도 널 입력 가능 유형을 사용할 수 있습니다.
stephenbayer

1
.NET 2.0으로 제공 되었습니까? ? 구문은 VB.NET에 3.5로 추가되었지만 2.0 이후로 C #에 있습니다.
David Mohundro

1
널 입력 가능 유형은 .Net 2.0에서 사용 가능합니다. C #에 속기가 있습니까? 2.0의 표기법. VB.Net 만 약식이 없었습니까? 2.0에서는 Nullable (Of DateTime)
Mendelt

마지막 스 니펫의 경우 DateTime dt2 = dt ?? DateTime.MinValue;
Joel Coehoorn

내가 사용하는 것 dt.GetValueOrDefault()- 그것이 가장 효율적인 옵션들 중 하나입니다.
CompuChip

37

날짜 시간? MyDateTime {get; set;}

MyDateTime = (dr["f1"] == DBNull.Value) ? (DateTime?)null : ((DateTime)dr["f1"]);

1
이것은 통과 null가 작동하지 않는 것을 발견하는 데 도움이되었습니다 . 이어야 (DateTime?)null합니다.
Inphinite Phractals

33

다음과 같은 방식으로 작동

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

PublishDate 속성은 DateTime이어야합니까?



8

DateTime변수가 될 수는 없지만 컴파일러 오류없이 null비교할 수 있음을 지적 할 가치가 있습니다 null.

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

6

널 입력 가능 클래스를 사용할 수 있습니다.

DateTime? date = new DateTime?();

널이 아닌 인스턴스를 인스턴스화하는 것과 다른 동작을 제공한다는 점에 주목할 가치가 DateTime있습니다. 앞서 언급 한 바와 같이, new DateTime()효과적으로 줄 것입니다 DateTime.Min반면에 new DateTime?()널 (null)가 발생합니다.
Vitoc

6

이를 위해 널 입력 가능 DateTime을 사용할 수 있습니다.

Nullable<DateTime> myDateTime;

또는 다음과 같이 작성된 것 :

DateTime? myDateTime;

6

DateTime을 Nullable로 설정할 수 있습니다. 기본적으로 DateTime은 널 입력 가능하지 않습니다. 몇 가지 방법으로 Null을 허용 할 수 있습니다. DateTime 유형 뒤에 물음표를 사용합니까? myTime 또는 일반 스타일 Nullable을 사용합니다.

DateTime? nullDate = null;

또는

DateTime? nullDate;

5

나는 항상 시간을로 설정했다 DateTime.MinValue. 이 방법으로 NullErrorException이 발생하지 않으며 설정되지 않은 날짜와 비교할 수 있습니다.


8
즉, "실제로 DateTime이 필요합니다"와 "선택적입니다"의 차이점을 알 수 없습니다. Nullable <DateTime>이 훨씬 더 나은 솔루션 인 IMO입니다.
Jon Skeet

? 나는 당신의 의견을 정말로 얻지 못합니다. 예, DateTime이 현실에서 멀어 질 때 그것이 null 인 경우와 같습니다 ...
Patrick Desjardins

2
편리하지만 DateTime.MinValue는 특별한 경우가 아니라 값으로 간주합니다. 그것은 단지 라인 다운 문제를 일으킬 수 있습니다. Nullable <DateTime>을 사용하겠습니다.
spoulson

3
나는 당신이 내 대답에 대해 뭔가를 놓쳤다 고 생각합니다. Spoulson은 무언가를 썼고 대답했습니다. 공개 회원에 관해서는, 그것은 동일하지 않으며 그것을 알고 있습니다. String.Empty 또는 null과 같습니다. null이 잘못되어 String.Empty가 더 좋기 때문에 두 가지를 모두 수행 할 수 있습니다. 뭐야
Patrick Desjardins

1
저는 Daok과 함께 있습니다. "책에 의한"접근 방식은 아니지만 NullReferenceException을 얻거나 성가신 Nullable 유형을 처리하는 것보다 낫습니다. 게다가 AD 1 월 1 일 날짜를 실제로 참조해야하는 응용 프로그램은 몇 개입니까?
Jacobs Data Solutions

4

경고-Nullable을 사용할 때 분명히 더 이상 '순수한'날짜 시간 객체가 아니므로 DateTime 멤버에 직접 액세스 할 수 없습니다. 시도하고 설명하겠습니다.

Nullable <>을 사용하면 기본적으로 DateTime을 컨테이너에 넣을 수 있습니다 (일반적으로 감사합니다). 이 컨테이너에는 위에서 언급 한 DateTime 객체에 대한 액세스를 제공하는 호출 할 수있는 자체 속성이 있습니다. 올바른 속성 (이 경우 Nullable.Value)을 사용한 후 표준 DateTime 멤버, 속성 등에 액세스 할 수 있습니다.

이제 DateTime 객체에 액세스하는 가장 좋은 방법에 대한 문제가 해결되었습니다. 몇 가지 방법이 있습니다. 1 번은 FAR이 가장 좋고 2 번은 "dude why"입니다.

  1. Nullable.Value 속성을 사용하면

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

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

  2. Convert.ToDateTime ()을 사용하여 nullable 객체를 datetime으로 변환

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

이 시점에서 답변이 잘 문서화되어 있지만 Nullable의 사용법은 아마도 가치가 있다고 생각합니다. 동의하지 않으면 죄송합니다.

편집 : 세 번째 옵션이 약간 구체적이고 대소 문자에 따라 제거되었습니다.


2

모두가 이미 답변을 주었지만 날짜 시간을 함수에 쉽게 전달할 수있는 방법을 언급하겠습니다.

[오류 : system.datetime을 변환 할 수 없습니까? system.datetime으로]

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

이제 아무런 문제없이 함수 내부에 dte를 전달할 수 있습니다.


1

때로는 null을 기대하는 경우 다음과 같이 사용할 수 있습니다.

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

저장소에서 널 가능 날짜 시간을 사용하십시오.

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

1

Throws ArgumentNullException에 대한 단위 테스트를 수행하는 동안 Null을 DateTime의 매개 변수로 제공 해야하는 것과 동일한 문제가 발생했습니다. 내 경우에는 다음 옵션을 사용하여 작동했습니다.

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

0

날짜 / 시간 데이터 유형의 특성상 null값을 포함 할 수 없습니다 ( 예 : 값을 포함해야 함). 공백이거나 아무 것도 포함 할 수 없습니다. 날짜 / 시간 변수를로 표시하면 nullable널값 만 지정할 수 있습니다. 그래서 당신이 찾고있는 것은 두 가지 중 하나입니다 (더 많을 수도 있지만 두 가지만 생각할 수 있습니다).

  • 값이 없으면 변수에 최소 날짜 / 시간 값을 지정하십시오. 최대 날짜 / 시간 값도 지정할 수 있습니다. 날짜 / 시간 값을 확인할 때 사이트 전체의 일관성을 유지하십시오. min또는 사용을 결정 max하고 그것에 충실하십시오.

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

예제를 사용하여 첫 번째 요점을 보여 드리겠습니다. DateTime변수의 유형은 내가로 설정하기 위하여려고하고,이 경우, 값을 필요 null로 설정할 수 없습니다 DateTime값이없는 경우의 최소 값입니다.

내 시나리오는 BlogPost수업 이 있다는 것 입니다. 많은 다른 필드 / 속성이 있지만이 예제에서는 두 개만 사용하기로 선택했습니다. DatePublished게시물이 웹 사이트에 게시되고 날짜 / 시간 값을 포함해야하는 시점입니다. DateModified게시물을 수정할 때이므로 값을 포함 할 필요는 없지만 값을 포함 할 수 있습니다.

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

     public DateTime DatePublished { get; set; }
}

ADO.NET데이터베이스에서 데이터를 가져 오는 데 사용 ( DateTime.MinValue값이 없음) :

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

DateModified필드를로 표시하여 두 번째 포인트를 달성 할 수 있습니다 nullable. 이제 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 년 후에 주어진다면 아마도 C # 프로그래머 일 것입니다 :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.