我正在编写一些代码来处理时区,所以自然地,我已经度过了糟糕的一天。特别是,我一直在努力获取时区的 DST 调整规则。根据TimeZoneInfo
的
源代码,应该有一个名为
.GetAdjustmentRules()
的实例方法。这是2015年初写的。
但是,此控制台应用程序不针对 .net 标准 1.6 进行编译。
using System;
public class Program {
public static void Main() {
var tz = TimeZoneInfo.Local;
Console.WriteLine(tz.GetAdjustmentRules());
}
}
CS1061“TimeZoneInfo”不包含“GetAdjustmentRules”的定义,并且找不到接受“TimeZoneInfo”类型的第一个参数的扩展方法“GetAdjustmentRules”(您是否缺少 using 指令或程序集引用?) timezonecore..NETCoreApp ,版本=v1.0
事实上,当我通过反射检索方法列表时,我发现没有一个叫
.GetAdjustmentRules()
。有趣的是,有 is 一个名为 m_adjustmentRules
的私人成员,我也许可以使用它。
但是
.GetAdjustmentRules()
在哪里?如果没有办法使用它,还有其他方法可以获取这些信息吗?
“技巧”是你不直接引用
mscorlib
,而是引用由System.Runtime
的依赖项拉入的Microsoft.NETCore.App
。 System.Runtime
的目的是抽象出实际实现所有 System.*
对象的内容。 CoreCLR 在 mscorlib
中有实现,并且调用将转发给它。例如,CoreRT 运行时在 System.Private.CoreLib
中有实现(其中一些是纯 C# 实现,是 CoreCLR 中的 C++/本机方法调用)。
因此,要确定您实际上可以在
TimeZoneInfo
上调用什么,请在此处查找 1.0:
https://github.com/dotnet/corefx/blob/release/1.0.0/src/System.Runtime/ref/System.Runtime.cs
分支
release/1.0.0
和 release/1.1.0
都不包含 GetAdjustmentRules()
的定义,但 master
分支包含,因此您可以预期该方法在 .NET Core 1.2 中可用。
当仅针对使用
netstandard2.0
的库定位 NETStandard.Library
时,该方法也可用。 netstandard2.0
中可用内容的参考目前位于此处:
https://github.com/dotnet/standard/tree/master/netstandard/ref
我使用时区的调整规则:
TimeSpan ltz = TimeZoneInfo.Local.BaseUtcOffset;
foreach (TimeZoneInfo.AdjustmentRule ar in TimeZoneInfo.Local.GetAdjustmentRules())
{
if (ar.DateStart < DateTime.Now && ar.DateEnd > DateTime.Now)
{
ltz += ar.DaylightDelta;
}
}