2011-03-25 3 views
0

나는 세계에서 다른 시간대에 잠재적으로 영향을 미칠 응용 프로그램을 가지고 있는데, 몇 가지 예를 들면 독일 & UK에서 실행됩니다.호스팅 서버의 시간대와 별도로 DateTime의 변환을 처리하는 방법은 무엇입니까?

이제는 GMT 날짜이므로 datetime 개체를 해석해야하고 이에 상응하는 UTC datetime을 가져야한다는 요구 사항이 있습니다. 예를 들어, 응용 프로그램이 독일에서 실행중인 경우에도 DateTime을 GMT로 해석하고 서버에 저장하기 전에 UTC로 변환해야합니다. 예를 들어 DST 시프트도 처리됩니다. 나는이 같은 날짜 객체가있는 경우

이 : 예를 들어

var date = new Datetime(2011,03,28,01,00,00)이 그것에 변환해야이 경우 해당 UTC.In의 IT가, 28/03/2011 01:00:00 +01:00:00해야하지만 내 서버, 발견 된 저장된 날짜를 읽는 동안 그것은 28/03/2011 01:00:00 +02:00:00입니다. 내 UI가 현재 독일에서 실행 중이며 날짜가 현지 날짜 (CET)로 해석 된 것으로 의심됩니다.

정확하게 변환하는 방법을 알려주시겠습니까?

+2

GMT는 UTC – V4Vendetta

+0

음과 같다, 정확히 ... http://en.wikipedia.org/wiki/Coordinated_Universal_Time ...하지만 충분히 가깝습니다. –

+0

@Hightechrider : "UTC가 1972 년 1 월 1 일에 여러 지역의 주요 기준 시간 규모 또는 시민의 기준으로 GMT를 대체 했으므로"충분히 좋을 것입니다! – V4Vendetta

답변

2

보통 내가 당신을 제안,

  • 따라서 늦게 가능한 시간대를 인식하는 사용자 친화적 인 형식이 렌더링 UTC로

    • 저장 날짜 시간에 가장 좋은 방법은 간주 이 아닌DateTime.Now에 의존하지만 대신 DateTime.UtcNow을 사용하는 것이 좋습니다.

      
      string timeZoneInfoId = "Romance Standard Time"; // Or any valid Windows timezone id ;-) 
      var tzi = TimeZoneInfo.FindSystemTimeZoneById(timeZoneInfoId); 
      
      //Build a DateTimeOffset which holds the correct offset considering the user's timezone 
      var dto = new DateTimeOffset(TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, timeZoneInfo), timeZoneInfo.GetUtcOffset(utcDateTime)); 
      
      var formated = string.Format("{0} {1} ({2})", dto.ToString("d"), dto.ToString("T"), dto.ToString("zzz")); //Or whatever format that fits you 
      

      참고 :

      하면 다음 사용하여 해당 사용자에게 친숙한 형식의 UTC 날짜를 렌더링 할 수, 각 사용자가 자신의 시간대를 선택 (A 환경 설정을 통해/옵션 패널)를 결정 할 수 있도록 제공 : 모든 유효한 Windows timeZoneId 목록을 찾을 수 있습니다 here.

      당신이 TimeZoneInfo의 목록을 검색 TimeZoneInfo.GetSystemTimeZones()을 사용할 수 있습니다, 그 렌더링 시간대를 선택하는 사용자에 대한 선택 목록을 추가 기꺼이 제공, 다음 옵션의 값으로 각 TimeZoneInfo 중의 Id 속성을 사용하고 ToString() 전화 메서드를 호출하여 각 옵션의 내용을 렌더링합니다.

      당신의 선택 목록이 기본 Windows보다 비슷한 방식으로 렌더링 것 :

      Windows time zones

    1

    쿼리의 첫 번째 부분은 DateTime 개체에서 UTC 시간을 가져올 수 있습니다.

    DateTime dt = DateTime.Now; 
    

    dt.ToUniversalTime().ToString()은 UTC 시간을 제공합니다.

    이제 로컬 시간과 동일하게 나타내려면 자바 스크립트를 통해 클라이언트 측에서 오프셋을 가져와야합니다.

    var now = new Date(); 
    var offset = now.getTimezoneOffset(); 
    

    같은 뭔가 지금 당신이 추가하거나이 방법에서 얻을분을 차감하여 클라이언트에 대한 시간을 표시하는 오프셋 사용할 수 있습니다.

    희망이 도움이됩니다.

    +1

    내가 선호하는'DateTime.UtcNow'도 있습니다. 나는 utc-> local 변환이 손실 적이기 때문에 local-> utc이 가능한 모든 시간 동안 작동하지 않는다고 생각한다. – CodesInChaos

    +0

    @CodeInChaos : 왜 utc-> local은 손실이 있다고 생각합니까? – V4Vendetta

    +0

    @Mike -이 기능이 도움이 되었습니까? – V4Vendetta

    0

    날짜 + = TimeZone.CurrentTimeZone.GetUtcOffset (날짜);

    관련 문제