Restful API 日期时间格式与 ISO 8601

2024-03-20 08:52

本文主要是介绍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的偏移。

时区划分图

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

这篇关于Restful API 日期时间格式与 ISO 8601的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/828923

相关文章

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

使用SpringBoot创建一个RESTful API的详细步骤

《使用SpringBoot创建一个RESTfulAPI的详细步骤》使用Java的SpringBoot创建RESTfulAPI可以满足多种开发场景,它提供了快速开发、易于配置、可扩展、可维护的优点,尤... 目录一、创建 Spring Boot 项目二、创建控制器类(Controller Class)三、运行

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX