2014-02-18 2 views
3

DateTime을 UTC로 변환하는 데 어려움을 겪고 있습니다. 개념과 모든 것, 올바르게 이해하지 못하는 것입니다. 내가 날짜 시간 문자열을 얻을 때날짜를 UTC로 올바르게 변환 한 다음 다시 변환하는 방법?

는 단순히

Convert.ToDateTime("7/10/2013").ToUniversalTime(); 

이것은 2013년 7월 10일 오전 4시 0분 0초 "로 기록합니다 할"2013년 7월 10일 "을 말한다 "데이터베이스에. 서버는 미국 동부 해안 (-5)에 있습니다. 물론 2013 년 7 월 동안 DST가 계속 관찰되고 있으므로 해당 시간 동안 오프셋 된 시간은 -4 일입니다. 추가 4 시간 4:00:00 AM "은 UTC로 기록됩니다.

나는 이것을 작성하고 있습니다. 포스트, 2014 년 2 월이고 DST가 적용되지 않아 현재 오프셋이 -5입니다. 내 신청서에서 신청서에서 내가 선택한 오프셋입니다.

"-7/에 -5 오프셋을 적용하면/오전 4시 0분 0초 2013 7/09/2013 오후 11시 0분 0초 ".

"날짜는 것이다 될 것 "

언젠가는 잘못되어 있습니다.

질문 # 1

그렇다면 내가 제대로 UTC 시간을 다시 변환합니까? 사용자가 2014 년 2 월에 현재 내 애플리케이션을로드 할 때 (현재 시간대 오프셋 -5 사용), 2011 년 7 월 10 일 4:00:00 AM은 2013 년 7 월 10 일에 2012 년 7 월 9 일이 아니라 여전히 7/10/2013이어야합니다.

나를 혼란스럽게하는 이유는 .ToUniversalTime()이 서버 DST를 고려하기 때문에 서버가있는 위치의 영향을받지 않는 "보편적 시간"이라는 하드 세트가 있습니까?

질문 # 나는 서쪽과 동쪽 해안 모두에서 서버가있는 경우, 데이터베이스에 쓰기 어떻게됩니까 2

? 동시 또는 서해안을 기준으로 UTC 시간을 기록한 경우 응용 프로그램에서 어떻게 알 수 있습니까?

