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

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

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

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

通过*nux控制台来快速看看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中国”

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

  1. mysql 函数用还是不用_Mysql中日期和时间函数应用不用求人

    Mysql中日期和时间函数应用不用求人 2008-05-23 17:41· 稿源:互联网 TIME_FORMAT(time,format) 这象上面的DATE_FORMAT()函数一样使用,但是for ...

  2. python输出时间格式_python中日期和时间格式化输出的方法小结_python

    这篇文章主要介绍了python中日期和时间格式化输出的方法,实例总结了Python常见的日期与事件操作技巧,非常具有实用价值,需要的朋友可以参考下 本文实例总结了python中日期和时间格式化输出的方 ...

  3. python中日期和时间格式化输出的方法

    1.将字符串的时间转换为时间戳 方法: a = "2013-10-10 23:40:00" #将其转换为时间数组 import time timeArray = time.strp ...

  4. [转载] python中日期和时间格式化输出的方法

    参考链接: Python程序将时间从12小时转换为24小时格式 1.将字符串的时间转换为时间戳 方法: a = "2013-10-10 23:40:00" #将其转换为时间数组 i ...

  5. PHP求日期函数公式,PHP中日期和时间函数简介

    PHP中日期和时间相关函数简介 一.UNIX时间戳 在当前大多数的UNIX系统中,保存当前日期和时间的方法是:保存格林尼治标准时间从1970年1月1日零点起到当前时刻的秒数,以32为整列表示.1970 ...

  6. PHPExcel对于Excel中日期和时间类型的处理

    PHPExcel是一款优秀的处理Excel文件读写的开源PHP Library,能够给我们提供强大的Excel读写能力,本文针对Excel处理过程中关于日期和时间类型的处理进行深入的讨论.PHPExc ...

  7. python中日期和时间格式化输出的方法小结_Python 时间操作例子和时间格式化参数小结...

    1.取过去具体时间的方法: #!/usr/bin/python import time #取一天前的当前具体时间 time.strftime('%Y-%m-%d %T',time.localtime( ...

  8. mysql中不要 秒的函数_Mysql中日期和时间函数应用不用求人 | 很文博客

    对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6 日期和时间类型. 这里是一个使用日期函数的例子.下面的查询选择了所有记录,其date_col的值是在最后30天以内: my ...

  9. python中设置时间格式--模块datetime中日期和时间格式的参数

    模块datetime中设置日期和时间格式的实参 实参 含义 %A 本地完整星期名称 %a 本地简化星期名称 %B 本地完整的月份名称 %b 本地简化的月份名称 %m(month的首字母) 用数字表示的 ...

最新文章

  1. ​ImageNet的top-1终于上了90%,网友质疑:用额外数据集还不公开,让人怎么信服?...
  2. 开源Gis简介(转)
  3. linux shell程序代码,linux shell实用程序源代码pidof
  4. python判断字符串中包含某个字符串_Python中最常用的字符串方法!
  5. .NET 6新特性试用 | 总结:我最喜欢的5个特性
  6. 两张趣图助你理解 HTTP 状态码
  7. Ubuntu作为服务器其tomcat被远程访问问题
  8. chstr php,PHPWind与Discuz截取字符函数substrs与cutstr性能比较
  9. python谱聚类算法_谱聚类 - python挖掘 - 博客园
  10. 【Python实例第35讲】高斯过程分类:Iris数据集
  11. 代码大全旁边的一本书--感受《UNIX编程艺术》
  12. 《赛灵思中国通讯》学习记录第1期:为何使用Zynq SoC可以让企业产品利润激增
  13. TCP/IP的安全缺陷
  14. 第二次作业——时事评论
  15. 计算机无法启动怎么重装系统,电脑无法启动系统怎么重装
  16. open wrt 跟换主题_openwrt 更改默认主题
  17. 计算机网络——IP地址总述
  18. android 关于屏幕截屏的几种办法
  19. 2008年不可错过的50部好莱坞电影
  20. 知乎上这个程序员火了,竟是因为给老板修了一 次U盘...

热门文章

  1. Ubuntu系统 VI 编辑器初试
  2. C# Enum,Int,String的互相转换 枚举转换
  3. Server Application Unavailable
  4. nginx 同一个端口支持 http https_Nginx
  5. POJ3322滚箱子游戏(不错)
  6. UVA10340子序列
  7. 【EventBus】事件通信框架 ( 订阅方法注册 | 注册 事件类型 - 订阅类 + 订阅方法 到指定集合 | 取消注册 数据准备 )
  8. 【Flutter】HTTP 网络操作 ( 引入 http 插件 | 测试网站 | Get 请求 | Post 请求 | 将响应结果转为 Dart 对象 | Future 异步调用 )
  9. 【Android 异步操作】FutureTask 分析 ( Future 接口解析 | Runnable 接口解析 | Callable 接口解析 )
  10. 【Android 应用开发】 Ubuntu 安装 Android Studio (旧版本|仅作参考)