DateTime.ToString 和 DateTime.ParseExact 之间的日期时间格式不一致

发布于 2025-01-09 02:24:39 字数 778 浏览 0 评论 0原文

这很好奇。例如,当我运行时,

DateTime.Now.ToString("dd/MM/yyyy")

结果是

"22-02-2022"

注意我请求斜杠分隔符,而不是连字符分隔符。然而,我想这是一个控制面板定义,尽管我认为它不应该。

好吧......现在,我尝试做相反的事情,将字符串转换为日期,所以我使用了这个,

DateTime.ParseExact("22-02-2022", "dd/MM/yyyy", System.Globalization.CultureInfo.CurrentUICulture, System.Globalization.DateTimeStyles.None)

之后,抛出了 FormatException

为了保持一致,我认为如果对于系统来说,连字符是分隔符,那么在两个方向转换时,分隔符应该是相同的,不是吗?

当然,如果我使用的话,

DateTime.ParseExact("22/02/2022", "dd/MM/yyyy", System.Globalization.CultureInfo.CurrentUICulture, System.Globalization.DateTimeStyles.None)

它会起作用。

作为解决方法,我在将字符串转换为日期之前用斜杠替换连字符,但这只是一个丑陋的解决方法。有没有办法让系统保持一致?

海梅

this is very curious. When I run, for example,

DateTime.Now.ToString("dd/MM/yyyy")

Result is

"22-02-2022"

Notice that I requested a slash separator, not hyphen separator. However, I guess this is a control panel definition although I think it shouldn't.

Well.... now, I try to do the contrary, converting a string to a date, so I used this,

DateTime.ParseExact("22-02-2022", "dd/MM/yyyy", System.Globalization.CultureInfo.CurrentUICulture, System.Globalization.DateTimeStyles.None)

After that, a FormatException is thrown.

To be consistent, I think if for the system, a hyphen is the separator, when converting in both directions, that separator should be the same, shouldn't it?

Of course, if I use,

DateTime.ParseExact("22/02/2022", "dd/MM/yyyy", System.Globalization.CultureInfo.CurrentUICulture, System.Globalization.DateTimeStyles.None)

It works.

As a workaround, I replace hyphens by slashes before converting string to date, but that is only an ugly workaround. Is there a way to make the system be consistent?

Jaime

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

要走干脆点 2025-01-16 02:24:39

您可能会看到该问题,因为计算机的区域/本地化设置不使用 / 作为日期分隔符。

“/”自定义格式说明符表示:

要更改特定日期和时间字符串的日期分隔符,
指定文字字符串定界符内的分隔符。为了
例如,自定义格式字符串 mm'/'dd'/'yyyy 会生成结果
始终使用“/”作为日期分隔符的字符串。

进而:

如果使用“/”格式说明符而没有其他自定义格式
说明符,它被解释为标准日期和时间格式
说明符并抛出 FormatException

您有几个选项可以输出所需的分隔符:

  1. 将日期分隔符用撇号括起来:
    DateTime.Now.ToString("dd'/'MM'/'yyyy"); 
    
  2. 调用 ToString 时使用 CultureInfo.InvariantCulture
    DateTime.Now.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture)
    

这两者都应生成格式为 dd/MM/yyyy 的日期,并使用“/”作为分隔符。

演示

It's likely you're seeing that issue because the region/localization settings of the machine doesn't use / as a date separator.

The docs on the "/" custom format specifier says:

To change the date separator for a particular date and time string,
specify the separator character within a literal string delimiter. For
example, the custom format string mm'/'dd'/'yyyy produces a result
string in which "/" is always used as the date separator.

And then:

If the "/" format specifier is used without other custom format
specifiers, it's interpreted as a standard date and time format
specifier and throws a FormatException.

You have a couple of options to output the desired separator:

  1. Wrap the date separator in apostrophes:
    DateTime.Now.ToString("dd'/'MM'/'yyyy"); 
    
  2. Use CultureInfo.InvariantCulture when calling ToString:
    DateTime.Now.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture)
    

Both of these should produce a date in the format dd/MM/yyyy using "/" for the separator.

Demo

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文