जवाबों:
कृपया ध्यान दें: यह उत्तर .Net 4.0 और इसके बाद के संस्करण के लिए है। यदि आप .net 3.5 या उससे नीचे के TimeSpan को फॉर्मेट करना चाहते हैं, तो कृपया जोहान्सह का उत्तर देखें ।
कस्टम टाइमस्पैन प्रारूप स्ट्रिंग .net 4.0 में पेश किए गए थे। आप MSDN कस्टम टाइमस्पैन प्रारूप स्ट्रिंग्स पृष्ठ पर उपलब्ध प्रारूप निर्दिष्टकर्ताओं का पूर्ण संदर्भ पा सकते हैं ।
यहाँ एक उदाहरण स्वरूप प्रारूप है:
string.Format("{0:hh\\:mm\\:ss}", myTimeSpan); //example output 15:36:15
( अद्यतन ) और यहाँ C # 6 स्ट्रिंग प्रक्षेप का उपयोग कर एक उदाहरण दिया गया है:
$"{myTimeSpan:hh\\:mm\\:ss}"; //example output 15:36:15
आपको "\" के साथ ":" वर्ण से बचने की आवश्यकता है (जो कि तब तक बचना चाहिए जब तक आप क्रियात्मक स्ट्रिंग का उपयोग नहीं कर रहे हैं)।
MSDN कस्टम टाइमस्पैन प्रारूप स्ट्रिंग्स पृष्ठ से यह अंश ":" और "" से बचने के बारे में बताता है। एक प्रारूप स्ट्रिंग में वर्ण:
कस्टम टाइमस्पैन प्रारूप विनिर्देशक में प्लेसहोल्डर विभाजक प्रतीक शामिल नहीं होते हैं, जैसे कि प्रतीक जो घंटों से दिन, मिनटों से घंटों या भिन्नात्मक सेकंड से अलग होते हैं। इसके बजाय, इन प्रतीकों को स्ट्रिंग प्रारूप के रूप में कस्टम प्रारूप स्ट्रिंग में शामिल किया जाना चाहिए। उदाहरण के लिए, "dd.hh: mm" एक अवधि (।) को दिन और घंटों के बीच विभाजक के रूप में परिभाषित करता है, और एक बृहदान्त्र (:) घंटे और मिनट के बीच विभाजक के रूप में।
myTimeSpan = new TimeSpan(15, 35, 54);
स्टेटमेंट के इनपुट के साथ myTimeSpan .ToString("hh\\mm\\ss");
परिणाम आएगा 15m35s54
। मुझे नहीं लगता है कि आपके इरादे क्या हैं क्योंकि यह आपके घंटों के बाद मी और आपके मिनटों के बाद एस होगा।
$"{myTimeSpan.TotalHours}:{myTimeSpan:mm\\:ss}"
। उपयोगकर्ता के दृष्टिकोण से, यह दिनों को आउटपुट करने के लिए बेहतर हो सकता है, हालांकि, कोई भी मानसिक रूप से यह जानना नहीं चाहता है कि 200+ घंटे में कितने दिन हैं।
.NET 3.5 और उससे कम के लिए आप उपयोग कर सकते हैं:
string.Format ("{0:00}:{1:00}:{2:00}",
(int)myTimeSpan.TotalHours,
myTimeSpan.Minutes,
myTimeSpan.Seconds);
बाइट्स पर एक जॉन स्कीट उत्तर से लिया गया कोड
.NET 4.0 और इसके बाद के संस्करण के लिए, DoctaJonez उत्तर देखें ।
एक तरीका यह है कि किसी DateTime
वस्तु को बनाया जाए और उसे प्रारूपण के लिए उपयोग किया जाए:
new DateTime(myTimeSpan.Ticks).ToString(myCustomFormat)
// or using String.Format:
String.Format("{0:HHmmss}", new DateTime(myTimeSpan.Ticks))
यह मेरे जानने का तरीका है। मुझे उम्मीद है कि कोई बेहतर रास्ता सुझा सकता है।
सरल। MSDNTimeSpan.ToString
पर c, g या G. अधिक जानकारी के साथ उपयोग करें
मैं साथ जाता
myTimeSpan.ToString("hh\\:mm\\:ss");
Dim duration As New TimeSpan(1, 12, 23, 62)
DEBUG.WriteLine("Time of Travel: " + duration.ToString("dd\.hh\:mm\:ss"))
यह फ्रेमवर्क 4 के लिए काम करता है
व्यक्तिगत रूप से, मुझे यह तरीका पसंद है:
TimeSpan ts = ...;
string.Format("{0:%d}d {0:%h}h {0:%m}m {0:%s}s", ts);
आप इसे बिना किसी समस्या के जैसे चाहें कस्टम बना सकते हैं:
string.Format("{0:%d}days {0:%h}hours {0:%m}min {0:%s}sec", ts);
string.Format("{0:%d}d {0:%h}h {0:%m}' {0:%s}''", ts);
आप इसके साथ भी जा सकते हैं:
Dim ts As New TimeSpan(35, 21, 59, 59) '(11, 22, 30, 30) '
Dim TimeStr1 As String = String.Format("{0:c}", ts)
Dim TimeStr2 As String = New Date(ts.Ticks).ToString("dd.HH:mm:ss")
संपादित करें:
आप स्ट्रिंग्स पर भी देख सकते हैं ।
Dim ts As New TimeSpan(23, 30, 59)
Dim str As String = Strings.Format(New DateTime(ts.Ticks), "H:mm:ss")
if (timeSpan.TotalDays < 1)
return timeSpan.ToString(@"hh\:mm\:ss");
return timeSpan.TotalDays < 2
? timeSpan.ToString(@"d\ \d\a\y\ hh\:mm\:ss")
: timeSpan.ToString(@"d\ \d\a\y\s\ hh\:mm\:ss");
सभी शाब्दिक पात्रों को बच जाना चाहिए।
मैंने नीचे दिए गए कोड का उपयोग किया। यह लंबा है, लेकिन फिर भी यह एक अभिव्यक्ति है, और बहुत ही अनुकूल आउटपुट का उत्पादन करता है, क्योंकि यह दिन, घंटे, मिनट या सेकंड का आउटपुट नहीं देता है यदि उनके पास शून्य का मूल्य है।
नमूने में यह आउटपुट उत्पन्न करता है: "4 दिन 1 घंटा 3 सेकंड"।
TimeSpan sp = new TimeSpan(4,1,0,3);
string.Format("{0}{1}{2}{3}",
sp.Days > 0 ? ( sp.Days > 1 ? sp.ToString(@"d\ \d\a\y\s\ "): sp.ToString(@"d\ \d\a\y\ ")):string.Empty,
sp.Hours > 0 ? (sp.Hours > 1 ? sp.ToString(@"h\ \h\o\u\r\s\ ") : sp.ToString(@"h\ \h\o\u\r\ ")):string.Empty,
sp.Minutes > 0 ? (sp.Minutes > 1 ? sp.ToString(@"m\ \m\i\n\u\t\e\s\ ") :sp.ToString(@"m\ \m\i\n\u\t\e\ ")):string.Empty,
sp.Seconds > 0 ? (sp.Seconds > 1 ? sp.ToString(@"s\ \s\e\c\o\n\d\s"): sp.ToString(@"s\ \s\e\c\o\n\d\s")):string.Empty);
String timeComponent(int value, String name) { return value > 0 ? value + " " + name + (value > 1 ? "s" : ""); }
प्रत्येक घटक (जैसे timeComponent(sp.Days, "day")
) के लिए कॉल करें , फिर String.join
रिक्त स्थान सम्मिलित करने के लिए उपयोग करें।
मैं इस विधि का उपयोग करता हूं। मैं बेल्जियन हूं और डच बोलता हूं तो घंटों और मिनटों का बहुवचन सिर्फ अंत तक 'एस' नहीं जोड़ रहा है, बल्कि विलक्षण से लगभग एक अलग शब्द है।
यह लंबा लग सकता है लेकिन मुझे लगता है कि यह बहुत पठनीय है:
public static string SpanToReadableTime(TimeSpan span)
{
string[] values = new string[4]; //4 slots: days, hours, minutes, seconds
StringBuilder readableTime = new StringBuilder();
if (span.Days > 0)
{
if (span.Days == 1)
values[0] = span.Days.ToString() + " dag"; //day
else
values[0] = span.Days.ToString() + " dagen"; //days
readableTime.Append(values[0]);
readableTime.Append(", ");
}
else
values[0] = String.Empty;
if (span.Hours > 0)
{
if (span.Hours == 1)
values[1] = span.Hours.ToString() + " uur"; //hour
else
values[1] = span.Hours.ToString() + " uren"; //hours
readableTime.Append(values[1]);
readableTime.Append(", ");
}
else
values[1] = string.Empty;
if (span.Minutes > 0)
{
if (span.Minutes == 1)
values[2] = span.Minutes.ToString() + " minuut"; //minute
else
values[2] = span.Minutes.ToString() + " minuten"; //minutes
readableTime.Append(values[2]);
readableTime.Append(", ");
}
else
values[2] = string.Empty;
if (span.Seconds > 0)
{
if (span.Seconds == 1)
values[3] = span.Seconds.ToString() + " seconde"; //second
else
values[3] = span.Seconds.ToString() + " seconden"; //seconds
readableTime.Append(values[3]);
}
else
values[3] = string.Empty;
return readableTime.ToString();
}//end SpanToReadableTime
यह वह दृष्टिकोण है जिसका मैंने सशर्त स्वरूपण के साथ अपने स्वयं का उपयोग किया है। और मैं इसे यहां पोस्ट करता हूं क्योंकि मुझे लगता है कि यह साफ तरीका है।
$"{time.Days:#0:;;\\}{time.Hours:#0:;;\\}{time.Minutes:00:}{time.Seconds:00}"
आउटपुट का उदाहरण:
00:00
(न्यूनतम)
1:43:04
(जब हमारे पास घंटे हों)
15:03:01
(जब घंटे 1 अंक से अधिक हों)
2:4:22:04
(जब हमारे पास दिन हों)
स्वरूपण आसान है। time.Days:#0:;;\\
इससे पहले ;;
का फॉर्मेट तब होता है जब मूल्य सकारात्मक होता है। नकारात्मक मूल्यों की अनदेखी की जाती है। और शून्य मानों के लिए हमें ;;\\
इसे स्वरूपित स्ट्रिंग में छिपाने के लिए है। ध्यान दें कि बच गया बैकस्लैश आवश्यक है अन्यथा यह सही ढंग से प्रारूपित नहीं होगा।
यहाँ मेरा विस्तार तरीका है :
public static string ToFormattedString(this TimeSpan ts)
{
const string separator = ", ";
if (ts.TotalMilliseconds < 1) { return "No time"; }
return string.Join(separator, new string[]
{
ts.Days > 0 ? ts.Days + (ts.Days > 1 ? " days" : " day") : null,
ts.Hours > 0 ? ts.Hours + (ts.Hours > 1 ? " hours" : " hour") : null,
ts.Minutes > 0 ? ts.Minutes + (ts.Minutes > 1 ? " minutes" : " minute") : null,
ts.Seconds > 0 ? ts.Seconds + (ts.Seconds > 1 ? " seconds" : " second") : null,
ts.Milliseconds > 0 ? ts.Milliseconds + (ts.Milliseconds > 1 ? " milliseconds" : " millisecond") : null,
}.Where(t => t != null));
}
उदाहरण कॉल:
string time = new TimeSpan(3, 14, 15, 0, 65).ToFormattedString();
आउटपुट:
3 days, 14 hours, 15 minutes, 65 milliseconds
यह वीएस 2010 में दर्द है, यहां मेरा समाधान समाधान है।
public string DurationString
{
get
{
if (this.Duration.TotalHours < 24)
return new DateTime(this.Duration.Ticks).ToString("HH:mm");
else //If duration is more than 24 hours
{
double totalminutes = this.Duration.TotalMinutes;
double hours = totalminutes / 60;
double minutes = this.Duration.TotalMinutes - (Math.Floor(hours) * 60);
string result = string.Format("{0}:{1}", Math.Floor(hours).ToString("00"), Math.Floor(minutes).ToString("00"));
return result;
}
}
}
यहाँ मेरा संस्करण है। यह केवल उतना ही दिखाता है जितना आवश्यक हो, बहुवचन, नकारात्मकता को संभालता है, और मैंने इसे हल्का बनाने की कोशिश की।
0 seconds
1.404 seconds
1 hour, 14.4 seconds
14 hours, 57 minutes, 22.473 seconds
1 day, 14 hours, 57 minutes, 22.475 seconds
public static class TimeSpanExtensions
{
public static string ToReadableString(this TimeSpan timeSpan)
{
int days = (int)(timeSpan.Ticks / TimeSpan.TicksPerDay);
long subDayTicks = timeSpan.Ticks % TimeSpan.TicksPerDay;
bool isNegative = false;
if (timeSpan.Ticks < 0L)
{
isNegative = true;
days = -days;
subDayTicks = -subDayTicks;
}
int hours = (int)((subDayTicks / TimeSpan.TicksPerHour) % 24L);
int minutes = (int)((subDayTicks / TimeSpan.TicksPerMinute) % 60L);
int seconds = (int)((subDayTicks / TimeSpan.TicksPerSecond) % 60L);
int subSecondTicks = (int)(subDayTicks % TimeSpan.TicksPerSecond);
double fractionalSeconds = (double)subSecondTicks / TimeSpan.TicksPerSecond;
var parts = new List<string>(4);
if (days > 0)
parts.Add(string.Format("{0} day{1}", days, days == 1 ? null : "s"));
if (hours > 0)
parts.Add(string.Format("{0} hour{1}", hours, hours == 1 ? null : "s"));
if (minutes > 0)
parts.Add(string.Format("{0} minute{1}", minutes, minutes == 1 ? null : "s"));
if (fractionalSeconds.Equals(0D))
{
switch (seconds)
{
case 0:
// Only write "0 seconds" if we haven't written anything at all.
if (parts.Count == 0)
parts.Add("0 seconds");
break;
case 1:
parts.Add("1 second");
break;
default:
parts.Add(seconds + " seconds");
break;
}
}
else
{
parts.Add(string.Format("{0}{1:.###} seconds", seconds, fractionalSeconds));
}
string resultString = string.Join(", ", parts);
return isNegative ? "(negative) " + resultString : resultString;
}
}
यदि आप सेकंड की संख्या को देखते हुए, यूट्यूब के समान अवधि प्रारूप चाहते हैं
int[] duration = { 0, 4, 40, 59, 60, 61, 400, 4000, 40000, 400000 };
foreach (int d in duration)
{
Console.WriteLine("{0, 6} -> {1, 10}", d, d > 59 ? TimeSpan.FromSeconds(d).ToString().TrimStart("00:".ToCharArray()) : string.Format("0:{0:00}", d));
}
आउटपुट:
0 -> 0:00
4 -> 0:04
40 -> 0:40
59 -> 0:59
60 -> 1:00
61 -> 1:01
400 -> 6:40
4000 -> 1:06:40
40000 -> 11:06:40
400000 -> 4.15:06:40
मैं "1 दिन 2 घंटे 3 मिनट" जैसे एक स्ट्रिंग लौटना चाहता था और साथ ही यह भी ध्यान रखता था कि उदाहरण के लिए दिन या मिनट्स 0 हैं और फिर उन्हें नहीं दिखाया जा रहा है। अपने जवाब के लिए जॉन राश का धन्यवाद जो मेरा मुश्किल से एक विस्तार है
TimeSpan timeLeft = New Timespan(0, 70, 0);
String.Format("{0}{1}{2}{3}{4}{5}",
Math.Floor(timeLeft.TotalDays) == 0 ? "" :
Math.Floor(timeLeft.TotalDays).ToString() + " ",
Math.Floor(timeLeft.TotalDays) == 0 ? "" : Math.Floor(timeLeft.TotalDays) == 1 ? "day " : "days ",
timeLeft.Hours == 0 ? "" : timeLeft.Hours.ToString() + " ",
timeLeft.Hours == 0 ? "" : timeLeft.Hours == 1 ? "hour " : "hours ",
timeLeft.Minutes == 0 ? "" : timeLeft.Minutes.ToString() + " ",
timeLeft.Minutes == 0 ? "" : timeLeft.Minutes == 1 ? "minute " : "minutes ");