【问题标题】:REST API response standards: TimezoneREST API 响应标准:时区
【发布时间】:2015-07-29 22:50:18
【问题描述】:

对于我们应该如何在 REST API 中返回时区,是否有任何 ISO 标准?

如果我从 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
}

【问题讨论】:

  • 我不知道。但是时区并不是真正的实体,它更像是一个由时区偏移量、名称(可以是国际化的或不国际化的)以及可能其他感兴趣的属性定义的对象。我会根据用例的最低要求来定制 API 返回的内容。根据我的经验,坚持超越 UTC 或 Unix 时间的计时标准只会增加工作量,并使结果更容易出现问题。

标签: rest asp.net-web-api timezone json.net asp.net-web-api2


【解决方案1】:

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

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

【讨论】:

  • 但是没有我可以看到的时区规范?
  • 作为一般惯例,API 应使用 UTC 日期/时间,并让客户端代码转换为时区。
  • 绝对。但在这种情况下,目的是让消费者了解特定国家/地区的资源所在的时区。例如,我们有一个端点来接收有关组织(资源)的更多信息。要返回的一个重要方面是组织运营所在的时区。这与日期和时间无关。这是纯粹的信息数据。
【解决方案2】:

Microsoft 时区,例如 TimeZoneInfo 对象使用的时区,确实可以使用 FromSerializedString 和 ToSerializedString 方法进行序列化和反序列化。它们也可以通过 Id 属性引用。这两个都在TimeZoneInfo 类上,而不是TimeZone 类(你根本不应该使用它)。

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

时区没有官方标准,但最接近的是IANA time zone database 提供的标识符。例如,要传达美国东部时区,您可以在 API 中传递 "America/New_York"。您可以在the timezone tag wiki 和on Wikipedia 中阅读更多相关信息。 IANA 时区的好处在于它在每个平台上都实现了 - 因此虽然它不是标准,但它比仅适用于 Windows 的 Microsoft 时区更便携。

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

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

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

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

【讨论】:

  • 优秀的答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
相关资源
最近更新 更多