6

Вопрос по timezone, c#, .net – undefined

Я использую метод TimeZoneInfo.ConvertTime для преобразования времени из одного в другое.

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Почему разница в часовом поясе составляет один час?

  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit ExceededisError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit ExceededTimeZoneInfoError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от LokiDil
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceededstackoverflow.com/questions/8839009/…

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от LokiDil
  • Error: User Rate Limit Exceededfrom/toTimeZoneError: User Rate Limit Exceeded

    от CodesInChaos
  • Error: User Rate Limit Exceeded

    от CodesInChaos
  • Error: User Rate Limit Exceeded

    от Boas Enkler
  • Error: User Rate Limit Exceeded

    от LokiDil
  • 1

    Error: User Rate Limit Exceeded

  • 3

    Error: User Rate Limit Exceeded

    .

  • 6

    Error: User Rate Limit ExceededtwoError: User Rate Limit Exceeded

    Error: User Rate Limit Exceeded

    using System;
    
    class Test
    {    
        static void Main()        
        {
            var id = "W. Australia Standard Time"; // Perth
            var zone = TimeZoneInfo.FindSystemTimeZoneById(id);
            var utc1 = new DateTime(2005, 12, 31, 15, 59, 0, DateTimeKind.Utc);
            var utc2 = new DateTime(2005, 12, 31, 16, 00, 0, DateTimeKind.Utc);
            var utc3 = new DateTime(2005, 12, 31, 23, 59, 0, DateTimeKind.Utc);
            var utc4 = new DateTime(2006, 1, 1, 0, 0, 0, DateTimeKind.Utc);
            Console.WriteLine(zone.GetUtcOffset(utc1));
            Console.WriteLine(zone.GetUtcOffset(utc2));
            Console.WriteLine(zone.GetUtcOffset(utc3));
            Console.WriteLine(zone.GetUtcOffset(utc4));
        }
    } 
    

    Error: User Rate Limit Exceeded

    08:00:00 // 3:59pm UTC
    09:00:00 // 4:00pm UTC
    09:00:00 // 11:59pm UTC
    08:00:00 // 12:00am UTC the next day
    

    Error: User Rate Limit ExceededmayError: User Rate Limit ExceededError: User Rate Limit Exceeded

  • 11

    Error: User Rate Limit Exceeded

    string tzid1 = "W. Australia Standard Time"; // Perth
    TimeZoneInfo tz1 = TimeZoneInfo.FindSystemTimeZoneById(tzid1);
    
    string tzid2 = "Sri Lanka Standard Time"; // Sri Jeyawardenepura
    TimeZoneInfo tz2 = TimeZoneInfo.FindSystemTimeZoneById(tzid2);
    
    DateTime dt1 = new DateTime(2006, 1, 1, 2, 0, 0);
    Debug.WriteLine(dt1); // 1/1/2006 2:00:00 AM
    DateTime dt2 = TimeZoneInfo.ConvertTime(dt1, tz1, tz2);
    Debug.WriteLine(dt2); // 12/31/2005 11:30:00 PM
    DateTime dt3 = TimeZoneInfo.ConvertTime(dt2, tz2, tz1);
    Debug.WriteLine(dt3); // 1/1/2006 3:00:00 AM
    

    DateTimeOffset

    string tzid1 = "W. Australia Standard Time"; // Perth
    TimeZoneInfo tz1 = TimeZoneInfo.FindSystemTimeZoneById(tzid1);
    
    string tzid2 = "Sri Lanka Standard Time"; // Sri Jeyawardenepura
    TimeZoneInfo tz2 = TimeZoneInfo.FindSystemTimeZoneById(tzid2);
    
    DateTime dt = new DateTime(2006, 1, 1, 2, 0, 0);
    DateTimeOffset dto1 = new DateTimeOffset(dt, tz1.GetUtcOffset(dt));
    Debug.WriteLine(dto1);  // 1/1/2006 2:00:00 AM +08:00
    DateTimeOffset dto2 = TimeZoneInfo.ConvertTime(dto1, tz2);
    Debug.WriteLine(dto2);  // 12/31/2005 11:30:00 PM +05:30
    DateTimeOffset dto3 = TimeZoneInfo.ConvertTime(dto2, tz1);
    Debug.WriteLine(dto3);  // 1/1/2006 3:00:00 AM +09:00
    

    +09:00+08:00.

    string tzid1 = "W. Australia Standard Time"; // Perth
    DateTimeZone tz1 = DateTimeZoneProviders.Bcl[tzid1];
    
    string tzid2 = "Sri Lanka Standard Time"; // Sri Jeyawardenepura
    DateTimeZone tz2 = DateTimeZoneProviders.Bcl[tzid2];
    
    LocalDateTime ldt1 = new LocalDateTime(2006, 1, 1, 2, 0, 0);
    ZonedDateTime zdt1 = ldt1.InZoneStrictly(tz1);
    Debug.WriteLine(zdt1.ToDateTimeOffset()); // 1/1/2006 2:00:00 AM +08:00
    ZonedDateTime zdt2 = zdt1.WithZone(tz2);
    Debug.WriteLine(zdt2.ToDateTimeOffset()); // 12/31/2005 11:30:00 PM +05:30
    ZonedDateTime zdt3 = zdt1.WithZone(tz1);
    Debug.WriteLine(zdt3.ToDateTimeOffset()); // 1/1/2006 2:00:00 AM +08:00
    

    isn'tTimeZoneInfo.ConvertTimeWhammy #1.

    string tzid1 = "Australia/Perth";
    DateTimeZone tz1 = DateTimeZoneProviders.Tzdb[tzid1];
    
    string tzid2 = "Asia/Colombo"; // Sri Jeyawardenepura
    DateTimeZone tz2 = DateTimeZoneProviders.Tzdb[tzid2];
    
    LocalDateTime ldt1 = new LocalDateTime(2006, 1, 1, 2, 0, 0);
    ZonedDateTime zdt1 = ldt1.InZoneStrictly(tz1);
    Debug.WriteLine(zdt1.ToDateTimeOffset()); // 1/1/2006 2:00:00 AM +08:00
    ZonedDateTime zdt2 = zdt1.WithZone(tz2);
    Debug.WriteLine(zdt2.ToDateTimeOffset()); // 1/1/2006 12:00:00 AM +06:00
    ZonedDateTime zdt3 = zdt1.WithZone(tz1);
    Debug.WriteLine(zdt3.ToDateTimeOffset()); // 1/1/2006 2:00:00 AM +08:00
    

    Whammy #2+06:00was+06:00+05:30

    The Windows TimeZoneInfo.ConvertTime function appears to be flawed. The Windows Time Zone data for the "Sri Lanka Standard Time" zone is incorrect.

    All the better to just use Noda Time and TZDB always!

    UPDATE

    "W. Australia Standard Time"TimeZoneInfo

    muchTimeZoneInfo.GetIsDaylightSavingsFromUtc

    endTime1/2/2005startTime12/4/2005

    .