我正在寻找一种在 C# 和 Delphi 中正确显示大于 24 小时的本地化持续时间的方法。我的意思是,DateTime 类型经常提供这样的字符串函数,但是时间跨度没有,为什么?
而且我什至不知道非本地化时间跨度的正确格式是什么。例如,持续 2 天 10 小时 30 分钟。我发现有些会显示时间跨度为 2.10:30:00 或 2:10:30:00 或 2 10:30:00。
请帮忙,谢谢。
对于不变的文化(非本地化):
myDateTime.ToString(CultureInfo.InvariantCulture)
否则,只需使用 myDateTime.ToShortDateString() 或 .ToLongDateString() .. 它将使用:
System.Threading.Thread.CurrentThread.CurrentUICulture
在这种情况下..
或者如果您有特定的想法,您可以这样做
var myCulture = CultureInfo.GetCultureInfo("en-GB");
dt.ToString(myCulture);
编辑时间跨度:
例子:
DateTime dt1 = new DateTime(2012, 7, 17, 12, 30, 0);
DateTime dt2 = new DateTime(2012, 7, 18, 14, 40, 0);
TimeSpan ts = dt2 - dt1;
string s = ts.ToString("G", CultureInfo.InvariantCulture);
更多示例:http: //msdn.microsoft.com/en-us/library/dd784379.aspx
编辑2:
有关 TimeSpan 格式字符串的更多信息:http: //msdn.microsoft.com/en-us/library/ee372286.aspx
您可以遵循ISO 8601,可以在此处找到规范的 PDF 。见部分4.4.3 Duration
但是,使用本文档中列出的约定对我来说看起来相当复杂,因为根据本规范,您需要包含有关时间间隔何时发生的上下文:
日历年、日历月、日历周或日历日的持续时间取决于其在日历中的位置。因此,只有知道所使用的日历年、日历月、日历周或日历日的持续时间,才能评估名义持续时间的确切持续时间。
如果时间跨度发生的实际时刻与您的应用程序无关,那么忘记年份和月份部分并坚持使用格式可能就足够了nnDTnnHnnMnnS
。TimeSpan
使用标准方法应该不难实现。
更新:进一步阅读,这个标准似乎并不适用于你的问题:
持续时间用作时间间隔和重复时间间隔表示中的一个组成部分,本国际标准不促进持续时间的表示。
我将在这里留下答案,以避免其他人像我一样走进这个死胡同,或者如果您认为“遵循标准”就足够了......