5 个关于 API 中日期和时间设计规则

简介:

比方说,你要建立你的第一个API,将它变成公共、私人、或一些混合的产品。不要感到惊讶,如果你的第一个缺陷是和日期/时间相关的,那么不要低估你可能当涉及到处理日期和时期的时候所带来的麻烦。当涉及到处理的日期和时间问题时,你可以进来看看。这里有一些技巧可以让你摆脱这种潜在的麻烦。

警告:我假设你使用公历。在国际场合,这可能是一个糟糕的假设。如果你在一个不同的日历算法中操作,这不会帮助你。

警告:我假设你使用公历。在国际场合,这可能是一个糟糕的假设。如果你在一个不同的日历算法中操作,这不会帮助你。

规则 #1 使用ISO-8601格式作为你的日期格式

这是没有可讨论的余地的。从W3C 到 IETF, 还有甚至 XKCD, 互联网一直使用这个标准。不要自作聪明的使用其他。ISO-8601提供一系列的品种,来显示日期/时间/时区。

通过*nux控制台来快速看看ISO-8601格式,输入如下命令:

ISO 8601

ISO 8601

ISO 8601 解决了很多问题,包括:

  • 自然排序 - 简单和优雅,免去多余的工作即可实现排序
  • 时区偏移 - 代表用户的地点和时区在日益增长的全球化和移动世界中越来越重要。
  • 地区中立性 - 想象一下噩梦一般的日期 2/3/4。这个日期随着你所处美国,欧洲或者其他地方而有不同的含义...这个日期在美国代表Feb 3, 2004,或者在其他地方代表Mar 2, 2004。在ISO 8601条款中,2004-02-03去掉了这些含糊的可能性。
  • 在不同的编程语言中都得到广泛的支持 - 即使不是所有的语言都使用这个标准作为默认值(例如Java),但是它们基本都有成熟的库来转化 ISO 8601格式。不要自作聪明来自己实现哦。

规则#2: 接受任何的时区

现在你有一个ISO-8601的工具了,但凭什么你能够获取到有关时区的偏移数据呢,用它吧!我们在一个全球化的时代。尤其是如果你的API是对外开放的,你将无可争议地要解决全球消费者的问题。不要去假设你的API使用者是用那个时区。

规则#3:用UTC(Coordinated Universal Time 世界同一时间)格式存储

这是大多数系统实际设计的一般规律。我已经记不清我看过多少次按照原公司总部时区建立的系统。不可避免的,除非你是纪律严明,用户最终不会用你的公司的时区看他们的时间。这很让人讨厌,尤其是当他们处在地球的另一端的时候。

UTC,或者世界标准时间,是最常见最有共性存储的时间,因为他不表示任何时区偏移量。这让你可以根据你系统的需要,给出整个系统时区的建议日期,无论是哪个时区都是恰当的。

规则#4 使用UTC格式作为返回值格式

UTC可以允许你的API调用者免去计算偏移到他们所需要的日期的工作。而对于你,更重要的是,你的API组不需要为每一次调用都去烦恼如何计算它的偏移值。在你的API文档和系统支持中,对于你如何处理日期,只需简单的说“你获取的是UTC格式”。

规则#5 如果你不需要时间的话,不要使用它

ISO 8601同样允许我们灵活的提供一个日期而不带时间。在时间不重要的场合中,只使用日期(例如“目标完成日期”):不要保存或者返回时间。虽然对于只保存11:59pm没什么坏处,或者其他随机时间,但是,你可能在日期国际化的时候会碰到很大麻烦。

想象一下,你使用UTC格式保存2013-03-01T23:59:59,代表Mar 1,2013。现在,对于中国标准时间(UTC+0800)作时差计算,你现在是表示Mar 2, 2013 早上8点。这会有麻烦,因为日期被误读了。在这个例子中,我们只需要使用2013-03-01,不带任何时间/时区时差,来免除日期的解析误读的可能性。现在流行的数据库都支持只包含日期的格式。

