>

시간대 오프셋 (분)이 있고 시간대를 결정해야하는 시나리오가 있습니다. 모든 데이터를 사용할 수 없다는 것을 알고 있습니다 (예 : 오프셋이 -240 분인 여러 시간대가있을 수 있음). "최상의 추측"이 허용됩니다.

첫 번째 패스는 다음과 같습니다 :

foreach (var info in TimeZoneInfo.GetSystemTimeZones())
{
    if (info.BaseUtcOffset.TotalMinutes == timezoneOffset)
    {
         // do something here if this is a valid timezone
    }
}

이 종류는 효과가 있지만 일광 절약 효과를 고려해야합니다. 이 끔찍한 핵을 추가했습니다 :

foreach (var info in TimeZoneInfo.GetSystemTimeZones())
{
    var extra = info.IsDaylightSavingTime(DateTime.Now) ? 60 : 0;
    if (info.BaseUtcOffset.TotalMinutes + extra == timezoneOffset)
    {
         // do something here if this is a valid timezone
    }
}

일광 절약 시간이 적용되지 않고 DST 동안 약 70 % 정확할 때 사용자에게 정확한 시간을 보여줄 수 있다는 점에서 "충분히 작동"합니다. 아직도 ... 이것은 내 시선에 끔찍한 코드입니다.

이 작업을 수행하는 더 좋은 방법이 있습니까? 더 많은 우아함이 좋을 것이고, 더 높은 정확성이 더 좋습니다.

업데이트

기술적으로 Javascript가 날짜와 관련하여 얻을 수있는 모든 정보에 액세스 할 수 있습니다. "offset"이라는 숨겨진 필드를 배치 한 페이지가 있습니다. 오프셋 필드를 DateTime (). getTimezoneOffset ()으로 채우는 JQuery 함수가 있습니다. DateTime 객체에 도움이 될만한 내용이 없지만 아이디어를위한 다른 길을 열 수 있습니다.

  • 답변 # 1

    짧은 대답 : 할 수 없습니다.

    일광 절약 시간 제로 불가능합니다. 예를 들어 UTC 오프셋만으로는 여름에 아리조나와 캘리포니아 또는 겨울에 아리조나와 뉴 멕시코의 차이를 확인할 수있는 방법이 없습니다 (애리조나가 DST를 준수하지 않기 때문에).

    다른 국가들이 DST를 관찰하는 시간 문제도있다. 예를 들어 미국에서 DST는 유럽보다 일찍 시작하고 늦게 종료됩니다.

    근접 추측이 가능하지만 (예 : +/- 시간) 사용자에게 시간을 표시하는 데 사용하는 경우 불가피하게 일부 시간에 잘못된 시간을 표시합니다.

    <시간>

    업데이트: 댓글에서 기본 목표는 사용자의 현지 시간대에 타임 스탬프를 표시하는 것 같습니다. 이것이 원하는 경우 시간을 UTC 타임 스탬프로 보낸 다음 Javascript를 사용하여 사용자의 브라우저에서 다시 작성해야합니다. 자바 스크립트가 활성화되어 있지 않은 경우에도 사용 가능한 UTC 타임 스탬프가 표시됩니다. 다음은이 질문에 사용 된 함수입니다.이 Greasemonkey 스크립트에서 사용했습니다. 필요에 맞게 조정할 수 있습니다.

    //@param timestamp An ISO-8601 timestamp in the form YYYY-MM-DDTHH:MM:SS±HH:MM
    //Note: Some other valid ISO-8601 timestamps are not accepted by this function
    function parseISO8601(timestamp)
    {
      var regex = new RegExp("^([\\d]{4})-([\\d]{2})-([\\d]{2})T([\\d]{2}):([\\d]{2}):([\\d]{2})([\\+\\-])([\\d]{2}):([\\d]{2})$");
      var matches = regex.exec(timestamp);
      if(matches != null)
      {
        var offset = parseInt(matches[8], 10) * 60 + parseInt(matches[9], 10);
        if(matches[7] == "-")
          offset = -offset;
        return new Date(
          Date.UTC(
            parseInt(matches[1], 10),
            parseInt(matches[2], 10) - 1,
            parseInt(matches[3], 10),
            parseInt(matches[4], 10),
            parseInt(matches[5], 10),
            parseInt(matches[6], 10)
          ) - offset*60*1000
        );
      }
      return null;
    }
    
    

    다음은 사용자의 현지 시간대로 파싱 된 타임 스탬프를 표시하기 위해 블로그에서 사용하는 기능입니다. 다시 말하지만 원하는 형식으로 조정할 수 있습니다.

    var weekDays = new Array("Sunday", "Monday", "Tuesday", "Wednesday",
            "Thursday", "Friday", "Saturday");
    var months = new Array("January", "February", "March", "April", "May", "June",
            "July", "August", "September", "October", "November", "December");
    function toLocalTime(date)
    {
      var hour = date.getHours();
      var ampm = (hour < 12 ? "am" : "pm");
      hour = (hour + 11)%12 + 1;
      var minutes = date.getMinutes();
      if(minutes < 10)
        minutes = "0" + minutes;
      return weekDays[date.getDay()] + ", "
           + months[date.getMonth()] + " "
           + date.getDate()          + ", "
           + date.getFullYear()      + " at "
           + hour                    + ":"
           + minutes                 + " "
           + ampm;
    }
    
    

  • 답변 # 2

    UTC로부터의 오프셋 만 알면 DST로 인해 현재 시간대를 알 수 없습니다. DST가 효과가 있었는지 여부를 추측하기 위해 시간의 일부를 살펴볼 수는 있지만, 다른 관할지에서 DST의 정의를 변경함에 따라 정치적 고려 사항으로 인해 거의 불가능합니다.

관련 자료

  • 이전 android - 오류/웹 콘솔 - catch되지 않은 typeerror : http://myoutubecom/:844에서 null의 'getitem'메소드를 호출 할 수 없습니다
  • 다음 c - SIGSEGV 신호를 무시할 수없는 이유는 무엇입니까?