внедрение флажка DST - PullRequest
       49

внедрение флажка DST

0 голосов
/ 03 марта 2020

Я устанавливаю флажок DST, когда флажок включен, часы отрегулированы, если требуется, и если флажок выключен, тогда DST не рассматривается,

Предположим, что когда начинается летнее время, часы переводятся на один час вперед. так что здесь у нас есть два раза - оригинальное время и скорректированное время Как я могу получить оба эти раза?

при New York (-04) Вкл. Sun, Mar 8 at 2:00 am DST запускается, поэтому часы настраиваются на +1 час. так что есть оригинальное время и скорректированное время в исходное время Sun, Mar 9 at 8:00 am часы показывают установленное время Sun, Mar 9 at 9:00 am Находясь в другом месте за пределами США, введя данные как current universal time Я хочу получить original time и DST adjusted time в Нью-Йорке.

Ввод / вывод - Обновление 03/05 Это правильный путь достижения выше

        string fromZoneId = "Asia/Kolkata";
        string toZoneId = "America/New_York";
        var fromDateTime = DateTime.Parse("March 9, 2020");//Input kolkata time

        LocalDateTime fromLocal = LocalDateTime.FromDateTime(fromDateTime);
        DateTimeZone fromZone = DateTimeZoneProviders.Tzdb[fromZoneId];
        ZonedDateTime fromZoned = fromLocal.InZoneLeniently(fromZone);

        DateTimeZone toZone = DateTimeZoneProviders.Tzdb[toZoneId];
        ZonedDateTime toZoned = fromZoned.WithZone(toZone);
        LocalDateTime toLocal = toZoned.LocalDateTime;

        var interval = toZoned.GetZoneInterval();
        var savings = interval.Savings;

        var originalTime = toLocal.ToDateTimeUnspecified().AddSeconds(-savings.Seconds);
        var dstAdjustedTime = toLocal.ToDateTimeUnspecified();

        Console.WriteLine("Actual:"+ originalTime);//output-dst off
        Console.WriteLine("Adjusted:"+ dstAdjustedTime);//output-dst on

Ответы [ 2 ]

1 голос
/ 15 марта 2020

Что бы я изменил в вашем примере, так это пребывание в Ноде, чтобы выполнить все преобразования, прежде чем перейти к BL C. Таким образом, вы можете воспользоваться методом WithOffset () и использовать StandardOffset вместо самостоятельной арифметики в BL C

Так что вместо

    DateTimeZone toZone = DateTimeZoneProviders.Tzdb[toZoneId];
    ZonedDateTime toZoned = fromZoned.WithZone(toZone);
    LocalDateTime toLocal = toZoned.LocalDateTime;

    var interval = toZoned.GetZoneInterval();
    var savings = interval.Savings;

    var originalTime = toLocal.ToDateTimeUnspecified().AddSeconds(-savings.Seconds);
    var dstAdjustedTime = toLocal.ToDateTimeUnspecified();

я бы сделал

    DateTimeZone toZone = DateTimeZoneProviders.Tzdb[toZoneId];
    ZonedDateTime toZoned = fromZoned.WithZone(toZone);
    LocalDateTime toLocal = toZoned.LocalDateTime;

    var interval = toZoned.GetZoneInterval();
    var standardOffset = interval.StandardOffset;

    var originalTime = toZoned.ToOffsetDateTime().WithOffset(standardOffset).ToDateTimeOffset();
    var dstAdjustedTime = toLocal.ToDateTimeUnspecified();

Затем вы можете проверить, как лучше отображать исходное время, потому что теперь это DateTimeOffset, а не DateTime. Но я бы даже попытался использовать методы сериализации NodaTime вместо перехода к DateTime или DateTimeOffset

0 голосов
/ 25 марта 2020

Я устанавливаю флажок DST, когда флажок включен, часы отрегулированы, если необходимо, и если флажок выключен, тогда DST не рассматривается ...

У вас сразу возникла проблема. Вы не должны реализовывать такой флажок. Требование ошибочно. Каждая реализация, которая делает это, сломана. Это просто не то, как работают часовые пояса.

Например, скажем, я выбрал "America/New_York", а затем отключил DST. Что это хотя бы значит? Все "America/New_York" по определению в настоящее время используют DST. Вы можете применить его к более ранней дате, которая не была (скажем, в 1944 году), или вы можете выбрать другой часовой пояс, который в настоящее время находится в UT C -5 без DST, например, "America/Jamaica". Но вы не можете произвольно узнать, действует ли DST или нет.

Другими словами, у человека, живущего в определенной области, нет выбора, применять ли DST лично или нет для себя лично. , Это зависит от правительства, и эти установленные правила отражаются в данных часового пояса для данного идентификатора.

...