기본적으로 코드에서 "7/10/2013 4:00:00 AM"은 동해안에서 만들어진 UTC 시간입니다 (미국의 경우 7/10/2013 00:00:00 AM을 나타냅니다). 동부 해안) 서쪽 해안에있는 서버가 아닙니다 (즉, 미국 서부 해안의 경우 7/09/2013 20:00:00 pm "임을 나타냅니다.)

미안하지만 바보 같은 소리가 나면 죄송합니다.

========== 최종 편집, 내 현재 솔루션 ===============

미모의 대답은 의미. 나는 두 가지를 혼동되었다한다 .

  1. 데이터베이스에 저장된 UTC 시간은 서버에 어떤 영향을 줍니까?
  2. 응용 프로그램 사용자에 대한 서버 시간의 관계는 무엇입니까?

내 응용 프로그램은 다른 표준 시간대의 사용자가 사용할 수 있으며 일부 사용자는 서버와 동일한 시간대에 있습니다. 일부 사용자는 그렇지 않습니다.일부는 이동하기 때문에 서버와 동일한 시간대에 있더라도 항상 다른 시간대에 착륙 할 수 있습니다. 내 응용 프로그램을 사용하면 시간대를 적절하게 반영하는 시간대를 선택할 수 있습니다.

원래 데이터베이스에서 UTC 시간을 가져 와서 사용자의 시간대 오프셋을 뺍니다. 미모가 제안했듯이, 그것은 잘못입니다. 이유는 위의 내 게시물에서 볼 수 있습니다.

내 원래의 해결책은 서버의 시간대 오프셋을 지금 당장 사용하고 UTC에서 더하기/빼기를 ​​사용하는 것이 었습니다. 그 역시 잘못된 것입니다. 2012 년 7 월 10 일을 기준으로 당시 서버의 오프셋은 -4였습니다. 2014 년 2 월 현재 서버 시간대 오프셋은 -5입니다. 그 해결책은 당연히 .ToLocalTime()을 사용하는 것입니다.

TimeZone.ToLocalTime()을 사용하는 방법에 대한 Mimo의 제안을 자세히 살펴보기 전에 여기에 임시로 문제를 해결했습니다.

  1. 데이터베이스에서 UTC 날짜를 가져 와서 서버가 표시하는 .ToLocalTime으로 변환하십시오. 그래서 서버로, 2011 년 7 월 10 일 4:00:00 AM은 7/10/2013 12:00:00 AM이됩니다.

  2. 서버 시간대 오프셋을 가져옵니다. 현재 동부 해안에 있기 때문에 현재 -5가 표시됩니다.

  3. 사용자의 시간대 오프셋을 가져옵니다. 서해안의 경우 사용자는 지금 -8을 선택합니다. 동해안의 경우, 사용자는 지금 -5를 선택하십시오.

  4. 사용자의 시간대와 서버의 시간대가 달라집니다. 서해안은 -3입니다. 동부 해안은 0입니다.

  5. 7/10/2013 12:00:00 AM의 차이를 뺍니다. 따라서 서해안의 기한은 2011 년 7 월 9 일 21:00:00 PM이며 동해안의 기한은 7입니다/10/2013 12:00:00.

모두 맞습니다.

고마워요. 이제 TimeZone.ToLocalTime()을 살펴보고 2-5 단계를 줄일 수 있는지 확인하십시오. 당신은 UTC로 데이터베이스에 로컬 시간을 저장하려면

+0

시간 (개체) 만 남겨두고 시간을 UTC로 표시하는 것과 관련하여 생각해보십시오. – Bit

+0

날짜/시간을 보유하고있는 열의 SQL 데이터 유형은 무엇입니까? – wdosanjos

답변

2

당신은 ToLocalTime()를 사용하여 로컬 시간으로 다시 변환합니다. 7 월에 날짜/시간이 표시되므로 DST로 인해 5 시간이 아닌 4 시간으로 이동합니다.

서버에 연결하는 클라이언트 (예 : 웹 브라우저)가있는 경우 궁극적으로 날짜가 아닌 클라이언트의 로컬 시간으로 변환 된 날짜/시간을 원합니다. 이렇게하려면 가장 좋은 방법은 TimeZone.ToLocalTime()을 사용하는 것입니다. 클라이언트가있는 표준 시간대를 보내고 항상 해당 시간대로 직접 변환하십시오.

절대 시간을 더하거나 뺍니다. 항상 시간대를 살펴보고 TimeZoone.ToLocalTime()을 사용하십시오.DST가 포함되면 시간을 더하거나 뺄 수 없습니다.

브라우저 내부에서 현재 (로컬) 표준 시간대를 가져올 수 없습니다. 클라이언트가 브라우저 인 경우 일종의 구성에서 표준 시간대를 가져 오거나 사용자가 입력해야합니다.

다른 표준 시간대를 처리하기 시작한 후에는 더 이상 날짜가 없으므로 항상 전체 날짜를 처리해야합니다. 시간대를 제거하거나 느슨하게하면 모든 전환이 더 이상 작동하지 않습니다. .

질문 2 : UTC 시간은 특정 시간대를 기반으로하지 않으므로 보편적이며 따라서 UTC로 변환하면 서버의 시간대에 대해 더 이상 걱정할 필요가 없습니다.

+0

감사합니다. MiMo. 내가 두 가지를 놓친 것 같아. 1. 서버의 .ToLocalTime()을 변환합니다. 2. 서버를 기준으로 응용 프로그램 사용자의 시간대를 조정합니다. 같은 시간대에있는 경우 서버의 현지 시간을 사용하십시오 (다른 시간대에있는 경우). 차이를 계산하십시오. – Liming

+0

@Liming : 조금 대답을 넓혔습니다 – MiMo

+0

MiMo. 알았다!! 그것은 전체적으로 많이 설명합니다. TimeZone.ToLocalTime()이 사용자의 브라우저와 비교하여 어떻게 작동하는지 살펴보아야합니다. – Liming

8

먼저 표준시로 변환해야합니다

DateTime dbDateTime = localDateTime.ToUniversalTime(); 
... store dbDateTime in the database ... 

를 데이터베이스에서 다시 읽을 때, 그것의 종류의 속성이됩니다 지정되지 않음으로 설정하십시오. 명시 적으로 UTC로 그 종류 속성을 설정해야합니다

dbDateTime = ... get from database, e.g. (DateTime) reader["SomeDateTimeColumn"] 
dbDateTime = DateTime.SpecifyKind(dbDateTime, DateTimeKind.Utc); 

당신이 다음 로컬 시간으로 변환하려면

, 당신은 사용할 수 있습니다

DateTime localDateTime = dbDateTime.ToLocalTime(); 
+1

데이터가'datetime' 열에 저장되어 있지 않다고 가정합니다. 나중에 시간대 오프셋이 포함됩니다. – wdosanjos

+0

@ wdosanjos, 예 그 전제를 만들고 있습니다. – Joe

+0

감사합니다. 내가 두 가지를 놓친 것 같아. 1. 서버의 .ToLocalTime()을 변환합니다. 2. 서버를 기준으로 응용 프로그램 사용자의 시간대를 조정합니다. 같은 시간대에있는 경우 서버의 현지 시간을 사용하십시오 (다른 시간대에있는 경우). 차이를 계산하십시오. – Liming

0

으로 현지 시간으로 날짜를 저장 하시겠습니까? 당신이 날짜 부분 만 ablut 관심이 있다면, 당신은 아마 데이터베이스에 저장하기 전에 UTC로 해석 된 시간에 원하는 : 그것은이 UTC 이미의 데이터베이스에 저장있어

DateTime utcDate = DateTime.SpecifyKind(Convert.ToDateTime("7/10/2013"),DateTimeKind.Utc); 

그 방법 시간 구성 요소는 포함되지 않습니다.

+0

데이터베이스 SQL Server에 저장하는 방법은 무엇입니까? *** 유형 ***? 'datetime2'? –

1

나는 동일한 문제가있어서 다음과 같은 확장 방법을 사용했다.

public const string UTC = "UTC"; 

    public static DateTime Convert(this DateTime date, string fromZone, string toZone) 
    { 
     TimeZoneInfo to = TimeZoneInfo.FindSystemTimeZoneById(toZone); 
     TimeZoneInfo from = TimeZoneInfo.FindSystemTimeZoneById(fromZone); 
     return new DateTime(TimeZoneInfo.ConvertTime(date, from, to).Ticks, DateTimeKind.Unspecified); 
    } 

    public static bool IsDayLightSaving(this DateTime date, string zone) 
    { 
     TimeZoneInfo to = TimeZoneInfo.FindSystemTimeZoneById(zone); 
     return to.IsDaylightSavingTime(date); 
    } 

    public static DateTime ConvertToUTC(this DateTime date, string fromZone) 
    { 
     return date.Convert(fromZone, DateTime_Extension.UTC); 
    } 

    public static DateTime ConvertToLocal(this DateTime date, string toZone) 
    { 
     return date.Convert(DateTime_Extension.UTC, toZone); 
    } 

문제점은 실제로 현재 사용자 시간대를 찾는 것입니다. 이이 헤더에 전달되지 않기 때문에 나는 그들이이

+0

Kevin, 매우 유용합니다! 나는 "fromZone"과 "toZone"이 "동부 표준시"와 같은 영어 구문이라고 가정하고 있습니까? – Liming

+0

죄송합니다. 영역에 사용되는 문자열입니다. TimeZoneInfo.GetSystemTimeZones()는 "Samoa Standard Time"및 "Pacific Standard Time"등과 같은 모든 표준 시간대의 목록을 반환합니다. – KevDevMan

+0

기본적으로 나는 선택 목록을 렌더링하기 위해 아래 코드를 사용하여 자신의 프로필에 저장하는 목록을 사용자에게 제공합니다. ReadOnlyCollection tz = TimeZoneInfo.GetSystemTimeZones(); TimeZones = 새 목록 (); foreach (TimeZoneInfo tzi in tz) { TimeZones.Add (새 SelectListItem {Text = tzi.DisplayName, Value = tzi.Id}); } – KevDevMan

0

은 아마도 그것의 도움

희망을 등록 할 때 자신의 시간대를 선택하도록 요청하기로 결정했습니다 (당신은 자바 스크립트를 통해 얻을 수) 아침에 너무 일찍 및 나는 커피 한 잔 더 마실 필요가있다. 그러나 적어도 (디스플레이 용으로) TimeZoneInfo.ConvertTimeFromUtc을 사용하고 사용자가 원하는 TZ를 지정하는 해결책이 아닌가? 또는 ConvertTimeFromUtc가 원하는 TZ 로의 변환이 수행되는 날짜/시간을 고려하지 않는다는 것입니다. 더 깊이 생각해보십시오. 서버가 DST로 전환되었지만 사용자가 원하는 TZ가 아직없는 경우를 고려하면 누구라도 알 수 있습니까?

관련 문제