c# - 如何使用时区格式化 url 日期时间参数
问题描述
我到处搜索,找不到答案。我想了解格式化日期时间(带时区)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:00 Z
======================
所以我只是想了解这里发生了什么以及这些我的想法......
我相信使用 Z 格式是最好的解决方案,因为 DateTime 值(来自源)始终采用 UTC 格式。
关于 -05:00 和 +00:00,这些是否应该根据接收者的时区(目标服务器本地时区)设置?所以对于这种情况,我的 PC 是接收器 (WebAPI),它设置为中央时区,因此这个值必须是 -05:00 来表示中央时区的当前值?
请帮助我理解这一点。谢谢。
解决方案
根据 URL 编码规则,偏移量中的+
字符被解释为空格。您将需要对其进行编码,以便将其替换为%2B
.
如果您从 JavaScript 构建此 URL,请使用该
encodeURIComponent
函数。如果您在 C# 中构建它,请使用该
System.Net.WebUtility.UrlEncode
方法。
请注意,这样做也会将:
字符替换为%3A
,这在查询字符串参数中是可选的,但仍建议使用。
一般来说,查询字符串中传递的参数需要进行编码,除非你能保证它们不包含特殊字符。
此外,您可能想问自己,这个字段是否真的需要完整的日期+时间+偏移量。在许多情况下,人们可能会期望一个字段PoCreationDate
只是一个日期,如"2018-10-08"
. 当然,这取决于您的应用程序逻辑和业务需求。
推荐阅读
- c# - 如何以最快的方式替换多个字符串中出现的各种字符串
- csrf - 更改 OWasp CSRFGuard 的日志记录级别
- c# - Viewmodel 绑定称为乘法(首先加载视图,然后切换到其他视图)
- php - 我如何通过 Visual Studio(不是 Asp 项目)在 HTML 中设置 PHPMailer?
- namespaces - WSO2 数据服务和数据映射器
- html - 如何向我的菜单按钮添加脉动动画
- typescript - 具有特定深度的 TypeScript 递归类型
- django - 在 ListView Django 中添加选项
- c# - System.TypeInitializationException:“DemoProject.TestResources.StaticClassExample”的类型初始化程序引发异常
- authentication - Blazor 身份验证在 Live 中不起作用,但在开发中起作用