提问人:Ammar 提问时间:8/13/2018 更新时间:8/13/2018 访问量:2734
在 DateTime.ParseExact 中对 IFormatProvider 使用固定区域性
Using invariant culture with IFormatProvider in DateTime.ParseExact
问:
在 ParseExact 方法的第一个重载中
public static DateTime ParseExact (string s, string format, IFormatProvider provider);
根据 Microsoft 的说法:
如果 format 是不包含日期或时间分隔符的自定义格式模式(例如“yyyyMMddHHmm”),请对提供程序参数使用固定区域性,并使用每个自定义格式说明符的最宽形式。例如,如果要在格式模式中指定小时数,请指定较宽的格式“HH”,而不是较窄的格式“H”。
特别是,如果我们使用标准格式模式,我们可以使用任何其他文化
如果我们使用不包括日期或时间分隔符的自定义格式模式,那么使用固定区域性和最广泛的自定义说明符的真正目的是什么?
答:
不变文化的真正目的取自这个问题的答案,因为它最好地描述了它的目的:
并非所有区域性都对日期和小数/货币使用相同的格式 值。
当您转换输入值(读取)时,这对您很重要 以字符串形式存储为 DateTime、float、double 或 decimal。它 如果您尝试将上述数据类型格式化为 用于显示或存储的字符串(写入)。
如果您知道您的日期和十进制的具体文化 / 货币值将提前,您可以使用该特定 CultureInfo 属性(即 CultureInfo(“en-GB”))。例如,如果你 期待用户输入。
如果符合以下条件,则使用 CultureInfo.InvariantCulture 属性 格式化或解析应由一段 独立于用户本地设置的软件。
总而言之,不变区域性将有助于转换为存储为浮点数、十进制或 as 的字符串,当您尝试格式化或解析一个字符串时,它也应该有所帮助,该字符串应该可以由独立于用户本地设置的软件解析,正如引用所说,这就是什么DateTime
最广泛的自定义说明符
意思是说。
其目的是以一种众所周知的方式来格式化日期和数字,该方法不依赖于系统或用户区域设置。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"
你可以很容易地看到第二个不是唯一的,即还有其他日期将返回相同的字符串。为了避免使用每个组件的更广泛形式。
上一个:使用点分隔符将双精度写入文本文件
评论
MM
DateTime.ParseExact