如何使用时区格式化 url 日期时间参数
How to format url datetime parameter with timezone
我到处找了找也没找到答案。我想了解格式化日期时间(带时区)url 参数的方式。
情况如下:
- 调用方程序的 DateTime 值采用 UTC 时区。
- 接收器 Json WebAPI (C#) 在我的本地电脑上 运行,它使用中部时区。
- PoCreationDate 是 DateTime 类型 (C#)。我不编写代码来解析 PoCreationDate 值。 C# 自动神奇地将它转换为 DateTime 对象(通过序列化?)。
以下是测试用例:
案例 1:
这个有效
http://******/api/ItemSource/GetItemSourceOption?OrganizationCode=OKC&PoCreationDate=2018-10-08T01:02:03.0000000-05:00
案例 2:
这个不行,浏览器显示
<Error>
<Message>The request is invalid.</Message>
</Error>
http://******/api/ItemSource/GetItemSourceOption?OrganizationCode=OKC&PoCreationDate=2018-10-08T05:00:00.0000000+00:00
注意到不同之处了吗?其中一个有-05:00,另一个有+00:00。我的时区是中部(现在是 -05:00?)
案例 3:
我目前的解决方法是以这种方式格式化
http://******/api/ItemSource/GetItemSourceOption?OrganizationCode=OKC&PoCreationDate=2018-10-08T05:00:00Z
=====================
所以我只是想了解这里发生的事情以及这些我的想法...
我认为使用 Z 格式是最佳解决方案,因为 DateTime 值(来自源)始终采用 UTC 格式。
关于-05:00 和+00:00,这些是否应该根据接收方的时区(目标服务器本地时区)设置?因此对于这种情况,我的 PC 是接收器 (WebAPI) 并且它设置为中央时区,因此该值必须是 -05:00 才能代表中央时区的当前值?
请帮助我理解这一点。谢谢
根据 URL 编码规则,偏移量中的 +
字符被解释为 space。您需要对其进行编码,以便将其替换为 %2B
.
如果您从 JavaScript 构建此 URL,请使用 encodeURIComponent
函数。
如果您使用 C# 构建它,请使用 System.Net.WebUtility.UrlEncode
方法。
请注意,这样做还会将 :
字符替换为 %3A
,这在查询字符串参数中是可选的,但仍建议这样做。
一般情况下,querystring中传入的参数需要进行编码,除非你能保证不包含特殊字符。
此外,您可能想问问自己,此字段是否真的需要是完整的日期+时间+偏移量。在许多情况下,人们可能希望像 PoCreationDate
这样的字段 只是 一个日期,例如 "2018-10-08"
。当然,这取决于你的应用逻辑和业务需求。
我到处找了找也没找到答案。我想了解格式化日期时间(带时区)url 参数的方式。
情况如下:
- 调用方程序的 DateTime 值采用 UTC 时区。
- 接收器 Json WebAPI (C#) 在我的本地电脑上 运行,它使用中部时区。
- PoCreationDate 是 DateTime 类型 (C#)。我不编写代码来解析 PoCreationDate 值。 C# 自动神奇地将它转换为 DateTime 对象(通过序列化?)。
以下是测试用例:
案例 1: 这个有效
http://******/api/ItemSource/GetItemSourceOption?OrganizationCode=OKC&PoCreationDate=2018-10-08T01:02:03.0000000-05:00
案例 2: 这个不行,浏览器显示
<Error>
<Message>The request is invalid.</Message>
</Error>
http://******/api/ItemSource/GetItemSourceOption?OrganizationCode=OKC&PoCreationDate=2018-10-08T05:00:00.0000000+00:00
注意到不同之处了吗?其中一个有-05:00,另一个有+00:00。我的时区是中部(现在是 -05:00?)
案例 3: 我目前的解决方法是以这种方式格式化 http://******/api/ItemSource/GetItemSourceOption?OrganizationCode=OKC&PoCreationDate=2018-10-08T05:00:00Z
=====================
所以我只是想了解这里发生的事情以及这些我的想法...
我认为使用 Z 格式是最佳解决方案,因为 DateTime 值(来自源)始终采用 UTC 格式。
关于-05:00 和+00:00,这些是否应该根据接收方的时区(目标服务器本地时区)设置?因此对于这种情况,我的 PC 是接收器 (WebAPI) 并且它设置为中央时区,因此该值必须是 -05:00 才能代表中央时区的当前值?
请帮助我理解这一点。谢谢
根据 URL 编码规则,偏移量中的 +
字符被解释为 space。您需要对其进行编码,以便将其替换为 %2B
.
如果您从 JavaScript 构建此 URL,请使用
encodeURIComponent
函数。如果您使用 C# 构建它,请使用
System.Net.WebUtility.UrlEncode
方法。
请注意,这样做还会将 :
字符替换为 %3A
,这在查询字符串参数中是可选的,但仍建议这样做。
一般情况下,querystring中传入的参数需要进行编码,除非你能保证不包含特殊字符。
此外,您可能想问问自己,此字段是否真的需要是完整的日期+时间+偏移量。在许多情况下,人们可能希望像 PoCreationDate
这样的字段 只是 一个日期,例如 "2018-10-08"
。当然,这取决于你的应用逻辑和业务需求。