简体   繁体   English

将秒转换为 (Hour:Minutes:Seconds:Milliseconds) 时间的最佳方法是什么?

[英]What is the best way to convert seconds into (Hour:Minutes:Seconds:Milliseconds) time?

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 或其他格式?

For .Net <= 4.0 Use 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.0 you 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以避免异常。

For .NET > 4.0 you 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有关更多信息,您可以查看自定义时间跨度格式字符串

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 重载之一以您喜欢的任何方式输出它。

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.如果您的输入只是 seconds ,这些方法会稍微快一点。 Again, if your input seconds are not limited to one day (your result may be 143:59:59):同样,如果您输入的秒数不限于一天(您的结果可能是 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 .作为最后的评论,让我补充一点,如果您使用D2而不是00 ,我注意到string.Format会快一点。

The TimeSpan constructor allows you to pass in seconds. TimeSpan 构造函数允许您以秒为单位传递。 Simply declare a variable of type TimeSpan amount of seconds.只需声明一个 TimeSpan 类型的变量。 Ex:例如:

TimeSpan span = new TimeSpan(0, 0, 500);
span.ToString();

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

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

For .NET < 4.0 (ex: Unity ) you can write an extension method to have the TimeSpan.ToString(string format) behavior like .NET > 4.0对于.NET < 4.0 (例如: Unity ),您可以编写一个扩展方法来使TimeSpan.ToString(string format)行为像.NET > 4.0

public static class TimeSpanExtensions
{
    public static string ToString(this TimeSpan time, string format)
    {
        DateTime dateTime = DateTime.Today.Add(time);
        return dateTime.ToString(format);
    }
}

And from anywhere in your code you can use it like:您可以在代码的任何位置使用它,例如:

var time = TimeSpan.FromSeconds(timeElapsed);

string formattedDate = time.ToString("hh:mm:ss:fff");

This way you can format any TimeSpan object by simply calling ToString from anywhere of your code.通过这种方式,您可以通过从代码的任何位置简单地调用 ToString 来格式化任何TimeSpan对象。

Why do people need TimeSpan AND DateTime if we have DateTime.AddSeconds()?如果我们有 DateTime.AddSeconds() 为什么人们需要 TimeSpanDateTime?

var dt = new DateTime(2015, 1, 1).AddSeconds(totalSeconds);

The date is arbitrary.日期是任意的。 totalSeconds can be greater than 59 and it is a double. totalSeconds 可以大于 59 并且是双精度值。 Then you can format your time as you want using DateTime.ToString():然后您可以根据需要使用 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)

to get total seconds获得总秒数

var i = TimeSpan.FromTicks(startDate.Ticks).TotalSeconds;

and to get datetime from seconds并从秒中获取日期时间

var thatDateTime = new DateTime().AddSeconds(i)

This will return in hh:mm:ss format这将以 hh:mm:ss 格式返回

 public static string ConvertTime(long secs)
    {
        TimeSpan ts = TimeSpan.FromSeconds(secs);
        string displayTime = $"{ts.Hours}:{ts.Minutes}:{ts.Seconds}";
        return displayTime;
    }
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);
    }

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

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