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ı?
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:
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 .
İç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
HHorada geçersiz.
.NET/C#
.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. )
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.
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
TimeSpan.FromSeconds(80);
http://msdn.microsoft.com/en-us/library/system.timespan.fromseconds.aspx
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();
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
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 .
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)
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);
}
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)
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;
}
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()
using System;Sınıf bulunurSystem.TimeSpan.