Restful API 日期时间格式与 ISO 8601

Restful API 日期时间格式

Restful API 在传递日期类型的参数时,应该使用什么格式?
查询参数、请求体参数、响应中的日期类型的字段,用什么格式合适?

在 RESTful API 中传递日期类型的参数时,通常建议采用一种普遍可解析且无歧义的格式。ISO 8601 格式是一个被广泛接受的标准,适用于查询参数、请求体参数以及响应中的日期和时间字段。

ISO 8601 格式示例:

  • 日期(不含时间):YYYY-MM-DD
  • 日期时间(含时区):YYYY-MM-DDTHH:MM:SSZ 或 YYYY-MM-DDTHH:MM:SS±HH:MM

例如:

  • 查询参数:/api/events?start_date=2024-03-19
  • 请求体参数:
{
  "startDate": "2024-03-19T14:30:00Z",
  "endDate": "2024-03-20T15:00:00Z"
}
  • 响应体中的日期字段:
{
  "id": 1,
  "title": "Some Event",
  "created_at": "2024-03-18T09:00:00Z",
  "updated_at": "2024-03-19T10:30:00Z"
}

使用 ISO 8601 格式的好处在于它具有明确的时间顺序,可以轻松地进行排序和比较,并且大多数编程语言和库都支持这种格式的解析和生成。同时,由于它包含了时区信息,能够确保跨时区数据交换时的一致性。而 Unix 时间戳(以秒或毫秒为单位表示自 UTC 1970-01-01 以来的秒数或毫秒数)也是另一种常见选择,但不如 ISO 8601 易于人类阅读和直观理解。在实际应用中,应当根据具体需求和项目约定来决定使用哪种格式。

ISO 8601 与 时间戳 的比较

Restful API 在传递时间参数时,ISO 8601 格式 和 时间戳,哪种更合适?

在 Restful API 中传递时间参数时,ISO 8601 格式和时间戳各有优劣,选择哪种格式取决于具体应用场景和需求:

ISO 8601 格式

  • 优点

    • 可读性强,易于人类理解和调试,无需额外转换即可直接查看。
    • 包含日期和时间信息,有时还包含时区信息,可以直接表达完整的时间点含义。
    • 是国际标准,被多种编程语言和库广泛支持,兼容性和互操作性良好。
  • 缺点

    • 相对于时间戳,ISO 8601 字符串可能占用更多空间,特别是当通过网络传输大量此类数据时。
    • 需要客户端和服务端都具备正确解析和格式化ISO 8601字符串的能力。

时间戳(如Unix时间戳)

  • 优点

    • 数据紧凑,通常只是一串数字,方便在网络传输中节省带宽。
    • 客户端和服务端只需简单算术运算就能进行转换,不需要复杂的解析逻辑。
    • 表示的是从固定基准时间(通常是1970-01-01T00:00:00 UTC)以来的秒数或毫秒数,不受时区影响,统一性较好。
  • 缺点

    • 不直观,不利于人工直接阅读和理解。
    • 如果不包含时区信息,则不能准确反映用户的本地时间,需要结合时区信息才能转换为易读的时间。

综合考虑,如果API的目标受众主要是机器消费者(比如微服务间通信),并且关注性能和简洁性,时间戳可能是更好的选择。而对于需要兼顾人类可读性和国际化需求的场景,或者API的设计原则倾向于清晰明了的人机交互,那么ISO 8601格式则更为合适。

实践中,越来越多的现代API倾向于采用ISO 8601格式,因为它更加语义化且易于集成到各种开发环境中。同时,由于现在大多数开发框架和库已经内置了对ISO 8601的支持,因此在很多情况下,处理成本已经大大降低。

推荐的日期时间格式

日期(不包含时间)格式

Restful API 传递纯日期类型,应该使用什么格式?

在 RESTful API 中传递纯日期类型时,推荐使用的格式是 ISO 8601 中的日期部分格式。ISO 8601 是国际标准化组织制定的日期和时间表示方法,其日期部分的标准格式是:

YYYY-MM-DD

