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á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:
Đố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ệ.
Đố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
HH
không hợp lệ ở đó.
.NET/C#
.ToString(@"hh\:mm\:ss\:fff");
đã có 24hr
định dạng. HH
không hợp lệ ở đó với đầu vào như vậy ( lỗi làInput string was not in a correct format.
)
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.
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.Format
nó nhanh hơn một chút nếu bạn sử dụng D2
thay vì 00
.
TimeSpan.FromSeconds(80);
http://msdn.microsoft.com/en-us/l Library / system.timespan.fromseconds.aspx
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();
Tôi khuyên bạn nên sử dụng TimeSpan
lớ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
Đố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.
Tại sao mọi người cần TimeSpan VÀ 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)
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);
}
để 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)
Đ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;
}
ConvertTime(80)
trả lại 0:1:20
và ConvertTime(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.
using System;
Các lớp cư trú trongSystem.TimeSpan
.