在DateTime.ParseExact中将不变文化与IFormatProvider一起使用

时间:2018-08-13 10:51:51

标签: c# datetime invariantculture

在ParseExact方法的第一个重载中

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

根据Microsoft:

  

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

特别是如果我们使用标准格式格式,那么我们可以使用任何其他区域性

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

2 个答案:

答案 0 :(得分: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"

您可以轻松地看到第二个不是唯一的,即还有其他日期将返回相同的字符串。为了避免使用每个组件的较宽形式。

答案 1 :(得分:1)

不变文化的真正目的来自question的答案,因为它描述了最佳目的:

  

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

     

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

     

如果您知道日期和小数点/   货币值会提前,您可以使用特定的   CultureInfo属性(即CultureInfo(“ en-GB”))。例如,如果您   期待用户输入。

     

如果您使用的是CultureInfo.InvariantCulture属性   格式化或解析应该由一个片段解析的字符串   独立于用户本地设置的软件。

总而言之,不变的区域性将有助于以浮点,小数或as DateTime形式存储的字符串进行转换,这在尝试格式化或解析应为字符串的字符串时也有帮助如引用所述,可以由独立于用户本地设置的软件进行解析

  

最广泛的自定义说明符

表示。