例如:

  • 查询参数:/api/appointments?schedule_date=2024-03-19
  • 请求体参数:
{
  "appointmentDate": "2024-05-23"
}
  • 响应体中的日期字段:
{
  "event": {
    "id": 1,
    "title": "Meeting",
    "date": "2024-06-01"
  }
}

这种格式的优点在于它清晰、一致且被全球广泛接受,多数编程语言和库都能直接支持对这种格式的解析和生成。同时,由于其字典序排列与日期先后顺序一致,也非常适合进行日期的排序和比较操作。

时间(不包含日期)格式

Restful API 传递纯时间类型,应该使用什么格式?

在 Restful API 中传递纯时间类型(即不包含日期,仅指一天中的某个时间点)时,仍然推荐使用 ISO 8601 格式的一部分来表示。尽管 ISO 8601 标准主要针对日期和日期时间,但它也支持只包含时间部分的格式。

一个标准的 ISO 8601 时间格式的例子如下:

"HH:mm:ss" // 不包含时区的时间
"HH:mm:ss.SSS" // 包含毫秒的时间

例如:

  • 请求参数:/api/schedule?start_time=14:30:00
  • 请求体参数:
{
  "startTime": "15:45:30",
  "endTime": "17:15:00"
}
  • 响应体中的时间字段:
{
  "openingTime": "10:00:00",
  "closingTime": "22:00:00"
}

如果时间信息需要考虑时区,则可以进一步扩展格式,在时间后附加时区偏移,例如:

"HH:mm:ssZ" // 使用UTC时区的时间
"HH:mm:ss±HH:mm" // 使用特定时区偏移的时间

不过,在实际应用中,如果时间总是相对于某一天的上下文,有时也会选择将日期和时间一起发送,即使当天日期对上下文来说是已知的,这样可以减少误解的可能性。特别是在跨越日期变更线的场景中,明确指定日期有助于避免混淆。

完整的日期时间格式

Restful API 传递完整的日期时间格式,应该使用什么格式?

在 RESTful API 中传递完整的日期和时间信息时,推荐使用的格式也是 ISO 8601 中的日期时间格式,包括日期、时间、时区(可选):

标准格式如下:

YYYY-MM-DDTHH:mm:ss.SSSZ

或者对于不包含毫秒的部分:

YYYY-MM-DDTHH:mm:ssZ

这里的"T"是连接符,用于分隔日期和时间部分,"Z"表示的是 UTC 时间(有时也写作±HH:mm 表示相对于 UTC 的时区偏移)。如果没有指定时区,则假定为 UTC 或者需要双方明确约定时区处理规则。

例如:

  • 查询参数(UTC 时间):/api/events?start=2024-03-19T13:45:00Z
  • 请求体参数:
{
  "startTime": "2024-04-23T08:00:00-07:00",
  "endTime": "2024-04-23T10:00:00-07:00"
}
  • 响应体中的日期时间字段(假设事件发生在纽约时区,与 UTC 相差 -04:00):
{
  "event": {
    "id": 1,
    "title": "Conference Call",
    "datetime": "2024-06-01T15:30:00-04:00"
  }
}

这样格式的好处是它具有国际通用性、可读性和机器可解析性,并且在很多现代编程语言和框架中都有内建的支持。

纯日期类型不用考虑时区

在 RESTful API 中传递纯日期类型时,推荐使用的格式是 ISO 8601 中的日期部分格式。为什么这里不用考虑时区?

在 RESTful API 中传递纯日期类型时,推荐使用的格式是 ISO 8601 中的日期部分格式,例如 YYYY-MM-DD。这种格式被广泛接受,因为它清晰、无歧义,且易于阅读和解析。

当我们提到“纯日期类型”时,我们通常指的是不包含时间信息的日期,即仅包含年、月、日的信息。由于这种类型不包含时间信息,因此时区的问题在这里并不适用。时区通常与时间戳或具体的时间点相关联,而不是与单独的日期相关联。

另外,即使在需要表示日期和时间的情境中,ISO 8601 也提供了包含时区信息的格式,如 YYYY-MM-DDTHH:mm:ssZYYYY-MM-DDTHH:mm:ss±hh:mm。这些格式允许在日期和时间中明确表示时区,以满足需要时区信息的场景。

