문제
나는 많이 검색했지만 해결책을 찾을 수 없었습니다. 초기화되지 않은 값 (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에 몇 가지 링크를 추가했습니다.
그냥 경고를 받으십시오 - 무효가 될 수있는 경우 더 이상 '순수한'DateTime 객체가 아니므로 DateTime 멤버에 직접 액세스 할 수 없습니다. 나는 시도하고 설명 할 것이다.
nullable <>를 사용하면 기본적으로 컨테이너 (감사합니다)로 DateTime을 감싸고 있습니다. 이 컨테이너에는 자체 특성이있어 호출 할 수있는 속성이 있으며 위에서 언급 한 DateTime 객체에 액세스 할 수 있습니다. 올바른 속성을 사용한 후 (이 경우 nullable.value) 표준 DateTime 멤버, 속성 등에 액세스 할 수 있습니다.
따라서 이제 DateTime 객체에 액세스하는 가장 좋은 방법에 대해 문제가 발생합니다. 몇 가지 방법이 있으며, 1 번은 최고이고 2는 "Dude Why"입니다.
nullable.value 속성 사용
DateTime date = myNullableObject.Value.ToUniversalTime(); //Works
DateTime date = myNullableObject.ToUniversalTime(); //Not a datetime object, fails
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# 프로그래머 일 것입니다. :)