在构建 api 时, 使用 JSON 作为序列化格式非常常见。JSON 定义了布尔值、数字和字符串的序列化, 而没有日期(date)/日期时间(datetime)数值。
对于日期和日期时间值, 大多数序列化程序都使用 ISO8601 标准。例如:
# Date format
2011-07-14
# DateTime format
2011-07-14T19:43:37+0100
但是, 您应该知道使用日期格式时信息丢失。这会发生, 因为不同时区之间的日期值可能不同。让我举个例子:
- 从巴西 (UTC-0300) 2011-07-14 T01:00:00Z (utc) 发出请求到 UTC 服务
- 如果创建请求的时间作为日期公开, 它将返回值为2011-07-14
但从客户的角度来看, 在巴西, 正确的日期是 2011-07-13, 因为在这一请求发布的那一刻, 巴西当地时间是 2011-07-13 T22:00:00-0300
如果此信息仅在您的应用程序内使用, 在同一时区内, 您将没有问题。但是, 如果您需要通过公共 API 提供此信息, 则 API 的一个用户可能会恢复不正确的值。
因此, 从这一体验中, 将由不同客户端共享和使用的任何日期值都应用显式时区或 Unix 时间格式表示为日期时间。这样, 客户端就可以正确地处理数据了。
下面是一个 API 的示例, 它以正确的方式返回订阅期间:
{
period_start_date: 1409175049, # Unix time
period_end_date: 2014-09-27T18:30:49-0300 # ISO8601
}
# Time.at(1409175049)
# DateTime.parse(“2014-09-27T18:30:49-0300”)
上面的选项具有明确和适合的。你可以选择一个或另一个基于这个事实, 时区选项是更容易人类理解。但是请记住, 时区是一个呈现层问题, 因此, 如果您只需要传递数据, Unix 时间就更好了。
网友评论