如何将DateTime转换为具有本地化小数秒的字符串?

时间:2012-03-20 20:46:21

标签: c# localization globalization

我有一个DateTime对象,我想输出小时,分钟,秒和小数秒作为本地文化的本地化字符串。

这有两个问题。

第一个问题是没有标准DateTime格式显示小数秒。我基本上想知道如何获得long time 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);

我认为应该适用于每个与时间分隔符没有相同小数分隔符的文化,但这是一个假设。

注意:尽管对这两个问题都有一个解决方案会很好,但对于我的特定应用程序,我更感兴趣的是使用小数秒来定制自定义日期时间格式而不是使用标准日期时间格式。

3 个答案:

答案 0 :(得分:6)

  

第一个问题是没有标准的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);
  

为了使问题更加复杂,一些文化的日期时间格式使用句点作为格式的一部分。这使得很难放置占位符,例如句点,并用文化特定的小数分隔符替换它。除此之外,它应该最终将价值放在正确的位置。你肯定总是想要三位数,即使该值是精确的秒(或半秒等)?如果没有,请使用.FFF

我怀疑是为什么不使用特定于文化的小数点分隔符。我发现自己很奇怪 - 事实上,即使我是Noda Time,我也让not convinced it's right表现得一样。

最终,像这样的很多问题从根本上是有问题的:如果一个文化 没有固定的方式来代表“一小时秒的时间”并且你得到了代表小数秒,那么你能做的最好的就是一点点。

答案 1 :(得分:2)

我认为这会给你一些接近你需要的东西

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-FR:20/03/2012 10:20:10,088
  • en-GB:20/03/2012 10:21:08.724
  • en-US:3/20/2012 10:21:24.470

答案 2 :(得分:-1)

一般来说,我改变当前的文化,然后进行我需要的操作。

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;
}