두 속성의 작동 원리가 정확히 무엇인지 궁금합니다. 나는 두 번째가 보편적이며 기본적으로 시간대를 다루지 않는다는 것을 알고 있지만 누군가 어떻게 작동하고 어떤 시나리오에서 사용해야하는지 자세히 설명 할 수 있습니까?
답변
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.Now 는 현재 시스템 시간 (시스템이 실행중인 시간대)을 나타내는 DateTime 값을 반환합니다 . DateTime.Kind의 속성이 될 것입니다 DateTimeKind.Local
DateTime.UtcNow 는 현재 표준 세계시 (UTC)를 나타내는 DateTime 값을 반환하며 이는 시스템 시간대와 상관없이 동일합니다. DateTime.Kind의 속성이 될 것입니다 DateTimeKind.Utc