【问题标题】:CultureInfo with several datetime representations具有多个日期时间表示的 CultureInfo
【发布时间】:2016-12-27 16:02:19
【问题描述】:

假设我们有一个 WCF 服务,它接受一些 DateTime 对象并使用它,并且我们有一个客户端以 dd/mm/yyyy 格式发送它。但是这个服务也是从 JS 调用的,它应该发送准确的DateTime,这就是它使用yyyy-MM-ddTHH:mm:ss.fffzzz 格式的原因。

是否有可能创建一种采用两种格式的文化,并且不要像if (DateTime.TryParse(format1, out dt) || DateTime.TryParse(format2, out dt) || DateTime.TryParse(format3, out dt) || ...)那样写令人恶心的ifs

此代码的另一个缺点是我们还必须为DateTimeOffset 复制它

【问题讨论】:

  • TryParseExact 将采用一系列格式,让您一次检查所有内容
  • @Plutonix 这很适合我,谢谢。当然我应该为DateTimeOffset写额外的逻辑,并以不同于其他类型的方式处理它,但是没有更好的解决方案。

标签: c# .net datetime


【解决方案1】:

这就是 ASP.NET MVC 处理问题的方式。我认为同样的原则也适用于使用 WCF 等其他技术实现的服务。 Web 服务使用这些约定。

ASP.NET MVC(包括 Web API)对查询字符串中传递的参数执行不区分区域性的解析。因此,URL 中的日期必须采用通用格式 yyyy-mm-dd。表单值(或请求正文中的任何值)应采用服务器指定的格式。这意味着设置为英国文化的服务器将期望日期采用英国日期格式:dd-mm-yyyy。

为什么对 URL 中的项目执行不区分文化的解析?

对 URL 中的项目执行不区分文化的解析有一个非常好的、合乎逻辑且方便的原因。想象一下,我看到一件特价商品,并且促销的 URL 中有 fromto 日期。如果我将该链接通过电子邮件发送给我在德国的朋友(我住在加拿大),我希望他们看到相同的页面。如果对 URL 中的日期执行了文化敏感解析,我的朋友可能会看到完全不同的销售,或者可能会看到一个未找到的页面——这可不好。

因此,为了回答您的问题,调用您的 WCF 服务的客户端应以服务指定的格式向您的服务提供日期,除非日期在 URL 中,在这种情况下,客户端应以通用格式 yyyy- 提供日期mm-dd。

另一种选择是让客户端向服务提供文化,例如在 SOAP 标头中,服务将在解析时使用该文化。

【讨论】:

  • 这与传递标头相同,但没有此标头,因为您始终可以自动检测使用哪种格式。当然当你有11-12-2016 vs 12-11-2016时它不起作用,但在这种情况下你有11-12-2016 vs 2016-12-11T15:55:45.555+03:00,没有办法把这两者混在一起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 2019-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
相关资源
最近更新 更多