많은 검색을 해왔지만 해결책을 찾지 못했습니다. 초기화되지 않은 값 (null과 동등)을 포함 할 수 있어야하는 DateTime은 어떻게 처리합니까? DateTime 속성 값이 설정되어 있거나 설정되어 있지 않은 클래스가 있습니다. 나는 그때 쉽게 점검 할 수있는 DateTime.MinValue에 대한 속성 홀더를 초기화하려고 생각하고있었습니다. 나는 이것이 아주 일반적인 질문이라고 생각합니다. 어떻게합니까?DateTime "null"값
답변
정상적인 DateTimes의 경우 아무 것도 초기화하지 않으면 참조 유형이 아닌 값 유형이므로 DateTime.MinValue
과 일치합니다.
DateTime? MyNullableDate;
또는 더 긴 형태 :
또한이 같은 널 (NULL) 날짜 시간 사용할 수 있습니다
Nullable<DateTime> MyNullableDate;
그리고를, 마지막으로, 모든 종류의 기본을 참조하는 방식으로 지어있다 . 이 참조 유형에 대한 null
반환하지만 우리의 날짜 시간, 예를 들어이 DateTime.MinValue
같은를 반환합니다
default(DateTime)
나는 nullable types을 사용하는 것이 좋습니다 것입니다.
DateTime? myDate
대신 DateTime myDate
입니다.
당신이 (또는 이상) .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
이전 버전의 .NET에서도 null 가능 유형을 사용할 수 있으며 3.0은 필요하지 않습니다. – stephenbayer
Typo, 업데이트했습니다. –
.NET 2.0에서 제공됩니까? ? 구문은 3.5에서 VB.NET에 추가되었지만 2.0에서 C#으로 변경되었습니다. –
당신은 널 (NULL) 클래스를 사용할 수 있습니다.
DateTime? date = new DateTime?();
nullable DateTime을 사용할 수 있습니다.
Nullable<DateTime> myDateTime;
또는 다음과 같이 작성 같은 일 : 난 항상 DateTime.MinValue
에 시간을 설정
DateTime? myDateTime;
. 이 방법은 어떤 NullErrorException도 얻지 못한다. 그리고 내가 알고있는 날짜와 비교할 수있다.
즉, "여기에 DateTime이 정말로 필요합니다"와 "선택 사항입니다"의 차이점을 알 수 없다는 뜻입니다. Nullable
? 나는 정말로 당신의 코멘트를 얻지 않는다. 그래, 나는 DateTime이 지금까지 현실의 진실성이 널 (null)이었던 것과 같을 때를 알고있다 ... –
나는 다른 해결책을 제안하고있다. 이미 10 번 제안 된 것을 반복하는 대신 –
DateTime을 Nullable로 설정할 수 있습니다. 기본적으로 DateTime은 null을 허용하지 않습니다. 몇 가지 방법으로 nullable로 만들 수 있습니다. DateTime 유형 뒤에 물음표 사용? myTime 또는 일반 스타일 Nullable을 사용합니다. msdn에 몇 개의 링크를 추가했습니다.
날짜 시간 ? MyDateTime는 {얻을; 설정;}
MyDateTime = (drOrder["Field1"] == DBNull.Value) ? (DateTime?)null : ((DateTime)drOrder["Field1"]);
당신이 경우, 때때로이 같은 것을 사용할 수 있습니다 널 기대 :
var orderResults = Repository.GetOrders(id, (DateTime?)model.DateFrom, (DateTime?)model.DateTo)
를 저장소 사용 널 수 날짜에.
public Orders[] GetOrders(string id, DateTime? dateFrom, DateTime? dateTo){...}
이 컴파일러 오류없이 DateTime
변수가 null
할 수는 없지만, 그것은 여전히 null
비교 될 수 있다는 지적 가치가있다 :
DateTime date;
...
if(date == null) // <-- will never be 'true'
...
그냥 경고 - Null 허용을 사용하는 경우는 분명히 더 이상 '순수한'datetime 객체가 아니기 때문에 DateTime 멤버에 직접 액세스 할 수 없습니다. 나는 설명하려고 노력할 것이다.
Nullable <을 사용하면 기본적으로 컨테이너에 DateTime을 래핑합니다 (제네릭을 고맙습니다). nullable은 분명히 그 용도입니다. 이 컨테이너에는 위에서 언급 한 DateTime 객체에 대한 액세스를 제공 할 수있는 자체 속성이 있습니다. 올바른 속성 -이 경우 Nullable.Value -을 사용하면 표준 DateTime 멤버, 속성 등에 액세스 할 수 있습니다.
이제는 DateTime 객체에 액세스하는 가장 좋은 방법에 대해 염두에 두어야합니다. 몇 가지 방법이 있습니다. 1 번은 FAR이 가장 좋고 2 번은 "왜 그런가"입니다.
Nullable.Value 속성을 사용
,DateTime date = myNullableObject.Value.ToUniversalTime(); //Works
DateTime date = myNullableObject.ToUniversalTime(); //Not a datetime object, fails
Convert.ToDateTime()을 사용하여 날짜에 널 객체 변환,
DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //works but why...
답변은이 시점에서 잘 설명되어 있지만, Nullable의 사용법은 게시 가치가 있다고 생각합니다. 동의하지 않으면 죄송합니다.
편집 : 약간 지나치게 구체적이고 대소 문자를 구별 했으므로 세 번째 옵션을 삭제했습니다.
모두가 이미 당신에게 대답을 제공했지만, 내가 함수에
[ERROR를 날짜 시간을 통과하기 쉽게 만드는 방법을 언급합니다 : system.datetime을 변환 할 수 있습니까? ] system.datetime하는
DateTime? dt = null;
DateTime dte = Convert.ToDateTime(dt);
지금 당신은 어떤 문제없이 함수 내에서 DTE를 전달할 수 있습니다.
날짜/시간 데이터 유형의 성격을 감안할 때 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);
당신은 nullable
로 DateModified
필드를 표시하여 내 두 번째 점을 수행 할 수 있습니다. 그것에 대한 값이없는 경우 이제 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 년 후에는 지금 :
아마뿐만 아니라
myClass.PublishDate = toPublish ? DateTime.Now : (DateTime?)null;
그 속성 PublishDate이 날짜 시간이어야한다주의 작업을 그런 식으로 전문가의 C# 프로그래머임을 감안할 때?
Assert.Throws<ArgumentNullException>(()=>sut.StartingDate = DateTime.Parse(null));
그것은 크게하면 도움이 될 것이다 : 나는 ArgumentNullException.It 다음과 같은 옵션을 사용하여 내 경우에는 근무 예외에 대한 단위 테스트를 수행하는 동안 날짜 시간에 대한 매개 변수로 널 포기했다으로 –
그것들을 초기화하고 null을 사용하면, 그것들은 별개의 질문처럼 보이는 – jlafay
@ kirk.burleson처럼'DateTime.MinValue'라는 값을 할당 받음을 기억하십시오. – CompuChip