Как добавить часы к дате с учетом летнего времени - PullRequest
0 голосов
/ 01 ноября 2018

Как добавить часы к дате с учетом летнего времени?
У нас есть сдвиг во времени 27 октября, поэтому я ожидаю получить 19 (или 21) час в результате.
Как я могу это сделать?

  var test = new DateTimeOffset(new DateTime(2018, 10, 26, 20, 0, 0));
  var test2 = test.AddHours(48);

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Самый простой подход - конвертировать в UTC, добавить туда 48 часов, а затем конвертировать обратно. Таким образом, вы применяете соответствующее смещение часового пояса в каждой точке. Например:

using System;

class Test
{
    static void Main()
    {
        var test = new DateTimeOffset(new DateTime(2018, 10, 26, 20, 0, 0));
        var test2 = test.AddHours(48);
        var test3 = test.ToUniversalTime().AddHours(48).ToLocalTime();
        Console.WriteLine(test2);
        Console.WriteLine(test3);
    }
}

Результаты в часовом поясе Лондона:

28/10/2018 20:00:00 +01:00
28/10/2018 19:00:00 +00:00

Обратите внимание, что в некоторых случаях первоначальное местное время может быть пропущено или неоднозначно - вам следует подумать, что делать дальше. Я лично (по понятным причинам) рекомендую вместо этого мой проект Noda Time , где есть больше типов для представления различных типов значений, с которыми вы будете работать. Решения, например, как справляться с пропущенными / неоднозначными временами, более очевидны, потому что у вас в основном есть , чтобы сделать их.

0 голосов
/ 01 ноября 2018

Конвертировать DateTime в UTC:

var dateLocal = new DateTime(2018, 10, 26, 20, 0, 0);
var dateUTC = dateLocal.ToUniversalTime();

Добавьте часы:

dateUTC = dateUTC.AddHours(48);

Конвертировать в местное время:

dateLocal = dateUTC.ToLocalTime();
0 голосов
/ 01 ноября 2018

Существует встроенный способ проверки на летнее время, вы можете сделать арифметику, основываясь на этом:

var test = new DateTimeOffset(new DateTime(2018, 11, 4, 0, 0, 0));
var newTime = test.AddHours(2);

if (test.LocalDateTime.IsDaylightSavingTime() && 
     !newTime.LocalDateTime.IsDaylightSavingTime())
        {
            test = test.AddHours(-1);
        }

Вы также можете посмотреть на nodatime .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...