programing

날짜 시간 대 날짜 시간 오프셋

powerit 2023. 5. 8. 22:28
반응형

날짜 시간 대 날짜 시간 오프셋

a 사이의 차이점은 무엇입니까?DateTime a 리고a.DateTimeOffset그리고 언제 하나를 사용해야 합니까?


현재, 우리는 표준적인 대처 방법을 가지고 있습니다.그물DateTime a 방식 대간인방식식때: 가 가생산할을 마다.DateTime UTC를 사용합니다).DateTime.UtcNow시간으로 를 표시할 때마다 UTC에서 사용자의 현지 시간으로 다시 변환합니다.

잘 는 그잘먹만지히다전, 읽니습었계속건다에 대해 읽고 .DateTimeOffset개체 자체에서 로컬 및 UTC 시간을 캡처하는 방법입니다.

DateTimeOffset순간 시간(절대 시간이라고도 함)을 나타냅니다.즉, 모든 사람에게 보편적인 시간의 순간을 의미합니다(윤초 또는 시간 확장의 상대론적 효과를 설명하지 않음).순간 시간을 표현하는 또 다른 방법은 다음과 같습니다.DateTime.Kind이라DateTimeKind.Utc.

이것은 일정관리에 있는 위치인 일정관리 시간(시민 시간이라고도 함)는 구별되며, 전 세계적으로 많은 다양한 달력이 있습니다.우리는 이 달력들을 시간대라고 부릅니다.달력 시간은 다음으로 표시됩니다.DateTime.Kind이라DateTimeKind.Unspecified또는DateTimeKind.Local.그리고..Local가 있습니다. (의 워크스테이션에서 사용할 수 있습니다.

왜 그럼왜요?요왜▁so▁why?DateTimeOffset UTC DateTime모든 것은 관점에 관한 것입니다.비유를 사용해 봅시다 - 우리는 사진작가인 척 할 것입니다.

여러분이 달력 타임라인에 서서 여러분 앞에 놓인 순간 타임라인에 있는 사람에게 카메라를 겨누고 있다고 상상해 보세요.일광 절약 시간제 또는 시간대의 법적 정의에 대한 다른 변경 사항으로 인해 주기적으로 변경되는 표준 시간대의 규칙에 따라 카메라를 정렬합니다. (손이 안정되지 않아 카메라가 흔들립니다.)

사진 속에 서 있는 사람은 카메라가 나오는 각도를 볼 수 있습니다.만약 다른 사람들이 사진을 찍고 있다면, 그들은 다른 각도에서 사진을 찍을 수 있습니다.이것이 바로 그것입니다.OffsetDateTimeOffset나타내다.

따라서 카메라에 "동부 표준시"라는 레이블을 붙이면 때로는 -5를 가리키고 때로는 -4를 가리킵니다.전세계에 카메라들이 있습니다. 모두 다른 것들로 분류되어 있고, 모든 카메라들은 다른 각도에서 같은 순간의 타임라인을 가리키고 있습니다.이들 중 일부는 서로 바로 옆(또는 위)에 있으므로 오프셋을 아는 것만으로는 시간이 어느 시간대와 관련되어 있는지 확인하기에 충분하지 않습니다.

UTC는 어떻습니까?음, 확실한 손놀림이 보장되는 카메라는 저 밖에 하나뿐입니다.그것은 땅에 단단히 고정된 삼각대 위에 있습니다.그건 아무 데도 안 가.우리는 그것의 원근각을 제로 오프셋이라고 부릅니다.

Instantaneous Time vs Calendar Time Visualization

그래서 - 이 비유가 우리에게 말해주는 것은 무엇입니까?몇 가지 직관적인 지침을 제공합니다.

  • , 달력 하세요.DateTime한 달력과 다른 달력을 혼동하지 않도록 하십시오. Unspecified당신이 가정해야 합니다. Local유용한 것은 오직 에서만 제공됩니다.DateTime.Now를 들어,는 예를들어, 아마도나는을 받을 수 .DateTime.Now합니다 - 제가 그것을 때, 이 그고그것데이저다장니 - 만제그검때색할것을그, 것이저는가리라고 .Unspecified제 지역 달력이 원래 있던 달력과 같다는 것을 믿을 수 없습니다.

  • 항상 순간을 확신해야 하는 경우, 순간을 표현하고 있는지 확인합니다.사용하다DateTimeOffsetUTC를하거나 UTC를 합니다.DateTime관례에 따라

  • 순간 순간을 추적해야 하지만 "사용자가 로컬 일정관리에 몇 시라고 생각했는지"도 알고 싶다면 - 그런 다음DateTimeOffset이것은 예를 들어 기술적, 법적 문제 모두에서 시간 기록 시스템에 매우 중요합니다.

  • 에 녹음된 를 해야 할 경우DateTimeOffset새 오프셋이 사용자와 관련이 있는지 확인하기 위해 오프셋에만 충분한 정보가 없습니다.또한 표준 시간대 식별자를 저장해야 합니다(예: 위치가 변경되더라도 새 사진을 찍을 수 있도록 카메라 이름이 필요합니다).

    또한 노다 타임이 다음과 같은 표현을 가지고 있다는 것도 지적해야 합니다.ZonedDateTime이를 위해, 반면에.Netbase 클래스 라이브러리에 이와 유사한 항목이 없습니다.은 둘다저니장야합 해 다 합 니DateTimeOffset a 리고a.TimeZoneInfo.Idvalue.value.value.

  • 때때로 "누구나 보고 있는" 일정관리 시간을 나타낼 수 있습니다.예를 들어, 오늘이 의미하는 바를 정의할 때.오늘은 항상 자정부터 자정까지이지만, 이것들은 순간 타임라인에서 거의 무한한 수의 중첩 범위를 나타냅니다.(실제로는 제한된 시간대가 있지만 체크 표시까지 오프셋을 표현할 수 있습니다.) 따라서 이러한 상황에서 "누가 묻나요?" 질문을 단일 시간대로 제한하거나 적절한 순간 시간으로 다시 변환하는 방법을 이해해야 합니다.

여기에 대한 몇 가지 다른 작은 부분이 있습니다.DateTimeOffset똑바로 몇 팁: 비유를뒷받침것그과이똑팁것위몇가유한지기지하바:

  • 개의 두개비교면을 ,DateTimeOffset값을 비교하기 전에 먼저 0 오프셋으로 정규화합니다. 다른말하면로,하면,2012-01-01T00:00:00+00:00그리고.2012-01-01T02:00:00+02:00동일한 순간 순간을 가리키며, 따라서 동등합니다.

  • 장치 테스트를 수행하는 경우 오프셋을 확실하게 확인해야 할 경우 두 가지 테스트를 모두 수행합니다.DateTimeOffset 치가, 리고그.Offset별채로

  • 적 있 장 습 니 어 되 환▁a▁를 통과할 수 있는 넷 DateTime어떤 것이든DateTimeOffset매개 변수 또는 변수.그렇게 할 때 중요합니다.만약 당신이 UTC 종류를 통과한다면, 그것은 제로 오프셋으로 운반될 것이지만, 당신이 어느 하나를 통과한다면..Local또는.Unspecified지역적인 것으로 가정할 것입니다.그 틀은 기본적으로 "음, 당신이 나에게 달력 시간을 순간 시간으로 변환하라고 했지만, 나는 이것이 어디에서 왔는지 전혀 모르기 때문에, 나는 단지 로컬 달력을 사용하려고 합니다."라고 말합니다.만약 당신이 지정되지 않은 것을 로드한다면 이것은 엄청난 고트카입니다.DateTime시간대가 다른 컴퓨터에서. (IMHO - 예외를 던져야 하지만 그렇지 않습니다.)

파렴치한 플러그:

많은 사람들이 이 비유가 매우 가치 있다고 생각한다는 것을 저와 공유했습니다. 그래서 저는 이 비유를 제 복수의 관점 강좌인 날짜와 시간 기초에 포함시켰습니다.두 번째 모듈인 "Context Matters"에서는 "Calendar Time vs."라는 제목의 클립에서 카메라 유사성에 대한 단계별 설명을 확인할 수 있습니다.순간 시간".

Microsoft에서:

DateTimeOffset 값에 대한 이러한 사용은 DateTime 값에 대한 사용보다 훨씬 일반적입니다.따라서 DateTimeOffset은 응용프로그램 개발의 기본 날짜 및 시간 유형으로 간주해야 합니다.

원본: "날짜 시간, 날짜 시간 오프셋, 시간 범위 및 시간대 정보 선택", MSDN

우리는 사용합니다.DateTimeOffset애플리케이션이 특정 시점(예: 레코드가 생성/삭제된 시점)을 처리하기 때문에 거의 모든 작업에 사용할 수 있습니다.참고로, 우리는 다음을 사용합니다.DATETIMEOFFSETSQL Server 2008에서도 사용할 수 있습니다.

그렇군요.DateTime날짜만, 시간만 또는 일반적인 의미로 둘 중 하나를 처리하고자 할 때 유용합니다.예를 들어, 매일 오전 7시에 알람이 울리길 원하는 경우, 당신은 그것을 저장할 수 있습니다.DateTimea를 활용하여DateTimeKindUnspecified왜냐하면 당신은 DST와 상관없이 오전 7시에 폭발하기를 원하기 때문입니다.그러나 알람 발생 기록을 나타내려면 다음을 사용합니다.DateTimeOffset.

혼합물을 사용할 때는 주의해야 합니다.DateTimeOffset그리고.DateTime특히 유형을 할당하고 비교할 때.또한 비교만 합니다.DateTime동일한 인스턴스DateTimeKind왜냐면DateTime비교할 때 시간대 오프셋을 무시합니다.

DateTime은 현지 시간과 UTC의 두 개의 서로 다른 시간만 저장할 수 있습니다.Kind 속성은 다음을 나타냅니다.

DateTimeOffset은 전 세계 어디에서나 로컬 시간을 저장할 수 있으므로 이를 확장합니다.또한 해당 현지 시간과 UTC 사이의 오프셋도 저장합니다.UTC 오프셋을 저장하기 위해 클래스에 추가 구성원을 추가하지 않는 한 DateTime에서 이 작업을 수행할 수 없습니다.또는 UTC로만 작업할 수 있습니다.그 자체로 좋은 생각입니다.

Microsoft의 이 코드는 모든 것을 설명합니다.

// Find difference between Date.Now and Date.UtcNow
  date1 = DateTime.Now;
  date2 = DateTime.UtcNow;
  difference = date1 - date2;
  Console.WriteLine("{0} - {1} = {2}", date1, date2, difference);

  // Find difference between Now and UtcNow using DateTimeOffset
  dateOffset1 = DateTimeOffset.Now;
  dateOffset2 = DateTimeOffset.UtcNow;
  difference = dateOffset1 - dateOffset2;
  Console.WriteLine("{0} - {1} = {2}", 
                    dateOffset1, dateOffset2, difference);
  // If run in the Pacific Standard time zone on 4/2/2007, the example
  // displays the following output to the console:
  //    4/2/2007 7:23:57 PM - 4/3/2007 2:23:57 AM = -07:00:00
  //    4/2/2007 7:23:57 PM -07:00 - 4/3/2007 2:23:57 AM +00:00 = 00:00:00

가장 중요한 차이점은 DateTime이 표준 시간대 정보를 저장하지 않는 반면 DateTimeOffset은 표준 시간대 정보를 저장한다는 것입니다.

DateTime은 UTC와 Local을 구분하지만 이와 관련된 명시적인 시간대 오프셋은 없습니다.일련화 또는 변환을 수행할 경우 서버의 표준 시간대가 사용됩니다.UTC 시간을 오프셋하기 위해 분을 추가하여 로컬 시간을 수동으로 생성하더라도 DateTime에 명시적 오프셋이 없기 때문에 서버의 표준 시간 오프셋을 사용하므로 직렬화 단계에서 비트를 계속 가져올 수 있습니다.

예를 들어 Json을 사용하여 DateTime 값을 Kind=Local로 직렬화하는 경우.넷 및 ISO 날짜 형식은 다음과 같은 문자열을 얻을 수 있습니다.2015-08-05T07:00:00-04마지막 부분(-04)은 DateTime 또는 계산에 사용한 오프셋과 아무런 관련이 없습니다.이것은 순전히 서버의 시간대 오프셋입니다.

한편, DateTimeOffset에는 오프셋이 명시적으로 포함됩니다.표준 시간대의 이름을 포함하지 않을 수도 있지만, 적어도 오프셋을 포함하며, 이를 직렬화하면 서버의 로컬 시간 대신 값에 명시적으로 포함된 오프셋을 얻을 수 있습니다.

몇 군데 있습니다.DateTimeOffset말이 되는군요.하나는 반복적인 이벤트와 일광 절약 시간을 처리하는 경우입니다.예를 들어 매일 오전 9시에 알람이 울리도록 설정하려고 합니다."UTC로 저장, 로컬 시간으로 표시" 규칙을 사용하면 일광 절약 시간이 적용되는 다른 시간에 알람이 울립니다.

아마 다른 것들도 있겠지만, 위의 예는 사실 제가 과거에 마주친 예입니다. (이것은 가 추가되기 전의 일입니다.)DateTimeOffsetBCL에 - 당시 제 해결책은 현지 시간대에 시간을 명시적으로 저장하고, 시간대 정보를 그 옆에 저장하는 것이었습니다: 기본적으로 무엇입니까?DateTimeOffset내부적으로 수행).

