linux Ubuntu和Windows之间的TimeZoneInfo问题

0aydgbwb  于 2023-08-03  发布在  Linux
关注(0)|答案(1)|浏览(106)

请看下面的C#测试:

using FluentAssertions;
using FluentAssertions.Extensions;

namespace Tests.Unit.Api;

[TestFixture]
[Category("Unit")]
public class Tests
{
    [TestCase(1953,4,12,"21:53")] // fails
    [TestCase(1953,2,12,"20:53")] // succeeds
    [TestCase(2023,4,12,"21:53")] // succeeds
    [TestCase(2023,2,12,"20:53")] // succeeds
    public void WhyDoesThisFail(int year, int month, int day, string expectedTime)
    {
        // Arrange
        var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Europe/Berlin");
        var dateTime = new DateTime(year,month,day,19,53,3,DateTimeKind.Utc);

        // Act
        var result = TimeZoneInfo.ConvertTimeFromUtc(dateTime, timeZoneInfo);

        // Assert
        TimeOnly.FromDateTime(result).ToShortTimeString().Should().Be(expectedTime);
    }
}

字符串
当在我的Win 11机器上在Rider和Visual Studio中或通过dotnet test运行此测试时,它成功了,没有问题。
但是在我的GitHub Action上运行Ubuntu 22.04.2 LTS,它失败了:

Failed WhyDoesThisFail [2 ms]
  Error Message:
   Expected TimeOnly.FromDateTime(result).ToShortTimeString() to be "21:53", but "20:53" differs near "0:5" (index 1).


我已经发现它似乎与夏令时有关,但我想知道...
1.为什么会这样呢?
1.如何在不引入任何平台特性的情况下稳定此代码?
谢谢!
在.NET 7.0.305上运行

px9o7tmv

px9o7tmv1#

我提交了this GitHub issue,下面是响应:
当我在Windows上查看timeZoneInfo.GetAdjustmentRules() for Europe/Berlin时,我看到:

Rule valid: 1. 1. 0001 0:00:00 - 31. 12. 9999 0:00:00
DST period: Sunday, 5. week in 3. month at 02:00:00 - Sunday, 5. week in 10. month at 03:00:00
DST delta: 01:00:00

字符串
即Windows简化了事情,并假设时区始终遵循其当前的DST规则。
另一方面,在Linux(使用tzdb)上,在1949年到1980年之间没有DST调整规则,这似乎是正确的(德国在此期间没有遵守DST)。
所以Windows的结果是不正确的,但.Net对此无能为力,因为它只是从Windows获取数据。

相关问题