c# - DateTime.ToString ("T") 和 DateTime.ToString ("G") 中的错误?

标签 c# .net datetime

Microsoft specifies : 作为时间分隔符,但似乎至少有两个时间分隔符:一个在小时和分钟之间,另一个在分钟和秒之间。

Long time format settings in control panel
(来源:wellisolutions.de)

Long time format shown by Windows clock
(来源:wellisolutions.de)

有没有办法得到具体的时间分隔符?我需要一个介于小时和分钟之间的时间,另一个介于分钟和秒之间的时间。

我也不介意以其他方式构建我的 DateTime 字符串,例如使用 standard format string TG,但它们都不起作用

mydate.ToString("T");
// Output: 20-29-46
// Expected output: 20-29:46 (as shown by Windows clock)

mydate.ToString("G");
// Output: 09/03-2014 20-29-46
// Expected output: 09/03-2014 20-29:46

最佳答案

只需在 .NET 中根据需要设置格式。例如:

var clonedProvider = (CultureInfo)CultureInfo.CurrentCulture.Clone();

clonedProvider.DateTimeFormat.LongTimePattern = "HH-mm':'ss";
clonedProvider.DateTimeFormat.ShortDatePattern = "dd'/'MM-yyyy";

然后:

mydate.ToString("T", clonedProvider);
mydate.ToString("G", clonedProvider);

请注意,我将冒号 : 和斜杠 / 放入单引号(撇号 ')中,以防止它们被翻译成任何内容您的文化从一开始就有分隔符。我只想要字面上的冒号和斜线。

如果你不想到处写clonedProvider,在你当前的线程上永久改变文化:

Thread.CurrentThread.CurrentCulture = CultureInfo.ReadOnly(clonedProvider);

您的应用程序中是否有很多线程?


在评论后编辑:

如果您想查看操作系统设置如何影响您的 .NET 格式提供程序对象,只需检查字符串:

DateTimeFormatInfo.CurrentInfo.ShortDatePattern
DateTimeFormatInfo.CurrentInfo.LongTimePattern

等等。我想您当前的格式提供程序已将 UseUserOverride 设置为 true,因此来自 Windows 的用户设置将可见。

用户可以输入的“分隔符”的数量没有限制。例如,有人可能会使用 "ddd;dd-MM,yyyy"。所以那里有三个 分隔符。因此,您必须自己检查字符串,看看有多少“分隔符”和“组件”,以及用户在每个地方使用哪些字符作为分隔符。


仔细阅读您的问题,并结合您的示例,我发现您在 Windows 设置中键入了 HH-mm:ss。这有问题。当转换为 .NET 语法时,第一个分隔符 - 成为 时间分隔符。然后下一个分隔符,冒号,在 .NET 中是一个“通配符”,意思是“用时间分隔符代替”。所以冒号也被翻译成破折号。

您应该在 Windows 设置中输入

HH-mm':'ss

您再次用单引号(撇号)保护冒号。

现在,如果您的某个用户首先使用非标准分隔符,然后使用标准分隔符 :(或 /),而没有在单个中引用后者,会怎样?引号?那么,在那种情况下你是对的,Windows 和 .NET 中的行为是有区别的。显然用户不应该输入这样的格式。 您可以将其称为错误。

关于c# - DateTime.ToString ("T") 和 DateTime.ToString ("G") 中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22288233/

相关文章:

file - Dart - 如何获取文件的创建时间?

C# 获取 Azure AD 身份的访问 token

c# - 通过 AJAX MVC 下载 Excel 文件

.net - 如何将可空类型转换为其基础类型?

c# - tabcontrol ownerdraw 更改 tabcontrol 的边框样式

mysql - ISO 8601 日期进入 MySQL 数据库 - 只是无法让它工作

mysql - 按日期搜索 mysql

c# - 在 C# 中使用通配符解析相对路径

c# - 当表的列数多于类时使用 Dapper

c# - 最佳方式 : to implement an interrupt/cancel feature for all your threaded workers