当前位置: 首页 > 知识库问答 >
问题:

在URL中使用时区参数发送日期和时间的公认方式

支洋
2023-03-14

在 OData/REST 服务中,我想允许日期参数 startDateendDate 标记返回数据的日期范围。例:

GET /events?startDate=XXX&endDate=YYY

问题:

  1. URL 中日期和时间的标准格式是什么?
  2. 我应该考虑添加时区(或 UTC 偏移量)吗?如果未添加时区,预期会发生什么?

共有2个答案

陆飞龙
2023-03-14

请参阅万维网联盟 (W3C) 日期格式,可以发送格式为 YYYY-MM-DDThh:mm:ss.sTZD

e. g 1997-07-16T19:20:30.45 01:00

无秒:

YYYY-MM-DDThh:mmTZD (例如 1997-07-16T19:20 01:00)

1994-11-05T08:15:30-05:00对应于1994年11月5日美国东部标准时间上午8:15:30。

1994-11-05T13:15:30Z对应于同一瞬间。

丌官霖
2023-03-14

@user7294900回答中链接的W3C日期格式是个不错的选择。您只需要注意字符< code>:和< code> -建议对这些字符进行URL编码:在这种情况下,像< code > 2017-08-07t 12:09:23.555 01:00 这样的日期在URL中将变成< code > 2017-08-07t 12:09:23.555+01:00 。

您还可以使用ISO 8601格式,它允许没有-分隔符的格式,因此2017-08-07T12:09:23.555 01:00之类的日期也可以写成20170807T120923.555 0100(您仍然可以使用字符进行URL编码,但这可能比第一个选项更具可读性:20170807T120923.555+0100

实际上,W3C日期格式是ISO 8601的配置文件(或子集),因此两者都是不错的选择,因为大多数现代语言和系统都支持ISO格式。

我应该如何考虑添加时区(或UTC偏移量)?

首先,时区和偏移量不是一回事(尽管它们相互关联)。

偏移量是与UTC的差异:02:00表示“比UTC提前2小时”,-02:00

时区是一个区域在其历史中拥有、拥有和将要拥有的所有不同偏移的集合,包括这些变化发生的确切日期和时间。

如果我只是有一个日期,比如< code > 2017-08-07t 12:09:23.555 01:00 ,offset 01:00只是表示它比UTC早1个小时,但并没有说明它是在哪个时区。可以是夏令时(DST,或夏令时)的伦敦,也可以是冬季的安道尔,或其他许多地方。

Java使用IANA时区名称(格式总是< code>Region/City,如< code>America/New_York或< code>Europe/Berlin)。避免使用3个字母的缩写(如< code>EST或< code>PST),因为它们不明确且不标准。

如果您的应用程序将处理不同区域的日期和时间,我建议在内部使用 UTC(因此日期类似于 2017-08-07T12:09:23.555Z - Z 表示“零偏移量”,而“零偏移量”又与“UTC”相同)。因此,您的后端代码始终使用 UTC,并在需要时将其更改为另一个时区(例如向用户显示时)。

如果您不需要处理不同的时区,或者不需要知道事件的确切时间,您可以使用“本地日期”(没有时区也没有偏移量)。这取决于你的要求。

如果没有添加时区,会出现什么情况?

如果您使用本地日期/时间(没有时区/偏移),您可能会得到“奇怪”或意外的结果,这取决于您的代码如何处理日期。

假设我有日期/时间< code > 2017-08-07t 22:00 (2017年8月7日晚上10点)。它没有任何时区信息,所以您必须假设这个日期在世界的哪个地区:您可以假设它在您的时区,或者在系统使用的任何时区,但是如果您开始涉及另一个时区,这些计算将会失败。

示例:如果我认为这个日期是在伦敦,那么相当于UTC的晚上9点。但如果本地日期是在洛杉矶,则相当于UTC的2017-08-08T05:00(洛杉矶的晚上10点等于UTC的第二天早上5点)。根据使用的时区,此日期/时间将表示不同的时刻。

因此,如果没有使用偏移量,您可能会得到这些结果,但这当然取决于您的代码对日期的处理。如果您将其视为本地日期和时间,应该没有问题。如果您在计算时考虑UTC和/或不同的时区,可能会有问题。

 类似资料:
  • 问题内容: 如何配置JPA /hibernate模式以UTC(GMT)时区在数据库中存储日期/时间?考虑以下带注释的JPA实体: 如果日期为太平洋标准时间(PST)2008-Feb-03 9:30 am,那么我希望数据库中存储2008-Feb-03 5:30 pm的UTC时间。同样,从数据库中检索日期时,我希望将其解释为UTC。因此,在这种情况下530pm是UTC 530pm。显示时,它将被格式化

  • 然后将变量持久化到MySQL表列中。 然而,虽然通过调试,我看到对象显示在正确的时区GMT+1,但在数据库上持久化时,它是一个GMT时区,所以要追溯一个小时。 使用函数返回一个GMT+1日期。 连接字符串为,没有任何参数。 编辑:找到这段代码

  • 问题内容: 如何配置JPA /hibernate模式以UTC(GMT)时区在数据库中存储日期/时间?考虑以下带注释的JPA实体: 如果日期是太平洋标准时间(PST)2018-Feb-03 9:30 am,那么我希望数据库中存储2008-Feb-03 5:30 pm的UTC时间。同样,从数据库中检索日期时,我希望将其解释为UTC。因此,在这种情况下,530pm是UTC 530pm。显示时,它将被格式

  • 我有一个使用百里香叶作为视图层的Spring Boot Web应用程序,我需要显示一些特定时区的日期(CET = UTC 1/UTC 2)。 服务器设置为UTC,所有日期都以UTC格式作为datetime存储在我的数据库中,这很好。 现在我想在我的超文本标记语言页面上显示这个日期,不是UTC格式,而是使用胸膜时序的CET,但它似乎不起作用。 date对象是一个Java Instant。 从 DB

  • 问题内容: 在我的iPhone应用程序中,我非常努力地将Web服务响应时间转换为当前设备时间。的。该应用程序是全球使用的应用程序。所以我必须将响应时间转换为当前设备的时区。这是简单的消息传递应用程序。 当我发送了一个但从我那里检索时间 时。当我在应用程序中显示时间时,我应该将时间转换为设备的本地时间。我已经尝试过某种方式,但是我还不能解决。代码是: 但是输出日期和时间是我将这个日期/时间存储在其中

  • 让我一起学习一个新的内建对象:日期(Date)。该对象存储日期和时间,并提供了日期/时间的管理方法。 例如,我们可以使用它来存储创建/修改时间,或者用来测量时间,再或者仅用来打印当前时间。 创建 创建一个新的 Date 对象,只需要调用 new Date(),在调用时可以带有下面这些参数之一: new Date() 不带参数 —— 创建一个表示当前日期和时间的 Date 对象: let now =