DateTime.Now 대 DateTime.UtcNow


225

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


1
너무 늦었지만이 블로그를 가리키고 싶습니다 : blog.angeloflogic.com/2013/10/…
Kai Wang

작은 벤치 마킹 rextester.com/QRDR82396
Daniel B

답변:


346

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

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


84
데이터베이스 나 파일에 날짜를 저장할 때는 반드시 UTC로 저장하십시오!
Jeff Atwood

15
데이터베이스에 UTC로 날짜를 저장하려면 데이터베이스가 명시적인 시간대를 제공하지 않는 날짜에 자체 시간대를 추가하지 않아야합니다. DateTime은 요청할 때 항상 현재 시간대를 사용합니다.
Omer van Kloeten

@OmervanKloeten은 매우 좋은 지적입니다. IIS와 SQL 서버가 다른 시간대에 있더라도 매번 날짜를 올바르게 저장하고받는 우아한 '올 라운드'솔루션이 있는지 궁금합니다.
TheGeekZn

1
@ JoshYates1980 네, 그냥 DateTime.UtcNow.AddYears (1)
CathalMF에서

3
NodaTime을 사용하십시오 -시간에 대해 더 유용한 방식으로 생각하고 그러한 문제를 피할 수 있습니다
aateeque

86

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

당신이 UTC를 사용하지 않는 경우, 당신은 해야한다 , 그렇지 않으면 당신은 정말 오후 5시 곳에서 일어난 시스템이나 서버 시간, 3시에 일어난 그 일을 말할 것이다 - 당신이에 날짜와 시간을 표시하고있는 사람의 시간대를 알고 그들은 생깁니다.

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

또한 지구의 어느 위치에 있든지 상관없이 게시물이 시간이 "동일"할 정도로 충분히 오래 될 때까지 (2 시간 전, 1 일 전 등) 상대 시간을 표시합니다.


또한 DateTime.UtcNow를 저장하는 것이 올바른 시간을 얻기 위해 2 개의 날짜로 계산을 수행 할 때만 필요하다는 것을 두 번째로 원합니다. RegisterAt Date를 표시해야 할 때 Datetime.Now이면 충분합니다.
엘리자베스

36

또한 성능 차이에 유의하십시오. DateTime.UtcNow어딘가에이다 (30) 다음 배 빠른 DateTime.Now내부에 있기 때문에, DateTime.Now시간대 조정을 많이 (쉽게 반사경으로이를 확인할 수)를하고있다.

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


그냥 UtcNow 더 나은 성능을 알고 단순히 UtcNow와 날짜에 의존 표시 MySQL의에서 날짜를 저장하고 그 UTC이라고 가정하고 비교한다는 것은이 글로벌 시간대 문제를 단순화 나에게 고통스러운 여행을 촬영하고있다
Diin

29

.NET에서 이해하는 한 가지 주요 개념 즉 지금 없습니다 지금 . 아무리 당신이 변수를로드하는 경우 당신은 그래서에서 어떤 시간대 온 땅 DateTime.Now또는 DateTime.UtcNow-. 할당이 동일 * 귀하의 DateTime목적은 당신이있는 시간대 알고 과제에 관계없이이를 고려합니다.

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

기사 는 추가 설명을 작성한 블로그 게시물에TimeSpan 포함되어 있으며 주제에 대한 훨씬 광범위한 MS 기사에 대한 링크를 포함합니다.

* 설명 : 과제는 현재 시간을 저장합니다. 두 개의 변수를 통해 하나의로드라면 DateTime.Now()과를 통해 다른 당신이 시간 거리 GMT에서 시간대에 가정 밀리 초 시간이 아닌 것 둘 사이의 차이를. 아래에 언급 된대로 값을 인쇄하면 다른 문자열이 표시됩니다.DateTime.UtcNow()TimeSpanString


1
"DateTime.Now 또는 DateTime.UtcNow를 사용하여 변수로드-할당이 동일합니다"와 관련하여 :이를 명확히해야합니까? 여기에 EDT 시간대 (UTC -4)에 앉아 두 개의 변수를 각각 DateTime.UtcNow 및 DateTime.Now에 할당 한 다음 해당 값을 ToString ()으로 인쇄했습니다. 표시된 값은 "동일하지 않은"4 시간 간격입니다.
존 슈나이더

2
@ JonSchneider, 당신이 맞다고 생각합니다. "할당이 동일합니다"라는 진술은 사실이 아닙니다. ToString ()은 Java와 같이 동일한 날짜를 다르게 표시 할 있기 때문에 테스트하는 가장 좋은 방법은 아닙니다 . 비교 함수는 더 나은 테스트이며 실제로는 같지 않음을 보여줍니다.
Ted Bigham

"동일한"설명에 대한 설명 : DateTime.Now를 통해 변수 하나와 DateTime.UtcNow를 사용하여 변수 하나를로드 한 다음 TimeSpan 차이를 인쇄하십시오. GMT에서 몇 시간 떨어져 있다고 가정하면 몇 시간이 아니라 밀리 초가됩니다.
칼 카메라

18

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

로 내부적으로 날짜가 저장되어 Ticks있는 (@Carl 카메라의 대답에 반하는가) 당신이 사용하는 경우에 따라 다릅니다 NowUtcNow.

DateTime.UtcNow다른 언어처럼 동작합니다. TicksGMT 기반 값으로 설정 됩니다. 또한로 설정 Kind됩니다 Utc.

DateTime.NowGMT 시간대의 시간 인 경우Ticks 값을 원래 값으로 변경합니다 . 또한로 설정 Kind됩니다 Local.

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

'Kind'값이 다른 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거의 시간이었다, 대신에 거의 6.이었다해야 "UTC <지금"(I조차 확인하기 위해 시간을 추가) 사실 있었어야하지만, 여전히 거짓이었다.

또한 Kind동일하지 않은 어디에서나 표준시로 간단히 변환하는 '해결 방법'을 볼 수도 있습니다 .

질문에 대한 본인의 직접 답변은 각 답변의 사용시기에 대한 승인 된 답변의 권장 사항에 동의합니다. 당신은 항상해야 시도 와 작업에 DateTime있는 개체 Kind=UtcI / O를 (표시 및 구문 분석) 동안을 제외하고. 즉 DateTime.UtcNow, 객체를 생성하여 표시하고 바로 버릴 경우를 제외하고 는 거의 항상을 사용해야합니다 .


7

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

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


9
완전히 정확하고 (성능상의 이유로 사람들이 Now over UtcNow를 사용하지 못하도록하는) 다른 방법입니다. 이제 시간대를 UtcNow에 추가하고 실제로는 속도가 느립니다.
mafu

5

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

DateTime.Now 는 현재 시스템 시간 (시스템이 실행중인 시간대)을 나타내는 DateTime 값을 반환합니다 . DateTime.Kind의 속성이 될 것입니다 DateTimeKind.Local

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


4

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



1

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


1

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

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


0

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

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


0

큰 차이점 :)은 DateTime.Now가 SharePoint Workflow에서 지원되지 않는다는 것입니다. DateTime.UtcNow를 사용해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.