Programing

DateTime.ToUniversalTime ()은 어떻게 작동합니까?

lottogame 2020. 12. 1. 07:34
반응형

DateTime.ToUniversalTime ()은 어떻게 작동합니까?


표준 DateTime형식 에서 UTC 로의 변환은 어떻게 작동합니까?

보다 구체적으로, DateTime한 시간대에 객체를 만든 다음 다른 시간대로 전환하여 실행 ToUniversalTime()하면 변환이 올바르게 수행되었으며 시간이 여전히 정확하게 표시되는지 어떻게 알 수 있습니까?


DateTime객체에 연결된 암시 적 시간대가 없습니다 . 실행 ToUniversalTime()하면 코드가 실행되는 컨텍스트의 시간대를 사용합니다.

예를 들어, DateTime1970 년 1 월 1 일의 epoch에서를 생성하면 내가 DateTime세계 어디에 있든 동일한 객체를 제공합니다 .

내가 실행하면 ToUniversalTime()내가 그리니치의 코드를 실행 해요 때에, 나는 같은 시간을 얻을. 밴쿠버에 사는 동안 그렇게하면 DateTime-8 시간 의 오프셋 개체가 생깁니다.

그렇기 때문에 모든 종류의 날짜 변환 또는 현지화를 수행해야 할 때 시간 관련 정보를 데이터베이스에 UTC 시간으로 저장하는 것이 중요합니다. 코드베이스가 다른 시간대의 서버 시설로 이동했는지 고려하십시오.)

편집 : Joel의 답변에 대한 메모- DateTime기본적으로 개체는 DateTimeKind.Local. 당신이 날짜를 구문 분석하고 설정하면 DateTimeKind.Utc, 다음 ToUniversalTime()에는 변환을 수행하지 않습니다.

다음은 "날짜 시간을 사용한 코딩 모범 사례" 에 대한 기사 와 .Net을 사용 하여 날짜 시간 변환에 대한 기사입니다 .


먼저 KindDateTime가 이미 UTC로 알려져 있는지 확인합니다 . 그렇다면 동일한 값을 반환합니다.

그렇지 않으면 로컬 시간으로 간주됩니다. 즉, 실행중인 컴퓨터의 로컬 시간이며, 특히 일부 개인 속성이 처음에 느리게 초기화 될 때 컴퓨터가 사용하던 시간대입니다. , 애플리케이션이 시작된 시간대를 변경하더라도 이전 시간대 를 계속 사용할 가능성이 높습니다.

시간대에는 모호하거나 유효하지 않은 시간이 있지만 현지 시간을 UTC 시간으로 또는 그 반대로 변환하기에 충분한 정보가 포함되어 있습니다. (두 번 발생하는 현지 시간과 일광 절약 시간으로 인해 발생하지 않는 현지 시간이 있습니다.) 이러한 경우를 처리하는 규칙 은 문서에 지정되어 있습니다 .

날짜 및 시간 인스턴스 값이 모호한 시간이면이 메서드는 표준 시간으로 간주합니다. (모호한 시간은 표준 시간 또는 현지 시간대의 일광 절약 시간에 매핑 할 수있는 시간입니다.) 날짜 및 시간 인스턴스 값이 잘못된 시간이면이 방법은 단순히 현지 시간대의 현지 시간에서 현지 시간을 뺍니다. UTC를 반환하는 UTC 오프셋입니다. (유효하지 않은 시간은 일광 절약 시간제 조정 규칙 적용으로 인해 존재하지 않는 시간입니다.)

반환 된 값에는의 KindDateTimeKind.Utc있으므로이를 호출 ToUniveralTime하면 오프셋이 다시 적용되지 않습니다. (이것은 .NET 1.1에 비해 크게 향상되었습니다!)

현지 시간대가 아닌 경우 TimeZoneInfo.NET 3.5에 도입 된 시간대를 사용해야합니다 (이전 버전에 대한 해키 솔루션이 있지만 좋지 않음). 순간을 표시하려면 DateTimeOffset.NET 2.0SP1, .NET3.0SP1 및 .NET 3.5에 도입 된 사용 고려해야 합니다. 그러나 여전히 실제 시간대가 연결되어 있지 않습니다. UTC로부터의 오프셋 일뿐입니다. 즉, 한 시간 후의 현지 시간을 알 수 없습니다. 예를 들어 DST 규칙은 특정 순간에 동일한 오프셋을 사용하는 시간대에 따라 다를 수 있습니다. 다소 단순한 TimeZoneInfo것과 반대로 역사적 및 미래의 규칙을 고려하도록 설계되었습니다 TimeZone.

기본적으로 .NET 3.5의 지원은 이전보다 훨씬 낫지 만 적절한 달력 산술을 위해 여전히 원하는 것이 있습니다. Joda Time 을 .NET으로 포팅하는 사람이 있습니까? ;)


무엇 @womp은 말했다 그것은 수 있는지 확인하기 위해 날짜 시간의 종류 속성을 확인하는 추가와 함께, 이미 UTC의 날짜 수.


DateTime.ToUniversalTime은 DateTime을 UTC로 정규화하기 위해 로컬 시간대의 시간대 오프셋을 제거합니다. 그런 다음 다른 시간대의 정규화 된 값에 DateTime.ToLocalTime을 사용하면 해당 시간대의 올바른 표시를 위해 해당 시간대의 시간대 오프셋이 정규화 된 값에 추가됩니다.

참고 URL : https://stackoverflow.com/questions/1201378/how-does-datetime-touniversaltime-work

반응형