For*_*rna 2 c# string datetime
今天发现一个奇怪的现象:
我试图从数据库加载一些日期(保存为字符串),我注意到由于本地数据库的格式,日期时间获取失败,我调查并发现,虽然从数据库保存和加载这些值的类总是使用喜欢保存的格式字符串yyyy/MM/dd,但出于某种原因,我的数据库上的日期采用格式yyyy-MM-dd.
我进行了更多调查,发现错误的值是我在测试一些新功能时保存的值,分析更多后,我发现所有对DateTime.ToString(formatStr)上述格式字符串的调用都用“-”而不是'/'正如我所料。
此时,我创建了一个简单的控制台程序,只有 4 行,输出在注释中。
Console.WriteLine(DateTime.Today
.ToString("yyyy/MM/dd")); // Ouputs 2022-10-24
Console.WriteLine(DateTime.Today
.ToString("yyyy/MM/dd", new CultureInfo("en-US"))); // Ouputs 2022-10-24
Console.WriteLine(DateTime.Today
.ToString("yyyy/MM/dd", CultureInfo.InvariantCulture)); // Ouputs 2022/10/24
Console.WriteLine(DateTime.Today
.ToString("yyyy/MM/dd", CultureInfo.CurrentCulture)); // Ouputs 2022-10-24
Run Code Online (Sandbox Code Playgroud)
我补充说,对于我所有的同事来说,前面所有行的结果2022/10/24正如我所期望的那样,我目前的文化是 en-US。
我错过了什么吗?我认识的人似乎都无法复制这一点,但因此我遇到了很多非常有趣的错误。
编辑:更正的代码片段
日期格式字符串中的“/”不是文字,它具有特殊含义:
“/”自定义格式说明符表示日期分隔符,用于区分年、月、日。从当前或指定区域性的 DateTimeFormatInfo.DateSeparator 属性中检索适当的本地化日期分隔符。
因此它代表本地化的日期分隔符,实际使用的符号取决于当前或指定的区域性。
这意味着在你的情况下CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator是“-”而不是“/”。
现在,在您的测试控制台程序中,您不会将区域性传递给DateTime.ToString,而是将它们传递给Console.WriteLine调用,因此它们对格式没有影响。相反,你应该这样做:
Console.WriteLine(DateTime.Today.ToString("yyyy/MM/dd", new CultureInfo("en-US")));
Run Code Online (Sandbox Code Playgroud)
这将输出您期望的内容。
您还可以使用始终使用“/”作为分隔符的格式字符串:
DateTime.Today.ToString("yyyy'/'MM'/'dd");
Run Code Online (Sandbox Code Playgroud)
更新。至于为什么在你的en-US文化案例中你会看到这个分隔符。这台机器上的日期格式很可能已在 Windows 设置中手动更改。CultureInfo.CurrentCulture反映了这种变化。至于手动创建的实例CultureInfo-CultureInfo有几个构造函数,其中之一是:
public CultureInfo(string name, bool useUserOverride)
Run Code Online (Sandbox Code Playgroud)
第二个参数useUserOverride定义是否会反映用户的此类更改。然后,您在示例中使用的构造函数:
new CultureInfo("en-US")
Run Code Online (Sandbox Code Playgroud)
使用trueas调用上面的构造函数useUserOverride,因此在本例中它也反映了此更改。
如果你这样做:
Console.WriteLine(DateTime.Today
.ToString("yyyy/MM/dd", new CultureInfo("en-US", false)));
Run Code Online (Sandbox Code Playgroud)
那么它不应该使用那些手动更改的设置,然后应该输出您期望的内容。
| 归档时间: |
|
| 查看次数: |
996 次 |
| 最近记录: |