DateTimeOffset.ToString() 格式化输出在环境中不一致

Posted

技术标签:

【中文标题】DateTimeOffset.ToString() 格式化输出在环境中不一致【英文标题】:DateTimeOffset.ToString() formatted output not consistent across enviros 【发布时间】:2021-08-27 18:50:07 【问题描述】:

我正在格式化与 Moneris 的定期计费集成的日期。该请求需要格式为“yyyy/MM/dd”的开始计费日期。简单的任务和“它在 Dev 中工作”。

当我将 API 代码发布到我们的暂存环境时,提交失败(来自 Moneris 的一个非常无助的错误,“系统或数据问题。请重试。”)。我已经确定它实际上是有争议的开始日期的日期格式。

在 Dev 中,输出如上所示,但是,在暂存时,输出格式为“yyyy-MM-dd”。这会破坏提交。我竟然用正确的格式硬编码一个值,它成功了。所以我们知道输出格式是有问题的差异。

我在 DateTime 上没有遇到任何其他 ToString("blah") 实例的问题。它与 DateTimeOffset 有关吗?为什么格式会放弃所指示的内容?

API 是 C# Asp.NetCore 3 解决方案。 开发环境:Windows 10 Pro 暂存环境:Windows Server 2019 标准版

【问题讨论】:

你需要发minimal reproducible example 至少贴出你用来创建字符串的实际代码! 这能回答你的问题吗? Datetime acting weird on different computers 如果您需要在每台机器上以每种语言都一致的固定日期格式,您必须提供(至少)格式字符串,以及(更好)相应的 CultureInfo @gunr2171 虽然引用的问题以某种方式解决了日期的本地化问题,但我根本不推荐接受的答案,因为绝对不鼓励以这种方式构建 SQL 查询...... 【参考方案1】:

在自定义DateTime 格式字符串中,未转义的/ 表示日期分隔符,这是特定于文化的。如果运行您的程序的机器配置了 en-US 文化,那么分隔符是 /,正如您所期望的那样。但是 ar-DZ 使用-,tr-TR 使用. 等(更多信息请参见here。)

为确保字符串始终使用/字符格式化,您需要对它们进行转义:

date.ToString(@"yyyy\/MM\/dd")

date.ToString("yyyy'/'MM'/'dd")

【讨论】:

谢谢,我尝试强制使用“/”的文化,这也奏效了。 firstAutoChargeDate?.ToString("yyyy/MM/dd", new System.Globalization.CultureInfo("en-GB")) @JesselAquing 是的,这也有效!虽然更冗长;)

以上是关于DateTimeOffset.ToString() 格式化输出在环境中不一致的主要内容,如果未能解决你的问题,请参考以下文章