development

DateTime "널"값

big-blog 2020. 4. 1. 08:02
반응형

DateTime "널"값


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


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

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

DateTime? MyNullableDate;

또는 더 긴 형태 :

Nullable<DateTime> MyNullableDate;

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

default(DateTime)

.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)를 참조하십시오.


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

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

다음과 같은 방식으로 작동

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

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


nullable types 사용을 고려할 것 입니다.

DateTime? myDate대신에 DateTime myDate.


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

DateTime? date = new DateTime?();

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

Nullable<DateTime> myDateTime;

또는 다음과 같이 작성하십시오.

DateTime? myDateTime;

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

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

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


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

DateTime? nullDate = null;

또는

DateTime? nullDate;

경고-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의 사용법은 아마도 가치가 있다고 생각합니다. 동의하지 않으면 죄송합니다.

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


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

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

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

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


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

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

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

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

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

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

날짜 / 시간 데이터 유형의 특성상 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 # 프로그래머 일 것입니다 :)

참고 URL : https://stackoverflow.com/questions/221732/datetime-null-value

반응형