문제

나는 많이 검색했지만 해결책을 찾을 수 없었습니다. 초기화되지 않은 값 (NULL에 해당)을 포함 할 수있는 DateTime을 어떻게 처리합니까? DateTime 속성 값이 설정 될 수있는 클래스가 있습니다. 나는 부동산 보유자를 dateTime.minValue로 초기화 할 생각이었다. 나는 이것이 아주 일반적인 질문이라고 생각합니다. 어떻게 그렇게합니까?

도움이 되었습니까?

해결책

정상적인 dateTime의 경우, 당신이 그것들을 전혀 초기화하지 않으면 그들은 일치합니다. DateTime.MinValue, 참조 유형이 아닌 값 유형이기 때문입니다.

다음과 같은 Nullable DateTime을 사용할 수도 있습니다.

DateTime? MyNullableDate;

또는 더 긴 형태 :

Nullable<DateTime> MyNullableDate;

마지막으로 모든 유형의 기본값을 참조하는 내장이 있습니다. 이것은 반환됩니다 null 참조 유형의 경우, 그러나 우리의 dateTime 예제는 다음과 같은 것을 반환합니다. DateTime.MinValue:

default(DateTime)

다른 팁

.NET 2.0 (또는 나중에)을 사용하는 경우 Nullable 유형을 사용할 수 있습니다.

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;

PropublishDate는 DateTime이어야합니까?

나는 a를 사용하는 것을 고려할 것이다 무효 유형.

DateTime? myDate 대신에 DateTime myDate.

무효 클래스를 사용할 수 있습니다.

DateTime? date = new DateTime?();

이를 위해 Nullable DateTime을 사용할 수 있습니다.

Nullable<DateTime> myDateTime;

또는 이렇게 쓰여진 것과 같은 것 :

DateTime? myDateTime;

나는 항상 시간을 설정했다 DateTime.MinValue. 이런 식으로 나는 nullerrorexception을 얻지 못하고 그것을 설정하지 않은 날짜와 비교할 수 있습니다.

a DateTime 변수는 될 수 없습니다 null, 여전히 비교할 수 있습니다 null 컴파일러 오류없이 :

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

DateTime을 nullable로 설정할 수 있습니다. 기본적으로 dateTime은 무효가되지 않습니다. 몇 가지 방법으로 무효가 될 수 있습니다. DateTime 유형 다음에 물음표를 사용하십니까? MyTime 또는 일반적인 스타일을 사용하여 무효가 가능합니다. MSDN에 몇 가지 링크를 추가했습니다.

Nullable 사용

무효

그냥 경고를 받으십시오 - 무효가 될 수있는 경우 더 이상 '순수한'DateTime 객체가 아니므로 DateTime 멤버에 직접 액세스 할 수 없습니다. 나는 시도하고 설명 할 것이다.

nullable <>를 사용하면 기본적으로 컨테이너 (감사합니다)로 DateTime을 감싸고 있습니다. 이 컨테이너에는 자체 특성이있어 호출 할 수있는 속성이 있으며 위에서 언급 한 DateTime 객체에 액세스 할 수 있습니다. 올바른 속성을 사용한 후 (이 경우 nullable.value) 표준 DateTime 멤버, 속성 등에 액세스 할 수 있습니다.

따라서 이제 DateTime 객체에 액세스하는 가장 좋은 방법에 대해 문제가 발생합니다. 몇 가지 방법이 있으며, 1 번은 최고이고 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의 사용이 아마도 게시 할 가치가 있다고 생각합니다. 동의하지 않으면 죄송합니다.

편집 : 약간 지나치게 구체적이고 케이스 의존적이어서 세 번째 옵션을 제거했습니다.

모두가 이미 답을 주었지만 DateTime을 기능으로 쉽게 전달할 수있는 방법을 언급하겠습니다.

오류 : 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)

리포지토리에서 NULL 가능 DATETIME을 사용하십시오.

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

나는 DateTime의 매개 변수로 NULL을 제공하는 것과 같은 문제가 있었고, Drows ArgumentNullexception에 대한 단위 테스트를 수행하면 다음 옵션을 사용하여 내 경우에 작동했습니다.

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 필드 AS 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# 프로그래머 일 것입니다. :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top