이 모든 훌륭한 답변을 읽고 싶지 않다면 TLDR:-)

명시적:

사용.DateTimeOffset시간대가 UTC+0으로 강제 적용되기 때문입니다.

암시적:

사용.DateTime모든 사람이 항상 UTC+0인 시간대의 불문율을 고수하기를 바라는 곳입니다.


(devs에 대한 참고 사항: 명시적인 것이 암시적인 것보다 항상좋습니다!)

(Java devs를 위한 사이드 노트, C#)DateTimeOffset자바OffsetDateTime다음을 읽으십시오: https://www.baeldung.com/java-zoneddatetime-offsetdatetime)

DateTime.Now
12월 3일 금요일 18:40:11

DateTimeOffset.Now
12월 3일 금요일 18:40:11 +02:00

그렇게,DateTimeOffset에서는 시간이 UTC(기본적으로 표준 시간대)와 어떻게 관련되는지에 대한 정보를 저장합니다.

가장 큰 차이점은DateTimeOffset와 함께 사용할 수 있습니다.TimeZoneInfo현재 시간대가 아닌 다른 시간대의 현지 시간으로 변환합니다.

이것은 서버 응용프로그램(예: ASP)에서 유용합니다.다른 시간대의 사용자가 액세스하는 NET)입니다.

DateTimeOffset의 유일한 부정적인 측면은 Microsoft가 XmlSerializer 클래스에서 지원하는 것을 "잊어버렸다"는 것입니다.그러나 이후 XmlConvert 유틸리티 클래스에 추가되었습니다.

XmlConvert.ToDateTimeOffset

XmlConvert.문자열로

모든 이점 때문에 DateTimeOffset 및 TimeZoneInfo를 사용하는 것이 좋습니다. XML로 직렬화되거나 XML에서 직렬화될 수 있는 엔티티(모든 비즈니스 개체)를 생성할 때 주의하십시오.

언급URL : https://stackoverflow.com/questions/4331189/datetime-vs-datetimeoffset

반응형