我该如何在.NET Core中使用TimeZoneInfo.GetAdjustmentRules()?

3
我正在编写一些处理时区的代码,自然而然地,我已经度过了糟糕的一天。具体来说,我真的很难获取时区的DST调整规则。根据TimeZoneInfo源代码,应该有一个名为.GetAdjustmentRules()的实例方法。它是在2015年初编写的。
然而,这个控制台应用程序无法编译以针对.net standard 1.6。
using System;

public class Program {
    public static void Main() {
        var tz = TimeZoneInfo.Local;
        Console.WriteLine(tz.GetAdjustmentRules());
    }
}

CS1061 'TimeZoneInfo'不包含定义为“GetAdjustmentRules”的方法,也没有接受类型为'TimeZoneInfo'的第一个参数的扩展方法“GetAdjustmentRules”(是否缺少使用指令或程序集引用?) timezonecore..NETCoreApp,版本=v1.0

事实上,通过反射检索方法列表时,我发现没有任何名为.GetAdjustmentRules()的方法。有趣的是,存在一个私有成员称为m_adjustmentRules,可能可以代替它。

但是,.GetAdjustmentRules()在哪里呢?如果无法使用它,是否有其他方法可以获取此信息?


DST规则是政治决策,它们不断变化。您需要一个包含这些规则的Oracle数据库和一家公司,该公司负责在这些规则更改时更新所有机器。在Windows中运行良好,在Unix中无法正常工作。您必须自己动手解决(BYOB)。 - Hans Passant
1
我看到有很多人正在投票将其关闭为“基于观点的”。我不同意那种观点。我试图调用在对象源代码中声明的方法,但编译器拒绝了我的程序。没有必要进行任何观点上的应用。我的问题是如何调用在源代码中声明的方法。 - recursive
我同意这个问题更多的是一个“技术为什么”,而不是质疑推理。弄清楚编译时引用、“鱼目混珠”的包和运行时依赖解析的工作方式,与“我想要这个在里面”的方面是不同的。也许,@recursive,你可以重新表述问题来突出这一点? - Martin Ullrich
@MartinUllrich:我修改了标题,并添加了一些可能会澄清的词语。 - recursive
1个回答

0
“诀窍”在于您不直接引用mscorlib,而是引用Microsoft.NETCore.App的依赖项中拉入的System.RuntimeSystem.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.0release/1.1.0都不包含GetAdjustmentRules()的定义,但是master分支包含该方法,因此您可以期望在.NET Core 1.2中使用该方法。

只要针对使用NETStandard.Library的库进行netstandard2.0的目标设置,该方法也将可用。有关在netstandard2.0中可用内容的参考资料当前在此处: https://github.com/dotnet/standard/tree/master/netstandard/ref


这个答案不完整。尝试了反射,这意味着引用程序集已经失效,并且检查实现的发布分支显示该方法存在。请注意,引用程序集不包含类的私有成员,但是私有成员确实存在。 - Joshua
参考程序集仅用于编译,它们仅包含存根成员以编译自身。但是它们为编译器提供了对实际实现中可用方法的引用,这在编译过程中不会被使用。(因此,这是公共方法在编译期间可供引用的直接原因。) - Martin Ullrich
我猜这个超出了你的理解范围。1.0版本中的实现似乎是https://github.com/dotnet/coreclr/blob/release/1.0.0/src/mscorlib/src/System/TimeZoneInfo.cs,并且有该方法,但反射仍然找不到它。 - Joshua
是的,我完全知道该函数有代码,谢谢您分享直接链接。然而,它被包含在一种允许“消费者”代码调用它的方式中。我的回答旨在指出在为 .NET Core 编写应用程序时可以查找什么实际可用。 - Martin Ullrich
两次未能解决的问题没有在反射中显示出来,有两次机会去修复它,但是没有修复,扣掉一分。 - Joshua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接