DateTime.touniversaltime과 TimezoneInfo.converttimetoutc의 차이점은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1704780

  •  19-09-2019
  •  | 
  •  

문제

방금 오전 6시에 사용자에게 작업을 수행 해야하는 웹 앱을 출시하는 것에 대해 올바르게 생각하기 시작했습니다. 또한 그들의 날이 끝날 때.

내가 UTC에 시간을 저장하기 위해 .touniversaltime을 사용하기 위해 많은 사람들을 말하는 사람들에 대해 읽고 있었지만, 이것을 시도했을 때 (내가 의심했던 것처럼) 작동하지 않았고 시간이 한 시간 정도 옮겨졌습니다. 저는 영국에 있습니다. 그래서 저는 이것이 GMT에서 UTC로의 상쇄와 관련이 있다고 생각했지만, 현재는 조명 절약이 중단되어야하기 때문에 나에게는 의미가 없습니다).

DB에는 사용자 시간대를 저장하는 필드가 있으며 ConvertTimetOutc와 FromUTC를 사용하기 시작했을 때 기대했던 일을 시작했습니다. 다시 한 번 나는 일광 절약 변환을하기 위해 어떤 논리를 직접 구축 해야하는지 확실하지 않습니다.

나는 왜 모든 사람들이 .touniversaltime에 대해 이야기하고 있었는지 궁금해하고, 실제로 도움이되지 않았기 때문에 UTC로 전환 할 시간을 얼마나 상쇄 할 것인지 알 수있는 방법을 이해할 수 없었지만 두 번째 방법은 두 번째 방법입니다. 의미가 있었다.

누군가 각 방법이 어떻게 유용 할 수 있는지 설명 할 수 있습니까?

도움이 되었습니까?

해결책

다른 시간대로 컴퓨터에서 코드를 실행하는 경우 계산이 여전히 작동합니까? 이것이 사람들이 모든 데이터 시간을 UTC로 저장하고 취급하는 이유입니다. 사용자의 시간대를 저장할 필요가 없습니다. 모든 기계는 어디서나 데이터베이스에서 날짜를 가져 와서 현지 시간으로 쉽게 변환 할 수 있습니다.

다른 시간대에 시간을 저장하는 경우, 일광 절약 시간과 국제 데이터 라인 고려 사항을 고려하는 것을 포함하여 원하는 시간대에 오프셋을 계산해야합니다. 귀하의 경우에는 추가 불필요한 정보를 저장하고 있습니다.

다른 팁

실제로 ~이다 이 둘의 차이.

.NET 3.5 이하, Datetime.ToUniversalTime 다음과 같이 구현됩니다.

public DateTime ToUniversalTime() {
    return TimeZone.CurrentTimeZone.ToUniversalTime(this);
}

사용했기 때문에 TimeZone 클래스, 그것은 언급 된 것과 같은 문제를 겪었습니다 MSDN 문서:

그만큼 TimeZone 클래스는 현지 시간대에 대한 일광 절약 시간 조정 규칙 만 지원합니다. 결과적으로 TimeZone 클래스는 일광 절약 시간 정보를 정확하게보고하거나 최신 조정 규칙이 적용되는 기간 동안 만 UTC와 현지 시간을 변환 할 수 있습니다. 대조적으로, TimeZoneInfo 클래스는 여러 조정 규칙을 지원하므로 역사적인 시간대 데이터로 작업 할 수 있습니다.

.NET 4.0 이상, Datetime.ToUniversalTime 다음과 같이 구현됩니다.

public DateTime ToUniversalTime() { 
    return TimeZoneInfo.ConvertTimeToUtc(this, TimeZoneInfoOptions.NoThrowOnInvalidTime);
} 

이것은 역사적 조정 규칙을 지원하지 않지만 NoThrowOnInvalidTime 깃발, 동일하지 않습니다 그냥 전화로 TimeZoneInfo.ConvertimeToUtc.

호출하는 방법은 an입니다 내부 오버로드 ConvertTimeToUtc 그게 걸립니다 TimeZoneInfoOptions 깃발. 그만큼 공공의 방법의 버전은 사용됩니다 TimeZoneInfoOptions.None, 이것은 사용하는 동안 TimeZoneInfoOptions.NoThrowOnInvalidTime.

차이점은 다음과 같이 설명 할 수 있습니다. 시간대가 우리에게 태평양으로 설정된 상태에서 :

DateTime dt = new DateTime(2015, 3, 8, 2, 0, 0, DateTimeKind.Local);
DateTime utc = dt.ToUniversalTime();
Console.WriteLine(utc); // "3/8/2015 10:00:00 AM"

VS :

DateTime dt = new DateTime(2015, 3, 8, 2, 0, 0, DateTimeKind.Local);
DateTime utc = TimeZoneInfo.ConvertTimeToUtc(dt);  // throws exception!
Console.WriteLine(utc);

이 날짜 이후,이 시간대에서 시간은 1:59:59에서 3:00:00까지 건너 뜁니다. 올바른 일은 (두 번째 경우와 같이) 예외를 던지는 것입니다. 그러나 기존 계약 이후 DateTime.ToUniversalTime 이전 프레임 워크 버전에서이를 허용하지 않았으므로 프레임 워크는 던지는 대신 값을 반환하기로 선택합니다.

선택한 값은 사용에 따라 계산됩니다. 표준 시간 마치 DST 전환이 발생하지 않은 것처럼 오프셋.

편집 : 나는 틀렸다. Matt Johnson 's를 참조하십시오 대답 구현 간의 미묘한 차이에 대한 설명을 위해 DateTime.ToUniversalTime 그리고 TimeZoneInfo.ConvertTimeToUtc.

제목에 표현 된 특정 질문이있는 다른 사람을 위해 : DateTime.touniversaltime과 TimezoneInfo.converttimetoutc의 차이점은 무엇입니까??

정답은: 다른 점이 없다.

JustDecompile을 사용하여 구현을 검사합니다 DateTime.ToUniversalTime .NET 4.5에서 우리는 그것이 사용된다는 것을 알 수 있습니다 TimeZoneInfo.ConvertTimeToUtc 곧장:

    public DateTime ToUniversalTime()
    {
        return TimeZoneInfo.ConvertTimeToUtc(this, TimeZoneInfoOptions.NoThrowOnInvalidTime);
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top