繁体   English   中英

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

[英]How can I convert a DateTime to a string with fractional seconds that is localized?

我有一个DateTime对象,我想将小时,分钟,秒和小数秒输出为针对当前区域性而本地化的字符串。

这有两个问题。

第一个问题是没有标准的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格式显示小数秒。 我本质上想知道如何获取长时间的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请使用.FFF

我怀疑这就是为什么不使用特定于文化的小数点分隔符的原因 我自己发现这很奇怪-的确,即使我不确信这是正确的 ,我也使Noda Time的行为方式相同。

最终,很多像这样的问题是根本问题:如果一个文化没有固定的代表“以分数秒的时间”的方式,你一定要代表小数秒,那么最好你要能够做到有点纠结。

我认为这将为您提供接近所需的东西

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
  • zh-CN:20/03/2012 10:21:08.724
  • zh-CN:2012/3/20 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM