Информация об изменениях

Сообщение DateTimeOffset и DateTime от 13.07.2021 9:43

Изменено 14.07.2021 20:35 _NN_

DateTimeOffset и DateTime
Как правильно сравнивать DateTimeOffset полученный от дат созданных через new DateTime или полученных через DateTime.Now/Today ?
Иногда у них разные смещения часового пояса.

var newdate = new DateTime(2000,1,1);

newdate.Kind // Unspecified
new DateTimeOffset(newdate).Offset.Hours // 2


var now = DateTime.Now;

now.Kind // Local
new DateTimeOffset(now).Offset.Hours // 3
DateTimeOffset и DateTime
Как правильно сравнивать DateTimeOffset полученный от дат созданных через new DateTime или полученных через DateTime.Now/Today ?
Иногда у них разные смещения часового пояса.

var newdate = new DateTime(2000,1,1);

newdate.Kind // Unspecified
new DateTimeOffset(newdate).Offset.Hours // 2


var now = DateTime.Now;

now.Kind // Local
new DateTimeOffset(now).Offset.Hours // 3


Полный пример с временной зоной с летним временем и кодом запущенным летом:
using System;

namespace ConsoleApp1
{
    public static class Program
    {
        public static void Main()
        {
            var today = DateTime.Today;

            // Today YYYY-MM-01
            var firstDayMonth = new DateTimeOffset(
                new DateTime(today.Year, today.Month, 1, 0, 0, 0, today.Kind).AddHours(12));

            // Add year offset from 2000
            DateTimeOffset withYearOffset = firstDayMonth.AddYears(2000 - firstDayMonth.Year);

            // Add month offset from 1
            var withMonthOffset = withYearOffset.AddMonths(1 - withYearOffset.Month);

            // Add day offset from 1
            var calculated_dt_2000_1_1_12_0_0 = withMonthOffset.AddDays(1 - withMonthOffset.Day);

            // 01.01.2000 12:00:00 +03:00
            Console.WriteLine(calculated_dt_2000_1_1_12_0_0);

            var dt_2000_1_1_12_0_0 = new DateTimeOffset(new DateTime(2000, 1, 1).AddHours(12));

            // 01.01.2000 12:00:00 + 02:00
            Console.WriteLine(dt_2000_1_1_12_0_0);

            // False
            Console.WriteLine(calculated_dt_2000_1_1_12_0_0.Equals(dt_2000_1_1_12_0_0));
        }
    }
}


01.01.2000 12:00:00 +03:00
01.01.2000 12:00:00 +02:00
False