Dev Blog

Работа с часовыми поясами

При конвертации дат из разных часовых поясов главное учесть что в разное время смещение тоже разное.

Какое именно сейчас смещение, можно определить через:

TimeZoneInfo.FindSystemTimeZoneById(zoneName).GetUtcOffset(date);

Для наглядности приведу тест показывающий как меняется часовое смещение со временем:

    [Theory]
    [InlineData("2017-11-16T10:02:27.9362420+00:00", "2017-11-16T13:02:27.9362420+03:00", 3)]
    [InlineData("2012-11-15T10:31:05.0307284+00:00", "2012-11-15T14:31:05.0307284+04:00", 4)]
    public void DateTimeOffsetTest(DateTimeOffset date, DateTimeOffset expectConverted, int expectOffset)
    {
        var moscowTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Russian Standard Time");
        var offset = moscowTimeZone.GetUtcOffset(date);
        var converted = TimeZoneInfo.ConvertTime(date, moscowTimeZone);
        
        Assert.Equal(expectConverted, converted);
        Assert.Equal(expectOffset, offset.TotalHours);
    }