请看下面的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
上运行
1条答案
按热度按时间px9o7tmv1#
我提交了this GitHub issue,下面是响应:
当我在Windows上查看
timeZoneInfo.GetAdjustmentRules()
forEurope/Berlin
时,我看到:字符串
即Windows简化了事情,并假设时区始终遵循其当前的DST规则。
另一方面,在Linux(使用tzdb)上,在1949年到1980年之间没有DST调整规则,这似乎是正确的(德国在此期间没有遵守DST)。
所以Windows的结果是不正确的,但.Net对此无能为力,因为它只是从Windows获取数据。