总结

当所有这些关于日期的讨论可能会让你有点麻木,不过可以放心,几乎所有的RESTful平台都使用这些格式。当你需要摆弄数据序列化库的时候,需要当心,留意当它离开你的API平台的时候,它会对你的日期进行什么操作。

我们大部分人都在不同的时区或者国家工作,生活或者交流,我们知道连简单的安排一个约会都会让我们感到有多么的疑惑。还有,如果你不希望写一大堆日期转换和格式化的东西,你可能会希望有一个标准来代表时间。好好运用这些规则来处理你的日期和时间,你就可以减轻很多烦恼。

 原文发布时间为:2013-03-27

本文来自云栖社区合作伙伴“Linux中国”

相关文章
|
7月前
|
Java API
Java 8 时间和日期 API
Java 8 时间和日期 API
69 1
|
7月前
|
Java Unix 程序员
java 8 新特性讲解Optional类--Fork/Join 框架--新时间日期API--以及接口的新特性和注解
java 8 新特性讲解Optional类--Fork/Join 框架--新时间日期API--以及接口的新特性和注解
98 1
|
23天前
|
安全 Java API
告别SimpleDateFormat:Java 8日期时间API的最佳实践
在Java开发中,处理日期和时间是一个基本而重要的任务。传统的`SimpleDateFormat`类因其简单易用而被广泛采用,但它存在一些潜在的问题,尤其是在多线程环境下。本文将探讨`SimpleDateFormat`的局限性,并介绍Java 8引入的新的日期时间API,以及如何使用这些新工具来避免潜在的风险。
33 5
|
6月前
|
安全 Java 程序员
Java8实战-新的日期和时间API
Java8实战-新的日期和时间API
48 3
|
3月前
|
安全 Java API
时间日期API(Date,SimpleDateFormat,Calendar)+java8新增日期API (LocalTime,LocalDate,LocalDateTime)
这篇文章介绍了Java中处理日期和时间的API,包括旧的日期API(Date、SimpleDateFormat、Calendar)和Java 8引入的新日期API(LocalTime、LocalDate、LocalDateTime)。文章详细解释了这些类/接口的方法和用途,并通过代码示例展示了如何使用它们。此外,还讨论了新旧API的区别,新API的不可变性和线程安全性,以及它们提供的操作日期时间的灵活性和简洁性。
|
7月前
|
SQL API 数据库
为API设置默认排序规则结果数据的正确性
Dataphin数据服务支持API调用时通过OrderByList自定义排序,确保数据返回符合业务需求。默认排序在API设计时至关重要,因为它影响用户体验、数据一致性及查询正确性。新版本 Dataphin 提供了排序优先级设置,允许在SQL脚本或OrderByList中指定排序,以适应不同场景。
101 0
|
5月前
|
Java API
Java中的日期和时间API详解
Java中的日期和时间API详解
|
7月前
|
Java API
Java一分钟之-Java日期与时间API:LocalDate, LocalDateTime
【5月更文挑战第13天】Java 8引入`java.time`包,改进日期时间API。`LocalDate`代表日期,`LocalDateTime`包含日期和时间。本文概述两者的基本用法、常见问题及解决策略。创建日期时间使用`of()`和`parse()`,操作日期时间有`plusDays()`、`minusMonths()`等。注意点包括:设置正确的`DateTimeFormatter`,考虑闰年影响,以及在需要时区信息时使用`ZonedDateTime`。正确使用这些类能提升代码质量。
145 3
|
6月前
|
DataWorks 监控 API
DataWorks产品使用合集之在调用API创建质量监控规则中的校验器的ID可以在哪里找到
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
7月前
|
前端开发 Java API
JavaSE&Java8 时间日期API + 使用心得
JavaSE&Java8 时间日期API + 使用心得
48 0