it-swarm-ko.com

DateTime.Now 대 DateTime.UtcNow

두 속성의 작동 원리가 정확히 무엇인지 궁금합니다. 두 번째는 보편적이며 기본적으로 시간대를 다루지 않지만 누군가 어떻게 작동하고 어떤 시나리오에서 사용해야하는지 자세히 설명 할 수 있습니까?

197
Slavo

DateTime.UtcNow 그리니치 표준시 시간대라고도하는 협정 세계시와 같은 날짜와 시간을 알려줍니다. 기본적으로 영국 런던에 있었을 때와 같지만 그렇지 않습니다. 여름 동안. DateTime.Now 현재 로케일의 누군가에게 표시 될 날짜와 시간을 제공합니다.

인간에게 날짜를 표시 할 때마다 DateTime.Now을 (를) 사용하는 것이 좋습니다. 그들이 보는 가치에 익숙한 방식입니다. 시계 나 시계에서 보는 것과 쉽게 비교할 수 있습니다. . 날짜를 저장하거나 클라이언트-서버 모델에서 나중에 계산할 때 날짜를 저장하려면 DateTime.UtcNow를 사용하십시오. 서버와 다른 시간대의 클라이언트에 의해 계산이 혼동되지 않습니다.

311
Blair Conrad

정말 간단합니다. 청중이 무엇이고 어디에 사는가에 달려 있다고 생각합니다.

Utc를 사용하지 않으면 필수 날짜와 시간을 표시하는 사람의 시간대를 알고 있어야합니다. 그렇지 않으면 3 PM 실제로 발생하는 5 PM에 발생한 시스템 또는 서버 시간.

전 세계 웹 잠재 고객이 있고 모든 시간대에 거주하는 시간대를 나타내는 양식을 작성하기 위해 모든 사용자를 관리하지 않기를 원하기 때문에 DateTime.UtcNow를 사용합니다.

또한 지구상의 어느 위치에 있든지 상관없이 게시물이 노화 될 때까지의 상대 시간 (2 시간 전, 1 일 전 등)을 표시합니다.

80
Jeff Atwood

또한 성능 차이에 유의하십시오. DateTime.UtcNow는 내부적으로 DateTime.Now가 많은 시간대 조정을 수행하기 때문에 DateTime.Now보다 30 배 정도 빠릅니다 (Reflector로이를 쉽게 확인할 수 있음).

따라서 상대 시간 측정에는 DateTime.Now를 사용하지 마십시오.

29
Magnus Krisell

.NET에서 이해해야 할 한 가지 주요 개념은 now is now all DateTime.Now 또는 DateTime.UtcNow로 변수를로드하면 할당이 동일합니다. * DateTime 객체는 현재 시간대를 알고 있습니다. 할당에 관계없이이를 고려합니다.

DateTime.UtcNow의 유용성은 일광 절약 시간제 경계에서 날짜를 계산할 때 유용합니다. 즉, 일광 절약 시간제에 참여하는 장소에서는 때때로 다음 날 정오부터 정오까지 25 시간이 있으며 다음 날 정오와 정오 사이에는 23 시간이 있습니다. 시간 A와 시간 B에서 시간 수를 올바르게 결정하려면 먼저 TimeSpan을 계산하기 전에 각 시간을 UTC로 변환해야합니다.

여기에는 TimeSpan에 대한 자세한 설명이 포함 된 블로그 게시물 이 포함되어 있으며 주제에 대한 훨씬 더 광범위한 MS 기사에 대한 링크가 포함되어 있습니다.

* 설명 : 과제는 현재 시간을 저장합니다. DateTime.Now()을 통해 두 변수를로드하고 다른 하나를 DateTime.UtcNow()를 통해 다른 두 변수를로드하는 경우 GMT에서 표준 시간대로 떨어져 있다고 가정하면 두 변수의 TimeSpan 차이는 밀리 초가됩니다. 아래와 같이 String 값을 인쇄하면 다른 문자열이 표시됩니다.

26
Carl Camera

좋은 질문입니다. .Net이 다른 Kind 값으로 동작하는 방식에 대해 좀 더 자세히 설명하기 위해 그것을 개정하고 있습니다. @Jan Zich가 지적했듯이 실제로 중요한 속성이며 Now 또는 UtcNow 사용 여부에 따라 다르게 설정됩니다.

내부적으로 날짜는 Ticks로 저장되며 Now 또는 UtcNow 사용 여부에 따라 @Carl 카메라의 답변과 달리 다릅니다.

DateTime.UtcNow는 다른 언어와 같이 작동합니다. Ticks을 GMT 기반 값으로 설정합니다. 또한 KindUtc로 설정합니다.

DateTime.NowTicks 값을 GMT 시간대의 시간대 인 경우의 값로 변경합니다. 또한 KindLocal로 설정합니다.

6 시간이 지났 으면 (GMT-6) 6 시간 전부터 GMT 시간을받습니다. .Net은 실제로 Kind을 무시하고이 시간은 "지금"이어야하더라도 6 시간 전인 것처럼 취급합니다. DateTime 인스턴스를 만든 다음 시간대를 변경하고 사용하려고하면 훨씬 더 중단됩니다.

다른 '종류'값을 가진 DateTime 인스턴스는 호환되지 않습니다.

