2

在 ParseExact 方法的第一个重载中

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

根据微软:

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

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

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

4

2 回答 2

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"

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

于 2018-08-13T11:09:55.697 回答
1

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

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

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

如果您提前知道日期和十进制/货币值将采用哪种特定文化,则可以使用该特定 CultureInfo 属性(即 CultureInfo("en-GB"))。例如,如果您期望用户输入。

如果您正在格式化或解析应该可由独立于用户本地设置的软件解析的字符串,则使用 CultureInfo.InvariantCulture 属性。

总而言之,不变的文化将有助于将字符串转换为存储为 float、decimal 或 as 的字符串DateTime,当您尝试格式化或解析应该可由独立于软件的软件解析的字符串时,它也有助于用户的本地设置,正如引用所说的那样

最广泛的自定义说明符

意思是这样。

于 2018-08-13T11:03:30.840 回答