Saniyeleri (Saat: Dakika: Saniye: Milisaniye) süresine dönüştürmenin en iyi yolu nedir?


290

Saniyeleri (Saat: Dakika: Saniye: Milisaniye) süresine dönüştürmenin en iyi yolu nedir?

Diyelim ki 80 saniyem var, .NET'te bu 80 saniyeyi DateTime gibi bir şeye (00h: 00m: 00s: 00ms) dönüştürmeme izin verecek özel sınıflar / teknikler var mı?

Yanıtlar:


566

For .Net <= 4.0 Kullanım ZamanGeçişi sınıfı.

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 tarafından belirtildiği gibi) .NET> 4.0 için şunları kullanabilirsiniz:

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'dan) İstisnadan TimeSpan.MaxValue.TotalSecondskaçınmak için saniyelerin daha az olduğundan emin olun .


using System;Sınıf bulunur System.TimeSpan.
fbmd

61

İçin .NET> 4,0 kullanabilirsiniz

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

veya tarih saat biçimini istiyorsanız bunu da yapabilirsiniz

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

Daha fazla bilgi için Özel TimeSpan Biçim Dizelerini kontrol edebilirsiniz


2
DateTime'a saniye eklemek için TimeSpan'a ihtiyacınız yoktur. DateTime.AddSeconds () öğesini kullanmanız yeterlidir.
Evgeni Nabokov

@MehdiDehghani için 24 saat biçiminde 'hh' yerine 'HH' kullanmalısınız
Inder Kumar Rathore

@InderKumarRathore İlk çözümünüz hakkında konuşuyordum, HHorada geçersiz.
Mehdi Dehghani

@MehdiDehghani, neyin yanlış gittiğini memnun edebilir misiniz çünkü kodlamadığım 3 yıl oldu.NET/C#
Inder Kumar Rathore

1
@InderKumarRathore .ToString(@"hh\:mm\:ss\:fff");zaten 24hrbiçimdedir. HHorada böyle bir girdi ile geçerli değil ( hataInput string was not in a correct format. )
Mehdi Dehghani

23

Birkaç saniyeniz olduğunu biliyorsanız, TimeSpan'ı arayarak bir TimeSpan değeri oluşturabilirsiniz.

 TimeSpan ts = TimeSpan.FromSeconds(80);

Daha sonra gün, saat, dakika veya saniye sayısını elde edebilirsiniz. Veya ToString aşırı yüklerinden birini kullanarak istediğiniz şekilde çıktı alın.


16

En hızlı yolun ne olduğunu görmek için bazı kriterler yaptım ve bunlar benim sonuçlarım ve sonuçlarım. Her yöntemi 10 milyon kez çalıştırdım ve çalışma başına ortalama süreyi içeren bir yorum ekledim.

Giriş milisaniyeniz bir günle sınırlı değilse (sonucunuz 143: 59: 59.999 olabilir), daha hızlıdan daha yavaş olan seçenekler şunlardır:

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

Giriş milisaniyeniz bir günle sınırlıysa (sonucunuz asla 23: 59: 59.999'dan büyük olmayacaktır), bunlar daha hızlıdan daha yavaşa seçenekler:

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

Girişinizin sadece saniyeler olması durumunda , yöntemler biraz daha hızlıdır. Yine, giriş saniyeleriniz bir günle sınırlı değilse (sonucunuz 143: 59: 59 olabilir):

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

Ve giriş saniyeleriniz bir günle sınırlıysa (sonucunuz asla 23:59:59'dan büyük olmayacaktır):

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

Son bir yorum olarak, bunun yerine string.Formatbiraz daha hızlı olduğunu fark ettim .D200



8

TimeSpan yapıcısı saniyeler içinde geçmenizi sağlar. Saniye cinsinden TimeSpan türünde bir değişken bildirmeniz yeterlidir. Ör:

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

4

Bunun için TimeSpansınıfı kullanmanızı öneririm .

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

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

Çıktılar:

00:01:20
10054.07:43:32

4

VB.NET'te, ancak C # ile aynı:

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

2

For .NET <4,0 : (ex Birlik ) sahip bir uzantı yöntemini yazabilirsiniz TimeSpan.ToString(string format)gibi davranış 4,0 .NET>

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

Ve kodunuzun herhangi bir yerinden aşağıdaki gibi kullanabilirsiniz:

var time = TimeSpan.FromSeconds(timeElapsed);

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

Bu şekilde TimeSpan, kodunuzun herhangi bir yerinden ToString'i çağırarak herhangi bir nesneyi biçimlendirebilirsiniz .


1

DateTime.AddSeconds () varsa, neden insanlar TimeSpan VE DateTime'a ihtiyaç duyar ?

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

Tarih keyfi. totalSeconds 59'dan büyük olabilir ve bu bir çifttir. Ardından DateTime.ToString () öğesini kullanarak saatinizi istediğiniz gibi biçimlendirebilirsiniz:

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

TotalSeconds <0 veya> 59 ise bu çalışmaz:

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

//Ölçek

    [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 milisaniye değil saniye cinsinden dönüşüm istedi. 2. Cevabınız şu anda kabul edilen cevaptan nasıl çıkıyor?
vesan

0

toplam saniye elde etmek

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

ve saniyeler içinde datetime almak için

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

0

Bu ss: dd: ss biçiminde dönecektir

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

Bunu test etmemelisiniz. her ikisi de olan ConvertTime(80)döndürür 0:1:20ve ConvertTime(61)döndürür . Dize enterpolasyonunun kullanılması, diğer yanıtlarda kullanılandan daha uzun kodla sonuçlanır ve ayrıca biçimlendirilmiş dize uzunluğunu görselleştirmeyi zorlaştırır. 0:1:1h:m:sToString()
BACON
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.