두 속성의 작동 원리가 정확히 무엇인지 궁금합니다. 나는 두 번째가 보편적이며 기본적으로 시간대를 다루지 않는다는 것을 알고 있지만 누군가 어떻게 작동하고 어떤 시나리오에서 사용해야하는지 자세히 설명 할 수 있습니까?
두 속성의 작동 원리가 정확히 무엇인지 궁금합니다. 나는 두 번째가 보편적이며 기본적으로 시간대를 다루지 않는다는 것을 알고 있지만 누군가 어떻게 작동하고 어떤 시나리오에서 사용해야하는지 자세히 설명 할 수 있습니까?
답변:
DateTime.UtcNow 는 그리니치 표준시 시간대라고도하는 협정 세계시 (Coordinated Universal Time)의 날짜와 시간을 알려줍니다. 기본적으로 영국 런던에 있었지만 여름에는 그렇지 않은 것과 같습니다. DateTime.Now 는 현재 로케일의 누군가에게 표시 될 날짜와 시간을 제공합니다.
나는 DateTime.Now
당신이 인간에게 날짜를 표시 할 때마다-그들이 보는 가치에 익숙한 방식으로-시계 또는 시계에서 보는 것과 쉽게 비교할 수있는 것을 사용하는 것이 좋습니다. 사용 DateTime.UtcNow
당신이 당신의 계산은 서버에서 또는 서로 다른 시간대에있는 클라이언트가 혼동하지 않는다 (클라이언트 - 서버 모델에서) 그런 식으로 날짜를 저장하거나 나중에 계산을 사용하고 싶습니다.
정말 간단합니다. 청중이 무엇이고 어디에 사는가에 달려 있다고 생각합니다.
당신이 UTC를 사용하지 않는 경우, 당신은 해야한다 , 그렇지 않으면 당신은 정말 오후 5시 곳에서 일어난 시스템이나 서버 시간, 3시에 일어난 그 일을 말할 것이다 - 당신이에 날짜와 시간을 표시하고있는 사람의 시간대를 알고 그들은 생깁니다.
우리 DateTime.UtcNow
는 전 세계 웹 잠재 고객이 있기 때문에 모든 시간대를 나타내는 양식을 작성하기 위해 모든 사용자를 잔소리하지 않기를 원합니다.
또한 지구의 어느 위치에 있든지 상관없이 게시물이 시간이 "동일"할 정도로 충분히 오래 될 때까지 (2 시간 전, 1 일 전 등) 상대 시간을 표시합니다.
또한 성능 차이에 유의하십시오. DateTime.UtcNow
어딘가에이다 (30) 다음 배 빠른 DateTime.Now
내부에 있기 때문에, DateTime.Now
시간대 조정을 많이 (쉽게 반사경으로이를 확인할 수)를하고있다.
따라서 DateTime.Now
상대 시간 측정에는 사용하지 마십시오 .
.NET에서 이해하는 한 가지 주요 개념 즉 지금 없습니다 지금 . 아무리 당신이 변수를로드하는 경우 당신은 그래서에서 어떤 시간대 온 땅 DateTime.Now
또는 DateTime.UtcNow
-. 할당이 동일 * 귀하의 DateTime
목적은 당신이있는 시간대 알고 과제에 관계없이이를 고려합니다.
의 유용성은 DateTime.UtcNow
일광 절약 시간 경계를 넘어 날짜를 계산할 때 유용합니다. 즉, 일광 절약 시간제에 참여하는 장소에서는 때때로 다음 날 정오부터 정오까지 25 시간이 있으며 다음 날 정오와 정오 사이에는 23 시간이 있습니다. 시간 A와 시간 B에서 시간 수를 올바르게 결정하려면을 계산하기 전에 먼저 각 시간을 UTC로 변환해야합니다 TimeSpan
.
이 기사 는 추가 설명을 작성한 블로그 게시물에TimeSpan
포함되어 있으며 주제에 대한 훨씬 광범위한 MS 기사에 대한 링크를 포함합니다.
* 설명 : 과제는 현재 시간을 저장합니다. 두 개의 변수를 통해 하나의로드라면 DateTime.Now()
과를 통해 다른 당신이 시간 거리 GMT에서 시간대에 가정 밀리 초 시간이 아닌 것 둘 사이의 차이를. 아래에 언급 된대로 값을 인쇄하면 다른 문자열이 표시됩니다.DateTime.UtcNow()
TimeSpan
String
좋은 질문입니다. .Net이 다른 Kind
값으로 작동하는 방식에 대해 좀 더 자세히 설명하기 위해 그것을 개정하고 있습니다. @Jan Zich가 지적했듯이 실제로 중요한 속성이며 Now
또는 사용 여부에 따라 다르게 설정 UtcNow
됩니다.
로 내부적으로 날짜가 저장되어 Ticks
있는 (@Carl 카메라의 대답에 반하는가) 당신이 사용하는 경우에 따라 다릅니다 Now
나 UtcNow
.
DateTime.UtcNow
다른 언어처럼 동작합니다. Ticks
GMT 기반 값으로 설정 됩니다. 또한로 설정 Kind
됩니다 Utc
.
DateTime.Now
GMT 시간대의 시간 인 경우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=Utc
I / O를 (표시 및 구문 분석) 동안을 제외하고. 즉 DateTime.UtcNow
, 객체를 생성하여 표시하고 바로 버릴 경우를 제외하고 는 거의 항상을 사용해야합니다 .
DateTime은 표준 시간대를 모릅니다. 항상 현지 시간에 있다고 가정합니다. UtcNow 는 "시간에서 내 시간대 빼기"만 의미합니다.
시간대 인식 날짜를 사용하려면 시간대가 있는 날짜 / 시간을 나타내는 DateTimeOffset을 사용하십시오 . 나는 그것을 어려운 길을 배워야했다.
위에서 언급 한 점에 약간의 추가 사항 : DateTime 구조체에는 Kind 라는 알려진 필드가 포함되어 있습니다 (적어도 오랫동안 그것에 대해 알지 못했습니다). 기본적으로 시간이 로컬인지 UTC인지를 나타내는 플래그입니다. 현지 시간으로 UTC에서 실제 오프셋을 지정하지 않습니다. stuct가 어떤 의도로 구성되었는지를 나타내는 것 외에도 ToUniversalTime () 및 ToLocalTime () 메소드의 작동 방식에 영향을줍니다 .
파티에 조금 늦었지만이 두 링크 (4guysfromrolla)가 매우 유용하다는 것을 알았습니다.
DateTime.UtcNow는 연속적인 단일 값 시간 단위 인 반면 DateTime.Now는 연속되거나 단일 값이 아닙니다. 주된 이유는 일광 절약 시간제이며 UTC에는 적용되지 않습니다. 따라서 UTC는 한 시간 앞으로 또는 뒤로 이동하지 않지만 현지 시간 (DateTime.Now)은 그렇지 않습니다. 그리고 뒤로 이동하면 같은 시간 값이 두 번 발생합니다.
유럽에서 CEST와 같이 응용 프로그램이 실행되는 시스템에 현지 시간이 필요한 경우 지금을 사용하십시오. 보편적 인 시간을 원한다면-UtcNow. 사용자의 시간 설정을 사용하려는 로컬 웹 사이트 / 독립 실행 형 응용 프로그램을 만드는 것이 기본 설정 인 DateTime.Now의 환경 설정과 관련이 있습니다.
웹 사이트의 경우 서버의 시간대 설정임을 기억하십시오. 따라서 사용자의 시간을 표시하는 경우 원하는 시간대를 가져 와서 시간을 변경하거나 (UTC 시간을 데이터베이스에 저장 한 후 수정) UTC를 지정하십시오. 잊어 버린 경우 사용자는 다음과 같은 것을 볼 수 있습니다 : 3 분 전에 게시 한 다음 가까운 시간 :)