REST API 响应标准:时区

REST API response standards: Timezone

对于我们应该如何 return REST API 中的时区是否有任何 ISO 标准?

如果我 return 来自 ASP.NET WebApi 2 操作的 TimeZone 类型,框架将响应模型序列化为如下所示:

{
    "Id": "Dateline Standard Time",
    "DisplayName": "(UTC-12:00) International Date Line West",
    "StandardName": "Dateline Standard Time",
    "DaylightName": "Dateline Daylight Time",
    "BaseUtcOffset": "-12:00:00",
    "AdjustmentRules": null,
    "SupportsDaylightSavingTime": false
}

我见过的用于 REST API 的最常见的 ISO 标准是 ISO 8601 标准,尤其是那些在设计时考虑了互操作性的标准。​​

http://en.wikipedia.org/wiki/ISO_8601

微软时区,比如TimeZoneInfo对象使用的那些,确实可以序列化和反序列化,使用FromSerializedStringToSerializedString方法。他们也可以用他们的 Id 属性 来引用。这两个都在 TimeZoneInfo class 上,而不是 TimeZone class(你根本不应该使用它)。

但是,如果您发送 Microsoft 时区 ID 或时区的序列化形式,您的 API 将只能被其他 .NET 应用程序轻松使用。在 .NET 之外使用 Microsoft 时区会非常困难。

时区没有官方标准,但最接近的是 IANA time zone database. For example, to convey the US Eastern time zone, you would pass "America/New_York" in your API. You can read more about these in the timezone tag wiki, and also on Wikipedia 提供的标识符。 IANA 时区的好处在于它在每个平台上都实现了 - 因此虽然它不是标准,但它比仅适用于 Windows.

的 Microsoft 时区更具可移植性

对于 .NET,我知道使用 IANA 时区的最佳方式是通过 Noda Time 库。例如:

DateTimeZone tz = DateTimeZoneProviders.Tzdb["Asia/Tokyo"];

您可以在野田时代阅读更多内容user guide

如果您已经围绕 TimeZoneInfo 构建了系统,请考虑您可能仍希望在 API 层中转换为 IANA 时区。您可以阅读如何做到这一点 in this answer.