我最大的烦恼之一是 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# 不允许我在没有不安全注释的情况下直接访问非托管代码一样。