Cách tốt nhất để chuyển đổi giây thành (Giờ: Phút: Giây: Mili giây) là gì?


290

Cách tốt nhất để chuyển đổi giây thành (Giờ: Phút: Giây: Mili giây) là gì?

Giả sử tôi có 80 giây, có lớp / kỹ thuật chuyên dụng nào trong .NET cho phép tôi chuyển đổi 80 giây đó sang định dạng (00h: 00m: 00s: 00ms) như DateTime hay gì không?

Câu trả lời:


565

Đối với .Net <= 4.0 Sử dụng lớp 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);

(Theo ghi nhận của Inder Kumar Rathore) Đối với .NET> 4.0, bạn có thể sử dụng

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");

(Từ Nick Molyneux) Đảm bảo rằng giây ít hơn TimeSpan.MaxValue.TotalSecondsđể tránh ngoại lệ.


using System;Các lớp cư trú trong System.TimeSpan.
fbmd

61

Đối với .NET> 4.0 bạn có thể sử dụng

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");

hoặc nếu bạn muốn định dạng ngày giờ thì bạn cũng có thể làm điều này

TimeSpan time = TimeSpan.FromSeconds(seconds);
DateTime dateTime = DateTime.Today.Add(time);
string displayTime = dateTime.ToString("hh:mm:tt");

Để biết thêm, bạn có thể kiểm tra Chuỗi định dạng TimeSpan tùy chỉnh


2
Bạn không cần TimeSpan để thêm giây vào DateTime. Chỉ cần sử dụng DateTime.AddSeconds ().
Evgeni Nabokov

@MehdiDehghani cho định dạng 24 giờ bạn sử dụng 'HH' thay vì 'hh'
Inder Kumar Rathore

@InderKumarRathore Tôi đã nói về giải pháp đầu tiên của bạn, HHkhông hợp lệ ở đó.
Mehdi Dehghani

@MehdiDehghani bạn có thể vui lòng sai điều đó không vì đó là 3 năm tôi chưa được mã hóa.NET/C#
Inder Kumar Rathore

1
@InderKumarRathore .ToString(@"hh\:mm\:ss\:fff");đã có 24hrđịnh dạng. HHkhông hợp lệ ở đó với đầu vào như vậy ( lỗi làInput string was not in a correct format. )
Mehdi Dehghani

23

Nếu bạn biết bạn có một số giây, bạn có thể tạo giá trị TimeSpan bằng cách gọi TimeSpan.FromSeconds:

 TimeSpan ts = TimeSpan.FromSeconds(80);

Sau đó, bạn có thể có được số ngày, giờ, phút hoặc giây. Hoặc sử dụng một trong các quá tải ToString để xuất nó theo bất kỳ cách nào bạn muốn.


16

Tôi đã làm một số điểm chuẩn để xem cách nhanh nhất và đây là kết quả và kết luận của tôi. Tôi đã chạy mỗi phương thức 10 triệu lần và thêm một nhận xét với thời gian trung bình cho mỗi lần chạy.

Nếu mili giây đầu vào của bạn không bị giới hạn trong một ngày (kết quả của bạn có thể là 143: 59: 59.999), đây là các tùy chọn, từ nhanh hơn đến chậm hơn:

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

Nếu mili giây đầu vào của bạn bị giới hạn trong một ngày (kết quả của bạn sẽ không bao giờ lớn hơn 23: 59: 59.999), đây là các tùy chọn, từ nhanh hơn đến chậm hơn:

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

Trong trường hợp đầu vào của bạn chỉ là vài giây , các phương thức nhanh hơn một chút. Một lần nữa, nếu giây đầu vào của bạn không bị giới hạn trong một ngày (kết quả của bạn có thể là 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);
}

Và nếu số giây đầu vào của bạn bị giới hạn trong một ngày (kết quả của bạn sẽ không bao giờ lớn hơn 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);
}

Như một bình luận cuối cùng, hãy để tôi thêm rằng tôi nhận thấy rằng string.Formatnó nhanh hơn một chút nếu bạn sử dụng D2thay vì 00.



8

Hàm tạo TimeSpan cho phép bạn vượt qua trong vài giây. Chỉ cần khai báo một biến loại TimeSpan số giây. Ví dụ:

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

4

Tôi khuyên bạn nên sử dụng TimeSpanlớp học này.

public static void Main(string[] args)
{
    TimeSpan t = TimeSpan.FromSeconds(80);
    Console.WriteLine(t.ToString());

    t = TimeSpan.FromSeconds(868693412);
    Console.WriteLine(t.ToString());
}

Đầu ra:

00:01:20
10054.07:43:32

4

Trong VB.NET, nhưng nó giống nhau trong C #:

Dim x As New TimeSpan(0, 0, 80)
debug.print(x.ToString())
' Will print 00:01:20

2

Đối với .NET <4.0 (ví dụ: Unity ), bạn có thể viết phương thức mở rộng để có TimeSpan.ToString(string format)hành vi như .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);
    }
}

Và từ bất cứ nơi nào trong mã của bạn, bạn có thể sử dụng nó như:

var time = TimeSpan.FromSeconds(timeElapsed);

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

Bằng cách này, bạn có thể định dạng bất kỳ TimeSpanđối tượng nào bằng cách gọi ToString từ bất kỳ nơi nào trong mã của bạn.


1

Tại sao mọi người cần TimeSpan DateTime nếu chúng ta có DateTime.AddSeconds ()?

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

Ngày là tùy ý. TotalSeconds có thể lớn hơn 59 và nó là gấp đôi. Sau đó, bạn có thể định dạng thời gian của mình theo ý muốn bằng DateTime.ToString ():

dt.ToString("H:mm:ss");

Điều này không hoạt động nếu TotalSeconds <0 hoặc> 59:

new DateTime(2015, 1, 1, 0, 0, totalSeconds)

0
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");
}

//Kiểm tra

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

3
1. OP yêu cầu chuyển đổi từ giây, không phải mili giây. 2. Câu trả lời của bạn tốt hơn câu trả lời hiện được chấp nhận như thế nào?
vesan

0

để có được tổng số giây

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

và để có được datetime từ giây

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

0

Điều này sẽ trở lại ở định dạng hh: mm: ss

 public static string ConvertTime(long secs)
    {
        TimeSpan ts = TimeSpan.FromSeconds(secs);
        string displayTime = $"{ts.Hours}:{ts.Minutes}:{ts.Seconds}";
        return displayTime;
    }

Bạn không phải đã thử nghiệm điều này. ConvertTime(80)trả lại 0:1:20ConvertTime(61)trả lại 0:1:1, cả hai đều được h:m:s. Sử dụng phép nội suy chuỗi cũng dẫn đến mã dài hơn ToString(), như được sử dụng trong các câu trả lời khác, và cũng khiến cho việc hình dung độ dài chuỗi được định dạng khó hơn.
BACON
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.