c# - Каков наилучший способ конвертировать секунды в (час: минуты: секунды: миллисекунды)?


Каков наилучший способ конвертировать секунды в (час: минуты: секунды: миллисекунды)?

Предположим, у меня есть 80 секунд, есть ли какие-либо специализированные классы / методы в .NET, которые позволят мне преобразовать эти 80 секунд в формат (00h: 00m: 00s: 00ms), например, DateTime или что-то еще?



Answers


Для .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);

(Как отмечает 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");

(От Nick Molyneux) Убедитесь, что секунды меньше TimeSpan.MaxValue.TotalSeconds чтобы избежать исключения.




Для .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");

или если вы хотите формат даты, тогда вы также можете это сделать

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

Для получения дополнительной информации вы можете проверить строки пользовательского TimeSpan Format




Если вы знаете, что у вас есть несколько секунд, вы можете создать значение TimeSpan, вызвав TimeSpan.FromSeconds:

 TimeSpan ts = TimeSpan.FromSeconds(80);

Затем вы можете получить количество дней, часов, минут или секунд. Или используйте одну из перегрузок ToString для вывода ее любым способом.







Конструктор TimeSpan позволяет вам пройти через несколько секунд. Просто объявите переменную типа TimeSpan количество секунд. Пример:

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



Я бы предложил вам использовать для этого класс TimeSpan .

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

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

Выходы:

00:01:20
10054.07:43:32



В VB.NET, но это то же самое в C #:

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



Я сделал несколько тестов, чтобы узнать, что является самым быстрым способом, и это мои результаты и выводы. Я запускал каждый метод 10M раз и добавлял комментарий со средним временем выполнения.

Если ваши миллисекунды ввода не ограничены одним днем (ваш результат может быть 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);
}

Если ваши миллисекунды ввода ограничены одним днем (ваш результат никогда не будет больше 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);
}

Если ваш ввод всего несколько секунд , методы немного быстрее. Опять же, если ваши входные секунды не ограничены одним днем (ваш результат может быть 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);
}

И если ваши входные секунды ограничены одним днем (ваш результат никогда не будет больше 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);
}

В качестве заключительного комментария, позвольте мне добавить, что я заметил, что string.Format немного быстрее, если вы используете D2 вместо 00 .




Зачем людям TimeSpan и DateTime, если у нас есть DateTime.AddSeconds ()?

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

Дата произвольная. totalSeconds может быть больше 59, и это двойной. Затем вы можете отформатировать свое время, когда хотите использовать DateTime.ToString ():

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

Это не работает, если totalSeconds <0 или> 59:

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



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

//Контрольная работа

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



Для .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);
    }
}

И из любого места вашего кода вы можете использовать его как:

var time = TimeSpan.FromSeconds(timeElapsed);

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

Таким образом вы можете отформатировать любой объект TimeSpan , просто вызывая ToString из любого места вашего кода.