.NET Core — Значение тиков даты и времени рассчитывается по-разному на платформах Windows и Linux?

#.net #linux #windows #.net-core

Вопрос:

Я столкнулся с неожиданным поведением во время выполнения некоторых тестов, связанных с часовыми поясами.

Запустив приведенный ниже тест с помощью xUnit и моей IDE (Rider) в Windows, я получаю разные значения тиков для приведенных ниже локальных дат и дат UTC.

Когда я запускаю приведенный ниже тест на Ubuntu WSL (как часть сборки Docker), значения совпадают. И поэтому, чтобы следующий тест прошел на обеих платформах, я должен включить проверку операционной системы Windows.

Как мои локальные окна, так и экземпляр Ubuntu WSL настроены для локального часового пояса (Лондон/Европа, на момент написания статьи в BST).

Рассчитываются ли галочки по-разному для времени выполнения .NET на платформах Windows и Linux?

Согласно: http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/fde7e5b0-e2b9-4d3b-8a63-c2ae75e316d8

Дата-время.Тики задокументированы как «количество 100-наносекундных интервалов, прошедших с 12:00:00 полуночи 1 января 0001 года». Это 1 января 0001 года по местному времени. Если вы преобразуете дату и время в UTC, Тики будут представлять собой количество интервалов в 100 наносекунд, прошедших с 12:00:00 полуночи 1 января 0001 UTC. Потенциально отличается от 1 января 0001 по местному времени, следовательно, значения двух тиков будут разными.

… но в Ubuntu WSL значение галочек одинаковое.

 [Fact]
public void TestTimeZoneWindowsLinuxTicksBehaviour()
{
    DateTime compareDateTimeLocal2 = new DateTime(2001, 08, 01, 06, 0, 0, DateTimeKind.Local);

    DateTime compareDateTimeUtc2 = compareDateTimeLocal2.ToUniversalTime();

    bool isWindows = System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows);

    if (isWindows)
    {
        Assert.NotEqual(compareDateTimeLocal2.Ticks, compareDateTimeUtc2.Ticks);
    }
    else
    {
        Assert.Equal(compareDateTimeLocal2.Ticks, compareDateTimeUtc2.Ticks);
    }
}
 

Комментарии:

1. Каково смещение часового пояса Ubuntu? Я подозреваю, что это UTC

2. На macOS эти два значения отличаются ожидаемой суммой

3. Смещение часового пояса в Unbuntu равно (UTC 01:00) от $ date "%Z %z" возврата BST 0100