然而,在 RESTful API 中传递纯日期类型时,我们通常关注的是日期本身,而不是时间或时区。因此,使用 YYYY-MM-DD 这种不包含时区信息的格式是合理的,它满足了纯日期类型的需求,同时也简化了数据的处理和解析过程。

总之,对于纯日期类型,时区不是考虑的因素,因为纯日期类型不包含时间信息。而对于需要包含时间的日期时间类型,ISO 8601 提供了包含时区信息的格式来满足相关需求。

注意事项

  • 时区: 如果API需要处理时区,应在日期时间格式中明确指定,例如2024-03-19T10:38:57-05:00
  • 序列化/反序列化: 在使用JSON序列化和反序列化时,确保后端框架(如Spring)正确配置了日期时间的序列化和反序列化格式。
  • API文档: 在API文档中明确指出日期时间参数的格式和时区要求,以便前端开发者正确使用。

使用这些推荐的格式可以帮助确保RESTful API的一致性和可预测性,同时也便于前后端开发者之间的协作。

ISO 8601 介绍

ISO 8601,介绍一下

ISO 8601 是由国际标准化组织(International Organization for Standardization,ISO)发布的国际标准,其全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》。这一标准详细规定了如何通过数字来表示日期和时间,目的是为了在全球范围内消除因不同的日期和时间表示习惯而导致的信息混乱,以及增强计算机系统之间进行日期和时间数据交换的便利性和一致性。

ISO 8601 标准的主要特点包括:

  1. 日期格式

    • 标准日期格式为 YYYY-MM-DD,其中:
      • YYYY 代表四位数的年份,比如 2024
      • MM 代表两位数的月份,范围从 0112
      • DD 代表两位数的日,范围从 0131
    • 例如:2024-03-19 表示2024年3月19日。
  2. 时间格式

    • 完整时间表示为:HH:MM:SS
      • HH 表示两位数的小时(24小时制)。
      • MM 表示两位数的分钟。
      • SS 表示两位数的秒。
    • 可以包含毫秒,表示为:HH:MM:SS.sss
    • 例如:15:26:00.000 表示下午3点26分0秒,精确到毫秒。
  3. 日期时间格式

    • 日期和时间的组合表示为:YYYY-MM-DDTHH:MM:SS
      • T 是日期和时间之间的分隔符。
    • 例如:2024-03-19T15:26:00 表示2024年3月19日下午3点26分0秒。
  4. 时区表示

    • ISO 8601 支持对时区的标准化表示,使用 Z 表示协调世界时(UTC),或者使用 ±hh:mm 格式表示与 UTC 的偏移,例如:
      • Z 表示 UTC 时间;
      • +08:00 表示比 UTC 快8小时的时区;
      • -05:00 表示比 UTC 慢5小时的时区。
    • 例如:2024-03-19T15:26:00Z 表示UTC时间下午3点26分0秒。
  5. 持续时间表示

    • 标准还定义了表示时间段(周期)的方法,如 PnYnMnDTnHnMnS,其中 P 表示周期,后跟年数(nY)、月数(nM)、日数(nD)、小时数(nH)、分钟数(nM)和秒数(nS)。
    • 例如:P1Y2M3D 表示1年2个月3天的周期。

ISO 8601 已经被广泛应用在电子数据交换、XML 文档、JSON 对象以及其他多种信息技术领域,成为现代信息系统中日期和时间数据的标准格式之一。随着标准的发展,ISO 8601 目前最新的版本可能会有所更新,但基本的日期和时间表示原则仍然保持不变。

北京时间的 ISO 8601 表示方式

北京时间 2024年1月1日8点30分,用 ISO 8601 怎么表示?

根据ISO 8601标准,北京时间2024年1月1日8点30分可以表示为:

2024-01-01T08:30:00+08:00

这里的各个部分意义如下:

  • 2024-01-01 是日期部分,遵循 YYYY-MM-DD 的格式。
  • T 是日期和时间的分隔符。
  • 08:30:00 是时间部分,遵循 HH:MM:SS 的格式。
  • +08:00 表示时区偏移量,对于北京时间(中国标准时间,CST),它比协调世界时(UTC)快8个小时,没有分钟偏移,因此是 +08:00

