C#-.net核心日期时间转换为UTC分钟偏移量
我正在测试一个代码,发现了一个非常奇怪的行为。当我使用C#-.net核心日期时间转换为UTC分钟偏移量,c#,.net,datetime,.net-core,C#,.net,Datetime,.net Core,我正在测试一个代码,发现了一个非常奇怪的行为。当我使用DateTime.MinValue时,将分钟添加到其中,并将其转换为UTC,我的本地时区和UTC之间似乎相差58分钟。我在中欧(冬季+1,夏季+2)。这怎么可能是58分钟?我希望是1小时,而不是58分钟。我在Linux上使用.NETCore var x1=DateTime.MinValue.AddMinutes(61); 变量x1ticks=x1.Ticks; 变量x1kind=x1.Kind; 变量y1=x1.ToUniversalTime
DateTime.MinValue
时,将分钟添加到其中,并将其转换为UTC,我的本地时区和UTC之间似乎相差58分钟。我在中欧(冬季+1,夏季+2)。这怎么可能是58分钟?我希望是1小时,而不是58分钟。我在Linux上使用.NETCore
var x1=DateTime.MinValue.AddMinutes(61);
变量x1ticks=x1.Ticks;
变量x1kind=x1.Kind;
变量y1=x1.ToUniversalTime();
变量y1ticks=y1.滴答声;
变量y1kind=y1.Kind;
var z1=时区信息转换TimeToutc(x1,时区信息本地);
var z1ticks=z1.Ticks;
var z1kind=z1.Kind;
带有计算值的代码段:
58分钟大约是捷克共和国布拉格()与UTC的偏移量。我猜你们当地的时区是
欧洲/布拉格
TimeZoneInfo
从计算机上的时区数据库中查找时区数据。在Linux机器上(我认为是所有POSIX机器),默认的是IANA。在Windows计算机上,默认情况下,您将查询Windows时区数据库
无论如何,重要的是,根据IANA数据库,本地时区在DateTime.MinValue
加上61分钟的UTC偏移量加上58分钟
// prints 00:58:00
Console.WriteLine(TimeZoneInfo.FindSystemTimeZoneById("Europe/Prague").GetUtcOffset(DateTime.MinValue));
另见
IANA数据库实际上说偏移量是57分44秒,但是.NETCore实际上把它作为一个实现细节,因为它不支持秒。我找到了以下解释它的源代码:
private static TimeSpan TZif_CalculateTransitionOffsetFromBase(TimeSpan transitionOffset, TimeSpan timeZoneBaseUtcOffset)
{
TimeSpan result = transitionOffset - timeZoneBaseUtcOffset;
// TZif supports seconds-level granularity with offsets but TimeZoneInfo only supports minutes since it aligns
// with DateTimeOffset, SQL Server, and the W3C XML Specification
if (result.Ticks % TimeSpan.TicksPerMinute != 0)
{
result = new TimeSpan(result.Hours, result.Minutes, 0);
}
return result;
}
你是通过设置断点来运行的吗?如果有人需要+0:57:44,他们总是可以使用我的野田佳彦时间项目-我刚刚检查过,这报告正确:)