문제

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

도움이 되었습니까?

해결책

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

나는 사용하는 것이 좋습니다 DateTime.Now 사람에게 날짜를 표시할 때마다 사람들은 자신이 보는 값에 편안함을 느끼고 시계나 시계에서 보는 값과 쉽게 비교할 수 있습니다.사용 DateTime.UtcNow 날짜를 저장하거나 나중에 계산에 사용하려는 경우(클라이언트-서버 모델에서) 서버 또는 서로 다른 시간대에 있는 클라이언트에 의해 계산이 혼동되지 않습니다.

다른 팁

정말 간단하기 때문에 청중이 누구인지, 어디에 사는지에 따라 다르다고 생각합니다.

Utc를 사용하지 않는 경우 ~ 해야 하다 날짜와 시간을 표시할 사람의 시간대를 알아야 합니다. 그렇지 않으면 시스템 시간이나 서버 시간으로 오후 3시에 무슨 일이 일어났는지 알려줄 것입니다. 실제로 그 사람이 살고 있는 곳에서는 오후 5시에 일어났습니다.

우리는 사용 DateTime.UtcNow 우리는 전 세계적으로 웹 사용자를 보유하고 있으며 모든 사용자에게 거주하는 시간대를 나타내는 양식을 작성하라고 잔소리하고 싶지 않기 때문입니다.

또한 게시물이 지구상 어디에 거주하든 시간이 "동일"할 만큼 오래될 때까지의 상대 시간(2시간 전, 1일 전 등)도 표시합니다.

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

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

.NET에서 이해해야 할 주요 개념 중 하나는 다음과 같습니다. 지금 ~이다 지금 당신이 어느 시간대에 있든 상관없이 지구 전역에 걸쳐 있습니다.따라서 변수를 로드하면 DateTime.Now 또는 DateTime.UtcNow -- 과제는 동일합니다.* DateTime 객체는 귀하가 속한 시간대를 알고 할당에 관계없이 이를 고려합니다.

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

이는 내가 쓴 블로그 게시물 그건 더 설명한다 TimeSpan, 해당 주제에 대한 더욱 광범위한 MS 기사에 대한 링크가 포함되어 있습니다.

*설명:어느 할당이든 현재 시간을 저장합니다.두 개의 변수를 하나를 통해 로드하려는 경우 DateTime.Now() 그리고 다른 하나는 DateTime.UtcNow() 그만큼 TimeSpan 둘 사이의 차이는 GMT에서 몇 시간 떨어진 시간대에 있다고 가정할 때 몇 시간이 아니라 밀리초입니다.아래에 설명된 대로 인쇄하여 String 값은 다른 문자열을 표시합니다.

이것은 좋은 질문입니다..Net이 다른 환경에서 어떻게 작동하는지 좀 더 자세히 설명하기 위해 다시 부활시켰습니다. Kind 가치.@Jan Zich가 지적했듯이 실제로는 매우 중요한 속성이며 사용 여부에 따라 다르게 설정됩니다. Now 또는 UtcNow.

내부적으로 날짜는 다음과 같이 저장됩니다. Ticks (@Carl Camera의 답변과 달리) 사용 여부에 따라 다릅니다. Now 또는 UtcNow.

DateTime.UtcNow 다른 언어처럼 동작합니다.그것은 설정한다 Ticks GMT 기반 값으로.또한 설정합니다 Kind 에게 Utc.

DateTime.Now 변경합니다 Ticks 가치를 부여하다 현재 시간이 GMT 시간대라면 어떨까요?.또한 설정합니다 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 거의 1시간쯤 걸렸어야 했는데 거의 6시가 되었어요."utc < now"는 사실이어야 했지만(확실히 확인하기 위해 한 시간도 추가했습니다) 여전히 거짓이었습니다.

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

질문에 대한 나의 직접적인 대답은 각 질문을 언제 사용해야 하는지에 대한 허용된 답변의 권장 사항에 동의합니다.당신은 항상해야 노력하다 함께 일하다 DateTime 가지고 있는 객체 Kind=Utc, 단, i/o(표시 및 구문 분석) 중에는 제외됩니다.이는 거의 항상 다음을 사용해야 함을 의미합니다. DateTime.UtcNow, 단, 단지 표시하기 위해 객체를 생성하고 즉시 삭제하는 경우는 제외됩니다.

DateTime은 시간대가 무엇인지 전혀 모릅니다.항상 귀하가 현지 시간에 있다고 가정합니다. 현재 UtcNow "시간에서 내 시간대를 뺍니다"를 의미합니다.

시간대 인식 날짜를 사용하려면 다음을 사용하십시오. 날짜시간 오프셋, 시간대가 포함된 날짜/시간을 나타냅니다.나는 그것을 어렵게 배워야만 했다.

위에서 설명한 사항에 약간의 추가 사항을 추가하면 다음과 같습니다.DateTime 구조체에는 다음과 같은 잘 알려지지 않은 필드도 포함되어 있습니다. 친절한 (적어도 나는 오랫동안 그것에 대해 몰랐습니다).기본적으로 시간이 현지인지 UTC인지를 나타내는 플래그일 뿐입니다.현지 시간에 대한 UTC와의 실제 오프셋을 지정하지 않습니다.이는 건축물이 어떤 의도로 건설되었는지를 나타내는 사실 외에도, 방법이 어떻게 진행되는지에도 영향을 미칩니다. ToUniversalTime() 그리고 ToLocalTime() 일하다.

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

날짜시간.지금 반환합니다 날짜 시간 현재 시스템 시간(시스템이 실행되는 시간대에 관계없이)을 나타내는 값입니다.그만큼 날짜시간.종류 재산은 될 것이다 DateTimeKind.Local

날짜시간.UtcNow 반환합니다 날짜 시간 시스템의 시간대에 관계없이 동일한 현재 협정시(UTC라고도 함)를 나타내는 값입니다.그만큼 날짜시간.종류 재산은 될 것입니다 DateTimeKind.Utc

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

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

다양한 시간대에 걸쳐 날짜와 시간을 저장하고 표시하기 위한 조언

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

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

그러나 DateTime.Now는 DST에 따라 변경되므로 연속형이거나 단일 값이 아닙니다.이는 DateTime.Now를 의미합니다. 동일한 시간 값이 두 번 발생하여 고객이 혼란스러운 상태에 빠질 수 있습니다.

애플리케이션이 실행되는 컴퓨터의 현지 시간이 필요한 경우(예: 유럽의 CEST) Now를 사용하세요.표준시를 원하는 경우 - UtcNow.그것은 단지 귀하의 선호도에 달려 있습니다. 아마도 사용자가 가지고 있는 시간을 사용하고 싶은 로컬 웹사이트/독립형 응용 프로그램을 만들 수 있을 것입니다. 따라서 해당 사용자의 시간대 설정인 DateTime.Now에 영향을 받습니다.

웹사이트의 경우 서버의 시간대 설정이라는 점을 기억하세요.따라서 사용자의 시간을 표시하는 경우 원하는 시간대를 가져오고 시간을 이동하거나(Utc 시간을 데이터베이스에 저장한 다음 수정) UTC를 지정하십시오.이를 잊은 경우 사용자는 다음과 같은 내용을 볼 수 있습니다. 3개월 전에 게시됨 그리고 가까운 미래의 시간 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top