【问题标题】: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 对象使用的时区,确实可以使用 FromSerializedStringToSerializedString 方法进行序列化和反序列化。它们也可以通过 Id 属性引用。这两个都在TimeZoneInfo 类上,而不是TimeZone 类(你根本不应该使用它)。

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

时区没有官方标准,但最接近的是IANA time zone database 提供的标识符。例如,要传达美国东部时区,您可以在 API 中传递 "America/New_York"。您可以在the timezone tag wikion 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
相关资源
最近更新 更多