3

我最大的烦恼之一是 API 没有做普通用户直觉 API 会做的事情。

典型案例:.NET 的DateTime.ToUniversalTime。文档很吓人:

在 Windows XP 系统上,从本地时间转换为 UTC 时,ToUniversalTime 方法仅识别当前的调整规则。因此,当前调整规则生效之前的时段转换可能无法准确反映当地时间与 UTC 之间的差异。

后来继续说:

在 Windows XP 系统上,ToUniversalTime 方法仅识别本地时区的当前调整规则,它适用于所有日期,包括下级日期(即早于当前调整规则开始日期的日期) . 在 Windows XP 上运行且需要历史准确的本地日期和时间计算的应用程序必须通过使用 FindSystemTimeZoneById 方法检索与本地时区对应的 TimeZoneInfo 对象并调用其 TimeZoneInfo.ConvertTimeToUtc(DateTime, TimeZoneInfo) 方法来解决此问题。

这必须是有史以来最搞笑的文档句子。谁在使用 ToUniversalTime() 时不需要准确的本地日期和时间计算?为什么不直接用 ObsoleteAttribute 标记这个方法呢?

无论如何,我正在寻找一种工具,我可以用程序集级元数据标记程序集,例如 [RequiresHistoricallyAccurateLocalDateAndTimeCalculationsAttribute]。然后,如果它找到 ToUniversalTime() 的任何实例,将它们标记为编译器错误,就像 C# 不允许我在没有不安全注释的情况下直接访问非托管代码一样。

4

2 回答 2

3

这个要求似乎更适合代码分析而不是属性修饰或编译错误。

见: http: //www.binarycoder.net/fxcop/html/index.html

这必须是有史以来最搞笑的文档句子。谁在使用 ToUniversalTime() 时不需要准确的本地日期和时间计算?为什么不直接用 ObsoleteAttribute 标记这个方法呢?

鉴于日期/时间计算的性质/复杂性,这并不是一个特别可怕/令人震惊的启示。

如果我在 Windows XP 或任何其他操作系统上进行 UTC 处理,我会首先熟悉平台的特性,就像我对任何其他复杂操作一样。给定的替代方案 ( TimeZoneInfo) 也不是防弹的,因为它高度依赖于平台。

关于TimeZoneInfo......我指的是操作系统的平台依赖性。

当您开始使用时区转换(许多与日期相关的问题源于此)时,您可以使用FindSystemTimeZoneById 之类的方法。从好的方面来说,方法名称清楚地表明您正在使用本地系统(所以它可能比 更不模棱两可ToUniversalTime())。但是,操作系统会查询时区列表,因此操作系统可能会返回一个错误列表(我相信在 Windows 中值存在于注册表中),该列表已过时(可能是修补错误的机器), ETC。

我注意到 Windows XP 似乎也存在歧义问题TimeZoneInfo(请参阅“来电者须知”):

在 Windows XP 系统上 (...) 因此,该方法可能无法准确报告当前调整规则生效之前的时间偏移量。有关详细信息,请参阅本地属性中的呼叫者备注部分。

而且(正如您所指出的),底层平台实现可能存在缺陷。

此外,时区由字符串 ID 引用。虽然这些似乎没有太大变化,但仍有可能在应用程序中存储不再匹配时区的“魔术字符串”。

至少这是我发现的,尽管我对这个主题的了解远非详尽无遗。我在 Windows Server 上使用 .Net 和通用时间的经验是积极的。

My point is that there is usually a good reason why the BCL (base class library) authors implemented things a certain way, even if it does lead to unexpected behavior. The alternative would be to omit the functionality altogether.

If you have identified this as a pitfall, then I think it's commendable that you are taking the time to mitigate it.

于 2012-08-14T20:15:43.790 回答
1

使用 FxCop 工具让自己成为朋友。据我了解,这就是您要寻找的。它是一个静态分析工具,可以使用依赖于 FxCop API 的 C# 代码表示的自定义规则进行扩展。

于 2012-08-14T20:15:09.007 回答