C# 如何将日期时间转换为本地化的小数秒字符串?
我有一个DateTime对象,我想将小时、分钟、秒和分数秒作为一个字符串输出,该字符串针对当前区域性进行本地化 这有两个问题 第一个问题是没有标准的C# 如何将日期时间转换为本地化的小数秒字符串?,c#,localization,globalization,C#,Localization,Globalization,我有一个DateTime对象,我想将小时、分钟、秒和分数秒作为一个字符串输出,该字符串针对当前区域性进行本地化 这有两个问题 第一个问题是没有标准的DateTime格式显示小数秒。我基本上想知道如何获得DateTime格式,但要使用小数秒 当然,我可以获取DateTimeFormatInfo.LongTimePattern并向其添加“.fff”,然后将其传递给DateTime.ToString(),但是一些特定于文化的格式,特别是我们,以AM/PM结尾。所以这并不是那么简单 第二个问题是,Dat
DateTime
格式显示小数秒。我基本上想知道如何获得DateTime格式,但要使用小数秒
当然,我可以获取DateTimeFormatInfo.LongTimePattern
并向其添加“.fff”,然后将其传递给DateTime.ToString()
,但是一些特定于文化的格式,特别是我们,以AM/PM结尾。所以这并不是那么简单
第二个问题是,DateTime.ToString()
似乎没有本地化数字十进制分隔符。如果我决定强制每个区域性使用硬编码的自定义时间格式,它仍然不会创建本地化字符串,因为数字小数分隔符不是特定于区域性的
使事情进一步复杂化的是,一些区域性具有日期-时间格式,这些格式使用句点作为其格式的一部分。这使得很难放置占位符(例如句点)并用特定于区域性的小数分隔符替换它
目前,我采用了以下解决方法:
string format = string.Format("HH:mm:ss{0}fff",
CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);
string time = DateTime.Now.ToString(format);
我认为这应该适用于没有与时间分隔符相同的十进制分隔符的所有文化,但这是一个假设
注意:虽然这两个问题都有一个解决方案会很好,但对于我的特定应用程序,我更感兴趣的是使用分数秒来本地化自定义日期时间格式,而不是使用标准日期时间格式
第一个问题是没有标准的日期时间格式来显示小数秒。我本质上想知道如何获得长时间的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);
使事情进一步复杂化的是,一些区域性具有日期-时间格式,这些格式使用句点作为其格式的一部分。这使得很难放置占位符(例如句点)并用特定于区域性的小数分隔符替换它。不过,除此之外,它应该最终将值放在正确的位置。但是,即使值是精确的秒(或半秒,等等),您是否总是想要三位数字?如果没有,请使用.FFF
我怀疑这就是为什么没有使用特定于区域性的小数分隔符。我自己也觉得很奇怪——事实上,我让自己的行为举止也一样,即使我是一个年轻人
归根结底,像这样的许多问题从根本上是有问题的:如果一种文化没有固定的方式来表示“分数秒的时间”,而你必须表示分数秒,那么你能做的最好的事情就是有点混乱。我想这会让你接近你的要求
var now = DateTime.Now;
var seconds = now.TimeOfDay.TotalSeconds % 60;
var timeText = string.Format(CultureInfo.GetCultureInfo("fr-FR"),
"{0:d} {0:hh:mm:}{1:00.000}", now, seconds);
或者只是使用
var timeText = string.Format(CultureInfo.CurrentCulture,
"{0:d} {0:hh:mm:}{1:00.000}", now, seconds);
比如说
- fr:20/03/2012 10:20:10088
- en GB:20/03/2012 10:21:08.724
- en US:3/20/2012 10:21:24.470
System.Globalization.CultureInfo before = System.Threading.Thread.CurrentThread.CurrentCulture;
try
{
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
string timestr = DateTime.Now.ToString();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
System.Threading.Thread.CurrentThread.CurrentUICulture = before;
}
我认为任何文化习俗都不包括分数秒。你的方法看起来还可以,但我会使用LongTimePattern并替换
ss
,以克服AM/PM vs HH问题。1)这到底是如何解决问题的?2) 为什么您认为这比将区域性作为参数传递给ToString
?我认为使用这种方法,您可以选择区域性,然后只关注格式问题。是的,您可以在ToString()中传递区域性,但是如果您有更多的格式化操作要做,我喜欢用我的方式。这只是一个不同的观点问题是DateTime.ToString()没有本地化十进制分隔符,或者没有显示小数秒的标准格式。我认为这个解决方案比我为自定义格式字符串提供的解决方案更具说服力。是否可以安全地假设所有区域性都使用:ss而不是:s?不过,我认为这可以通过抛出异常来处理。@jcmcbeth:Pass。大概您可以很容易地检查所有系统区域性,但这并不能阻止有人提出自己的疯狂区域性设置。