C# 将秒转换为 (Hour:Minutes:Seconds:Milliseconds) 时间的最佳方法是什么?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/463642/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
What is the best way to convert seconds into (Hour:Minutes:Seconds:Milliseconds) time?
提问by
What is the best way to convert seconds into (Hour:Minutes:Seconds:Milliseconds) time?
将秒转换为 (Hour:Minutes:Seconds:Milliseconds) 时间的最佳方法是什么?
Let's say I have 80 seconds, are there any specialized classes/techniques in .NET that would allow me to convert those 80 seconds into (00h:00m:00s:00ms) format like to DateTime or something?
假设我有 80 秒,.NET 中是否有任何专门的类/技术可以让我将这 80 秒转换为 (00h:00m:00s:00ms) 格式,如 DateTime 或其他格式?
采纳答案by Curtis Shipley
For .Net <= 4.0Use the TimeSpan class.
对于.Net <= 4.0使用 TimeSpan 类。
TimeSpan t = TimeSpan.FromSeconds( secs );
string answer = string.Format("{0:D2}h:{1:D2}m:{2:D2}s:{3:D3}ms",
t.Hours,
t.Minutes,
t.Seconds,
t.Milliseconds);
(As noted by Inder Kumar Rathore) For .NET > 4.0you can use
(如 Inder Kumar Rathore 所述)对于.NET > 4.0,您可以使用
TimeSpan time = TimeSpan.FromSeconds(seconds);
//here backslash is must to tell that colon is
//not the part of format, it just a character that we want in output
string str = time .ToString(@"hh\:mm\:ss\:fff");
(From Nick Molyneux) Ensure that seconds is less than TimeSpan.MaxValue.TotalSeconds
to avoid an exception.
(来自 Nick Molyneux)确保秒数小于TimeSpan.MaxValue.TotalSeconds
以避免异常。
回答by Jim Mischel
If you know you have a number of seconds, you can create a TimeSpan value by calling TimeSpan.FromSeconds:
如果你知道你有很多秒数,你可以通过调用 TimeSpan.FromSeconds 创建一个 TimeSpan 值:
TimeSpan ts = TimeSpan.FromSeconds(80);
You can then obtain the number of days, hours, minutes, or seconds. Or use one of the ToString overloads to output it in whatever manner you like.
然后,您可以获得天数、小时数、分钟数或秒数。或者使用 ToString 重载之一以您喜欢的任何方式输出它。
回答by toad
回答by Stefan
In VB.NET, but it's the same in C#:
在 VB.NET 中,但在 C# 中是相同的:
Dim x As New TimeSpan(0, 0, 80)
debug.print(x.ToString())
' Will print 00:01:20
回答by Jim Petkus
The TimeSpan constructor allows you to pass in seconds. Simply declare a variable of type TimeSpan amount of seconds. Ex:
TimeSpan 构造函数允许您以秒为单位传递。只需声明一个 TimeSpan 类型的变量。前任:
TimeSpan span = new TimeSpan(0, 0, 500);
span.ToString();
回答by Oliver Friedrich
I'd suggest you use the TimeSpan
class for this.
我建议你使用这个TimeSpan
类。
public static void Main(string[] args)
{
TimeSpan t = TimeSpan.FromSeconds(80);
Console.WriteLine(t.ToString());
t = TimeSpan.FromSeconds(868693412);
Console.WriteLine(t.ToString());
}
Outputs:
输出:
00:01:20
10054.07:43:32
回答by Inder Kumar Rathore
For .NET > 4.0you can use
对于.NET > 4.0,您可以使用
TimeSpan time = TimeSpan.FromSeconds(seconds);
//here backslash is must to tell that colon is
//not the part of format, it just a character that we want in output
string str = time .ToString(@"hh\:mm\:ss\:fff");
or if you want date time format then you can also do this
或者如果你想要日期时间格式,那么你也可以这样做
TimeSpan time = TimeSpan.FromSeconds(seconds);
DateTime dateTime = DateTime.Today.Add(time);
string displayTime = dateTime.ToString("hh:mm:tt");
For more you can check Custom TimeSpan Format Strings
有关更多信息,您可以查看自定义时间跨度格式字符串
回答by Moh Rezaee
private string ConvertTime(double miliSeconds)
{
var timeSpan = TimeSpan.FromMilliseconds(totalMiliSeconds);
// Converts the total miliseconds to the human readable time format
return timeSpan.ToString(@"hh\:mm\:ss\:fff");
}
//Test
//测试
[TestCase(1002, "00:00:01:002")]
[TestCase(700011, "00:11:40:011")]
[TestCase(113879834, "07:37:59:834")]
public void ConvertTime_ResturnsCorrectString(double totalMiliSeconds, string expectedMessage)
{
// Arrange
var obj = new Class();;
// Act
var resultMessage = obj.ConvertTime(totalMiliSeconds);
// Assert
Assert.AreEqual(expectedMessage, resultMessage);
}
回答by Evgeni Nabokov
Why do people need TimeSpan ANDDateTime if we have DateTime.AddSeconds()?
如果我们有 DateTime.AddSeconds() ,为什么人们需要 TimeSpan和DateTime?
var dt = new DateTime(2015, 1, 1).AddSeconds(totalSeconds);
The date is arbitrary. totalSeconds can be greater than 59 and it is a double. Then you can format your time as you want using DateTime.ToString():
日期是任意的。totalSeconds 可以大于 59 并且是双精度值。然后您可以根据需要使用 DateTime.ToString() 格式化您的时间:
dt.ToString("H:mm:ss");
This does not work if totalSeconds < 0 or > 59:
如果 totalSeconds < 0 或 > 59,这不起作用:
new DateTime(2015, 1, 1, 0, 0, totalSeconds)
回答by Andrew
I did some benchmarks to see what's the fastest way and these are my results and conclusions. I ran each method 10M times and added a comment with the average time per run.
我做了一些基准测试,看看什么是最快的方法,这些是我的结果和结论。我将每种方法运行了 10M 次,并添加了每次运行平均时间的注释。
If your input milliseconds are not limited to one day(your result may be 143:59:59.999), these are the options, from faster to slower:
如果您的输入毫秒数不限于一天(您的结果可能是 143:59:59.999),则有以下选项,从快到慢:
// 0.86 ms
static string Method1(int millisecs)
{
int hours = millisecs / 3600000;
int mins = (millisecs % 3600000) / 60000;
// Make sure you use the appropriate decimal separator
return string.Format("{0:D2}:{1:D2}:{2:D2}.{3:D3}", hours, mins, millisecs % 60000 / 1000, millisecs % 1000);
}
// 0.89 ms
static string Method2(int millisecs)
{
double s = millisecs % 60000 / 1000.0;
millisecs /= 60000;
int mins = millisecs % 60;
int hours = millisecs / 60;
return string.Format("{0:D2}:{1:D2}:{2:00.000}", hours, mins, s);
}
// 0.95 ms
static string Method3(int millisecs)
{
TimeSpan t = TimeSpan.FromMilliseconds(millisecs);
// Make sure you use the appropriate decimal separator
return string.Format("{0:D2}:{1:D2}:{2:D2}.{3:D3}",
(int)t.TotalHours,
t.Minutes,
t.Seconds,
t.Milliseconds);
}
If your input milliseconds are limited to one day(your result will never be greater then 23:59:59.999), these are the options, from faster to slower:
如果您的输入毫秒数被限制为一天(您的结果永远不会大于 23:59:59.999),这些是选项,从快到慢:
// 0.58 ms
static string Method5(int millisecs)
{
// Fastest way to create a DateTime at midnight
// Make sure you use the appropriate decimal separator
return DateTime.FromBinary(599266080000000000).AddMilliseconds(millisecs).ToString("HH:mm:ss.fff");
}
// 0.59 ms
static string Method4(int millisecs)
{
// Make sure you use the appropriate decimal separator
return TimeSpan.FromMilliseconds(millisecs).ToString(@"hh\:mm\:ss\.fff");
}
// 0.93 ms
static string Method6(int millisecs)
{
TimeSpan t = TimeSpan.FromMilliseconds(millisecs);
// Make sure you use the appropriate decimal separator
return string.Format("{0:D2}:{1:D2}:{2:D2}.{3:D3}",
t.Hours,
t.Minutes,
t.Seconds,
t.Milliseconds);
}
In case your input is just seconds, the methods are slightly faster. Again, if your input seconds are not limited to one day(your result may be 143:59:59):
如果您的输入只是 seconds,这些方法会稍微快一点。同样,如果您输入的秒数不限于一天(您的结果可能是 143:59:59):
// 0.63 ms
static string Method1(int secs)
{
int hours = secs / 3600;
int mins = (secs % 3600) / 60;
secs = secs % 60;
return string.Format("{0:D2}:{1:D2}:{2:D2}", hours, mins, secs);
}
// 0.64 ms
static string Method2(int secs)
{
int s = secs % 60;
secs /= 60;
int mins = secs % 60;
int hours = secs / 60;
return string.Format("{0:D2}:{1:D2}:{2:D2}", hours, mins, s);
}
// 0.70 ms
static string Method3(int secs)
{
TimeSpan t = TimeSpan.FromSeconds(secs);
return string.Format("{0:D2}:{1:D2}:{2:D2}",
(int)t.TotalHours,
t.Minutes,
t.Seconds);
}
And if your input seconds are limited to one day(your result will never be greater then 23:59:59):
如果您的输入秒数限制为一天(您的结果永远不会大于 23:59:59):
// 0.33 ms
static string Method5(int secs)
{
// Fastest way to create a DateTime at midnight
return DateTime.FromBinary(599266080000000000).AddSeconds(secs).ToString("HH:mm:ss");
}
// 0.34 ms
static string Method4(int secs)
{
return TimeSpan.FromSeconds(secs).ToString(@"hh\:mm\:ss");
}
// 0.70 ms
static string Method6(int secs)
{
TimeSpan t = TimeSpan.FromSeconds(secs);
return string.Format("{0:D2}:{1:D2}:{2:D2}",
t.Hours,
t.Minutes,
t.Seconds);
}
As a final comment, let me add that I noticed that string.Format
is a bit faster if you use D2
instead of 00
.
作为最后的评论,让我补充一点,我注意到string.Format
如果您使用D2
而不是00
.