코드를 보자 ...

    DateTime utc = DateTime.UtcNow;
    DateTime now = DateTime.Now;
    Debug.Log (utc + " " + utc.Kind);  // 05/20/2015 17:19:27 Utc
    Debug.Log (now + " " + now.Kind);  // 05/20/2015 10:19:27 Local

    Debug.Log (utc.Ticks);  // 635677391678617830
    Debug.Log (now.Ticks);  // 635677139678617840

    now = now.AddHours(1);
    TimeSpan diff = utc - now;
    Debug.Log (diff);  // 05:59:59.9999990

    Debug.Log (utc <  now);  // false
    Debug.Log (utc == now);  // false
    Debug.Log (utc >  now);  // true

    Debug.Log (utc.ToUniversalTime() <  now.ToUniversalTime());  // true
    Debug.Log (utc.ToUniversalTime() == now.ToUniversalTime());  // false
    Debug.Log (utc.ToUniversalTime() >  now.ToUniversalTime());  // false
    Debug.Log (utc.ToUniversalTime() -  now.ToUniversalTime());  // -01:00:00.0000010

여기에서 볼 수 있듯이 비교 및 ​​수학 함수는 호환 가능한 시간으로 자동 변환되지 않습니다. Timespan은 (는) 거의 1 시간 이었지만 대신 거의 6이었습니다. "utc <now"는 사실이어야합니다 (확실히 한 시간도 추가 했음). 그러나 여전히 거짓입니다.

또한 Kind이 (가) 동일하지 않은 곳에서 단순히 표준시로 변환하는 '해결 방법'을 볼 수도 있습니다.

질문에 대한 본인의 직접 답변은 각 답변의 사용시기에 대한 승인 된 답변의 권장 사항에 동의합니다. I/O (표시 및 구문 분석) 동안을 제외하고 Kind=Utc가있는 DateTime 객체에 대해 작업하려면 항상 try이어야합니다. 즉, 표시하기 위해 객체를 생성하고 바로 버리는 경우를 제외하고는 거의 항상 DateTime.UtcNow를 사용해야합니다.

15
Ted Bigham

DateTime은 표준 시간대를 모릅니다. 항상 현지 시간에 있다고 가정합니다. UtcNow 는 "시간에서 내 시간대 빼기"만 의미합니다.

시간대 인식 날짜를 사용하려면 시간대가있는 날짜/시간을 나타내는 DateTimeOffset을 사용하십시오. 나는 그것을 어려운 방법으로 배워야했다.

6
Omer van Kloeten

질문에 대한 "간단한"대답은 다음과 같습니다.

DateTime.Now는 현재 시스템 시간을 나타내는 DateTime 값을 반환합니다 (시스템이 실행중인 시간대에 관계없이). DateTime.Kind 속성은 DateTimeKind.Local

DateTime.UtcNow는 시스템의 표준 시간대에 관계없이 동일한 현재 세계 표준시 (UTC)를 나타내는 DateTime 값을 반환합니다. DateTime.Kind 속성은 DateTimeKind.Utc

4
PapillonUK

위에서 언급 한 점에 약간의 추가 사항 : DateTime 구조체에는 Kind 라는 작은 알려진 필드도 포함되어 있습니다 (적어도 오랫동안 그것에 대해 알지 못했습니다). 기본적으로 시간이 현지인지 UTC인지를 나타내는 플래그입니다. 현지 시간으로 UTC에서 실제 오프셋을 지정하지 않습니다. stuct가 어떤 의도로 구성되었는지를 나타내는 것 외에도 ToUniversalTime ()ToLocalTime () 메소드의 작동 방식에 영향을줍니다.

4
Jan Zich

파티에 조금 늦었지만이 두 링크 (4guysfromrolla)가 매우 유용하다는 것을 알았습니다.

TC (협정 세계시)를 사용하여 날짜/시간 값 저장

다른 시간대에 날짜 및 시간 저장 및 표시에 대한 조언

2
Sorin Comanescu

DateTime.UtcNow는 연속적인 단일 값 시간 스케일 인 반면 DateTime.Now는 연속되거나 단일 값이 아닙니다. 주된 이유는 일광 절약 시간제이며 UTC에는 적용되지 않습니다. 따라서 UTC는 한 시간 앞으로 또는 뒤로 이동하지 않지만 현지 시간 (DateTime.Now)은 그렇지 않습니다. 그리고 뒤로 이동하면 같은 시간 값이 두 번 발생합니다.

1
user1315023

DateTime.UtcNow는 일광 절약 시간을 생략 한 표준시입니다. 따라서 UTC는 DST로 인해 변경되지 않습니다.

그러나 DateTime.Now는 DST에 따라 변경되므로 연속적이거나 단일 값이 아닙니다. 즉, DateTime.Now와 동일한 시간 값이 두 번 발생하여 고객을 혼란 상태로 만들 수 있습니다.

1
ChaiVan

유럽에서 CEST와 같이 응용 프로그램이 실행되는 시스템에 현지 시간이 필요하면 지금을 사용하십시오. 보편적 인 시간을 원한다면-UtcNow. 사용자의 시간 설정을 사용하려는 로컬 웹 사이트/독립 실행 형 응용 프로그램을 만드는 것이 기본 설정 인 DateTime.Now의 환경 설정과 관련이 있습니다.

웹 사이트의 경우 서버의 시간대 설정임을 기억하십시오. 따라서 사용자의 시간을 표시하는 경우 원하는 시간대를 가져 와서 시간을 변경하거나 (UTC 시간을 데이터베이스에 저장 한 후 수정) UTC를 지정하십시오. 잊어 버린 경우 사용자는 다음과 같은 것을 볼 수 있습니다. 분 전 게시 됨 그리고 가까운 미래의 시간 :)

0
kender