请注意,ISO 8601标准中并不直接包含时区信息,通常需要根据上下文或系统配置来确定时区。在一些系统中,可能会使用Z来表示UTC时间,但对于其他时区,通常会附加一个时区偏移量。在上述表示中,+08:00明确指出了北京时间相对于UTC的偏移。

时区划分图

在这里插入图片描述
图片来自网络

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/471009.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

485问题汇总

485问题汇总 485 通信波形没有负电压 问题描述:设备在没有外设的时候通信波形是正常的,即5V可以出来,在连接上设备后,设备的通信波形的-5V会随着设备的增多,电压会慢慢上升。当设备连接到24台设备后,485总…

【C#】数组string类型输出

示例 代码 internal class Program{static void Main(string[] args){List<int> list new List<int>() { 1,2,3,4,5,6,7,8,9,10};string output1 string.Join(",", list);Console.WriteLine(output1);string output2 string.Join("\n", lis…

数据结构(五)——树的基本概念

五、树 5.1 树的基本概念 5.1.1 树的定义 树是n(n>0)个结点的有限集合&#xff0c;结点数为0的树称为空树 非空树的特性 有且仅有一个根节点没有后继的结点称为“叶子结点”&#xff08;或终端结点&#xff09;有后继的结点称为“分支结点”&#xff08;或非终端结点&a…

Java项目基于SpringBoot和Vue的时装购物系统的设计与实现

今天要和大家聊的是一款基于SpringBoot和Vue的时装购物系统。 &#x1f495;&#x1f495;作者&#xff1a;李同学 &#x1f495;&#x1f495;个人简介&#xff1a;混迹在java圈十年有余&#xff0c;擅长Java、微信小程序、Python、Android等&#xff0c;大家有这一块的问题可…

OPPO 后端二面,凉凉。。。

美众议院通过 TikTok 法案 之前我们讲了 老美要求字节跳动在 165 天内剥离短视频应用 TikTok&#xff0c;当时的最新进度是 TikTok 给 1.7 亿美国用户发弹窗&#xff0c;发动用户群众给国会打电话进行抗议。 但显然这点力度的抗议并不会造成什么实质影响。 昨晚&#xff0c;美国…

SpringBoot与SpringCloud的版本对应详细版

在实际开发过程中&#xff0c;我们需要详细到一一对应的版本关系&#xff1a;Spring 官方对应版本地址&#xff1a; (https://start.spring.io/actuator/info)&#xff0c;建议用firefox浏览器打开&#xff0c;你会看见格式化好了json信息&#xff1a; 手动记录一些经本人实际…

【译】矢量数据库 101 - 什么是矢量数据库?

原文地址&#xff1a;Vector Database 101 - What is a Vector Database? 1. 简介 大家好——欢迎回到 Milvus 教程。在上一教程中&#xff0c;我们快速浏览了每天产生的日益增长的数据量。然后&#xff0c;我们介绍了如何将这些数据分成结构化/半结构化数据和非结构化数据&…

使用WordPress在US Domain Center上建立招聘网站的详细教程

第一部分&#xff1a;介绍招聘网站 招聘网站是指用于发布招聘信息、吸引求职者、进行简历筛选和管理招聘流程的网站。在WordPress中&#xff0c;您可以轻松地创建一个功能齐全的招聘网站&#xff0c;以便企业能够方便地管理招聘流程&#xff0c;并为求职者提供信息和应聘渠道。…

论文浅尝 | GPT-RE:基于大语言模型针对关系抽取的上下文学习

笔记整理&#xff1a;张廉臣&#xff0c;东南大学硕士&#xff0c;研究方向为自然语言处理、信息抽取 链接&#xff1a;https://arxiv.org/pdf/2305.02105.pdf 1、动机 在很多自然语言处理任务中&#xff0c;上下文学习的性能已经媲美甚至超过了全资源微调的方法。但是&#xf…

力扣Lc18--- 168. Excel表列名称(java版)-2024年3月19日

1.题目描述 2.知识点 注1&#xff1a;StringBuilder 对象的 insert() 方法用于在字符串的指定位置插入字符或字符序列。这里的第一个参数是插入位置的索引&#xff0c;而第二个参数是要插入的字符或字符序列。 public class InsertExample {public static void main(String[…

彻底学会系列:一、机器学习之梯度下降(2)

1 梯度具体是怎么下降的&#xff1f; ∂ J ( θ ) ∂ θ \frac{\partial J (\theta )}{\partial \theta} ∂θ∂J(θ)​&#xff08;损失函数&#xff1a;用来衡量模型预测值与真实值之间差异的函数&#xff09; 对损失函数求导&#xff0c;与学习率相乘&#xff0c;按梯度反方…

搭建基于 Snowflake 的 CI/CD 最佳实践!

Snowflake 提供了可扩展的计算和存储资源&#xff0c;和基于 SQL 的界面 Snowsight&#xff0c;方便用户进行数据操作和分析。然而&#xff0c;如果用户想将自己的 CI/CD 流程与 Snowflake 集成时&#xff0c;会发现一些不便之处&#xff08;尤其相比其 SnowSight 优秀的查询能…

三段提交的理解

三阶段提交是在二阶段提交上的改进版本&#xff0c;3PC 最关键要解决的就是协调者和参与者同时挂掉的问题&#xff0c;所以3PC把2PC的准备阶段再次一分为二&#xff0c;这样三阶段提交。 处理流程如下 &#xff1a; 阶段一 协调者向所有参与者发出包含事务内容的 canCommit …

无人机助力违法毒品种植智能监测预警,基于轻量级YOLOv5n开发构建无人机航拍场景下的农村田园场景下非法种植罂粟花检测预警识别系统

打击毒品人人有责&#xff0c;毒品带来的危害是人尽皆知的&#xff0c;我们不仅自身要严厉拒绝接触任何形式的毒品&#xff0c;更要言传身教告诫他人不要与任何形式的任何渠道的毒品有关联&#xff0c;但是在实际生活中&#xff0c;在一些偏远的乡村、田园、山丘、村落等地方&a…

Markdown 最全语法指南 —— 看这一篇就够了

目录 一. 前言 二. Markdown 标题语法 三. Markdown 段落语法 四. Markdown 换行语法 五. Markdown 强调语法 六. Markdown 引用语法 七. Markdown 列表语法 八. Markdown 代码语法 九. Markdown 分隔线语法 十. Markdown 链接语法 十一. Markdown 图片语法 十二. Markdown 转义…

【技术栈】Redis 企业级解决方案

​ SueWakeup 个人主页&#xff1a;SueWakeup ​​​​​​​ 系列专栏&#xff1a;学习技术栈 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ 个性签名&…

php 对接Pangle海外广告平台收益接口Reporting API

今天对接的是Pangle广告reporting api接口&#xff0c;拉取广告收益回来自己做统计。记录分享给大家 首先是文档地址,进入到Pangle后台就能看到文档地址以及参数&#xff1a; 文档地址&#xff1a;https://www.pangleglobal.com/zh/integration/reporting-api-v2 在这里插入图片…

[SWPU2019]Web4

[SWPU2019]Web4 PDO注入&#xff08;堆叠注入&#xff09; 首先发现一个登录框&#xff0c;但是不能注册进行抓包&#xff0c;发现json数据格式&#xff0c;猜测可能是sql注入或者xxe漏洞 输入 ’ 报错&#xff0c;但是输入"或者‘ “ 不报错->猜测为堆叠注入[[mysql…

6.shell中的计算

目录 概述实践shell结果 结束 概述 shell中计算 实践 shell #!/bin/bash # 计算 expr、let 都只能用于整形计算a3 bexpr $a 3 echo "b$b" cexpr $b / 3 echo "c$c"# let 命令 表达式 let "a10" echo "a10$a" let "a/10&quo…

拓展商城系统的未来:微服务维度的创新之路

随着电子商务的快速发展&#xff0c;传统的单体式商城系统在应对日益复杂的业务需求和用户体验方面逐渐显露出局限性。而基于微服务架构的商城系统&#xff0c;通过多维度的拆分和组合&#xff0c;正在为商城行业带来全新的创新和发展机遇。本文将深入探讨微服务维度下的商城系…