将来自不同文化的 DateTime 字符串传递给服务

Posted

技术标签:

【中文标题】将来自不同文化的 DateTime 字符串传递给服务【英文标题】:Passing DateTime strings from different cultures to a service 【发布时间】:2017-09-26 15:39:17 【问题描述】:

我有一个包含 Windows 10 桌面应用程序项目和服务项目的解决方案。桌面应用程序启动服务并传递一个将DateTime 转换为字符串的参数。在服务中,字符串被传递给DateTime.TryParse(string, out DateTime),但这一直失败。我的测试系统的文化是德国的,但我意识到在服务中,文化似乎总是 en-US(我认为是因为它在 SYSTEM 上下文中运行)。我知道我的应用程序将在全球 16 个不同的国家/地区运行。我在想如果我能以某种方式获得用户文化并在我的服务中使用此信息来使用DateTime.TryParse 的第二个重载,我可以在其中指定IFormatProvider,但这是最好的解决方案吗?我基本上需要一个强大的解决方案来将来自不同文化的 DateTime 字符串传递给我的服务,以便我可以进一步使用它。在将 DateTime 字符串传递给服务之前,是否可以根据服务文化对其进行格式化?

【问题讨论】:

为什么不将“原始”DateTime.Ticks 发送到服务?让您免于处理字符串的麻烦,不是吗? 日期时间转换为字符串。为什么要转换为字符串?为什么不传递一个真正的DateTime?您使用什么机制来传递数据?您使用的是 WCF 服务还是命名管道或其他东西? @C.Gonzalez 那行得通。感谢您的建议。 @ChrisDunaway 我正在使用本地 Windows 服务,据我所知,它似乎只支持 string[] args 作为参数。 你是如何传递参数的?您是否在“服务”对话框中对其进行硬编码?如何启动服务? 【参考方案1】:

桌面应用程序启动服务并传递一个参数,该参数是一个转换为字符串的日期时间。

您可以使用InvariantCulture 在应用程序和服务之间进行通信:

InvariantCulture 可用于存储不会直接显示给最终用户的数据。以与区域性无关的格式存储数据可确保已知格式不会更改。当来自不同文化的用户访问数据时,可以根据用户进行适当的格式化。例如,如果您将 DateTime 类型存储在为 InvariantCulture 格式化的文本文件中,则在调用 DateTime.ToString 方法存储字符串和调用 Date.Parse 方法检索字符串时使用 InvariantCulture 属性。这将确保 DateTime 类型的基础值不会在来自不同文化的用户读取或写入数据时发生变化。

【讨论】:

太完美了。谢谢你!

以上是关于将来自不同文化的 DateTime 字符串传递给服务的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net 日期时间文化问题

如何在不同的系统文化中转换 DateTime?

MVC 控制器接收从 CurrentThread.CurrentCulture 解析为不同文化的 DateTime

非美国文化中带有 DateTime 的 String.FormatException

如何创建不在当前文化中的 DateTime 对象

.NET 4.5 DateTime 格式/转换错误与上索布文化