Joe*_*eth 10 c# globalization localization
我有一个DateTime对象,我想输出小时,分钟,秒和小数秒作为当前文化本地化的字符串.
这有两个问题.
第一个问题是没有标准DateTime格式显示小数秒.我基本上想知道如何获得长时间的 DateTime格式,但是使用小数秒.
我当然可以获得DateTimeFormatInfo.LongTimePattern并附加".fff"并将其传递给它DateTime.ToString(),但是一些特定于文化的格式,特别是US,以AM/PM结束.所以事情并非那么简单.
第二个问题是,DateTime.ToString()似乎没有本地化数字小数分隔符.如果我决定强制每个文化使用硬编码自定义时间格式,它仍然不会创建本地化字符串,因为数字小数分隔符将不是特定于文化的.
更复杂的是,某些文化的日期时间格式使用句点作为格式的一部分.这使得很难放置占位符,例如句点,并用文化特定的小数分隔符替换它.
现在我已经采用了这种解决方法:
string format = string.Format("HH:mm:ss{0}fff",
CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);
string time = DateTime.Now.ToString(format);
Run Code Online (Sandbox Code Playgroud)
我认为应该适用于没有与时间分隔符相同的小数分隔符的每种文化,但这是一个假设.
注意:尽管对这两个问题都有一个解决方案会很好,但对于我的特定应用程序,我更感兴趣的是使用小数秒来定制自定义日期时间格式而不是使用标准日期时间格式.
第一个问题是没有标准的DateTime格式显示小数秒.我基本上想知道如何获得长时间的DateTime格式,但是使用小数秒.
您可以考虑使用长格式并将":ss"替换为":ss.fff",可能使用特定于区域性的小数点分隔符:
string longPattern = culture.DateTimeFormat.LongTimePattern;
if (!longPattern.Contains(":ss"))
{
// ???? Throw an exception? Test this with all system cultures, but be aware
// that you might see custom ones...
}
// Only do it if the long pattern doesn't already contain .fff... although if
// it does, you might want to replace it using the culture's decimal separator...
if (!longPattern.Contains(".fff"))
{
longPattern = longPattern.Replace(":ss",
":ss" + culture.NumberFormat.DecimalSeparator + "fff");
}
string timeText = time.ToString(longPattern, culture);
Run Code Online (Sandbox Code Playgroud)
更复杂的是,某些文化的日期时间格式使用句点作为格式的一部分.这使得很难放置占位符,例如句点,并用文化特定的小数分隔符替换它.除此之外,它应该最终将价值放在正确的位置.你是否总是想要三位数,即使该值是精确的秒(或半秒等)?
.FFF如果没有,请使用
我怀疑这就是为什么不使用特定于文化的小数分隔符.我发现自己很奇怪 - 事实上,我已经让Noda Time表现得一样,即使我不相信它是对的.
最终,很多像这样的问题是根本问题:如果一个文化具有代表"与分数秒的时间"没有固定的方式,你已经得到了代表小数秒,那么最好你要能够做到有点像kludge.