在 DateTime.ParseExact 中对 IFormatProvider 使用固定区域性

Using invariant culture with IFormatProvider in DateTime.ParseExact

提问人:Ammar 提问时间:8/13/2018 更新时间:8/13/2018 访问量:2734

问:

在 ParseExact 方法的第一个重载中

public static DateTime ParseExact (string s, string format, IFormatProvider provider);

根据 Microsoft 的说法:

如果 format 是不包含日期或时间分隔符的自定义格式模式(例如“yyyyMMddHHmm”),请对提供程序参数使用固定区域性,并使用每个自定义格式说明符的最宽形式。例如,如果要在格式模式中指定小时数,请指定较宽的格式“HH”,而不是较窄的格式“H”。

特别是,如果我们使用标准格式模式,我们可以使用任何其他文化

如果我们使用不包括日期或时间分隔符的自定义格式模式,那么使用固定区域性和最广泛的自定义说明符的真正目的是什么?

C# 日期时间 不变区域性

评论

0赞 Jeroen Mostert 8/13/2018
对于初学者来说,格式模式仍然是特定于区域性的。根据文档:“”MM“自定义格式说明符将月份表示为 01 到 12 的数字(对于有 13 个月的日历,则表示从 1 到 13)。为了排除所有这些变化,明确不变区域性会有所帮助。(此外,如果使用固定区域性,框架中的几个代码路径会使用优化的变体,尽管我不知道是否是其中之一。MMDateTime.ParseExact

答:

1赞 Barr J 8/13/2018 #1

不变文化的真正目的取自这个问题的答案,因为它最好地描述了它的目的:

并非所有区域性都对日期和小数/货币使用相同的格式 值。

当您转换输入值(读取)时,这对您很重要 以字符串形式存储为 DateTime、float、double 或 decimal。它 如果您尝试将上述数据类型格式化为 用于显示或存储的字符串(写入)。

如果您知道您的日期和十进制的具体文化 / 货币值将提前,您可以使用该特定 CultureInfo 属性(即 CultureInfo(“en-GB”))。例如,如果你 期待用户输入。

如果符合以下条件,则使用 CultureInfo.InvariantCulture 属性 格式化或解析应由一段 独立于用户本地设置的软件。

总而言之,不变区域性将有助于转换为存储为浮点数、十进制或 as 的字符串,当您尝试格式化或解析一个字符串时,它也应该有所帮助,该字符串应该可以由独立于用户本地设置的软件解析,正如引用所说,这就是什么DateTime

最广泛的自定义说明符

意思是说。

2赞 Dirk 8/13/2018 #2

其目的是以一种众所周知的方式来格式化日期和数字,该方法不依赖于系统或用户区域设置。InvariantCulture

每次格式化不适合人类解析的内容时,都应该使用它。例如,在 JSON 或 XML 文件中,您希望以 ISO 格式存储日期,这样就不会有歧义。另一方面,如果您在屏幕上显示日期,则通常会尊重用户选择的区域性,并以首选方式显示。


如果您使用自定义格式,那么如果生成的字符串可以解析回完全相同的日期和时间,那肯定是件好事。为了在没有分隔符的情况下做到这一点,您必须为每个组件使用固定长度的字符串。

// omitting CultureInfo.InvariantCulture for brevity
var dt = new DateTime(2018,1,2,3,45,6);
dt.ToString("yyyyMMddHHmmss") // returns "20180102034506"
dt.ToString("yyyyMdHms")      // returns "2018123456"

你可以很容易地看到第二个不是唯一的,即还有其他日期将返回相同的字符串。为了避免使用每个组件的更广泛形式。