How do I convert a TimeSpan to a formatted string?
本问题已经有最佳答案,请猛点这里访问。
我有两个日期时间变量,begintime和endtime。我通过以下操作得到了它们的区别:
1 | TimeSpan dateDifference = endTime.Subtract(beginTime); |
我现在如何使用c_返回hh-hrs、mm-mins、ss-secs格式的字符串?
如果差是00:06:32.4458750
它应该返回这个00小时06分32秒
我只是固定的时间扩展的一些方法。想我可以分享:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public static string ToReadableAgeString(this TimeSpan span) { return string.Format("{0:0}", span.Days / 365.25); } public static string ToReadableString(this TimeSpan span) { string formatted = string.Format("{0}{1}{2}{3}", span.Duration().Days > 0 ? string.Format("{0:0} day{1},", span.Days, span.Days == 1 ? String.Empty :"s") : string.Empty, span.Duration().Hours > 0 ? string.Format("{0:0} hour{1},", span.Hours, span.Hours == 1 ? String.Empty :"s") : string.Empty, span.Duration().Minutes > 0 ? string.Format("{0:0} minute{1},", span.Minutes, span.Minutes == 1 ? String.Empty :"s") : string.Empty, span.Duration().Seconds > 0 ? string.Format("{0:0} second{1}", span.Seconds, span.Seconds == 1 ? String.Empty :"s") : string.Empty); if (formatted.EndsWith(",")) formatted = formatted.Substring(0, formatted.Length - 2); if (string.IsNullOrEmpty(formatted)) formatted ="0 seconds"; return formatted; } |
它被转换到的日期时间格式的定,你可以得到:
1 |
这是最短的解决方案。
1 | timeSpan.ToString(@"hh\:mm"); |
(3)将timespan.tostring的你吗?如果不是,它看起来像这样的代码示例,介绍如何在页面的自定义格式的
使用string.format(多参数)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | using System; namespace TimeSpanFormat { class Program { static void Main(string[] args) { TimeSpan dateDifference = new TimeSpan(0, 0, 6, 32, 445); string formattedTimeSpan = string.Format("{0:D2} hrs, {1:D2} mins, {2:D2} secs", dateDifference.Hours, dateDifference.Minutes, dateDifference.Seconds); Console.WriteLine(formattedTimeSpan); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | public static class TimeSpanFormattingExtensions { public static string ToReadableString(this TimeSpan span) { return string.Join(",", span.GetReadableStringElements() .Where(str => !string.IsNullOrWhiteSpace(str))); } private static IEnumerable<string> GetReadableStringElements(this TimeSpan span) { yield return GetDaysString((int)Math.Floor(span.TotalDays)); yield return GetHoursString(span.Hours); yield return GetMinutesString(span.Minutes); yield return GetSecondsString(span.Seconds); } private static string GetDaysString(int days) { if (days == 0) return string.Empty; if (days == 1) return"1 day"; return string.Format("{0:0} days", days); } private static string GetHoursString(int hours) { if (hours == 0) return string.Empty; if (hours == 1) return"1 hour"; return string.Format("{0:0} hours", hours); } private static string GetMinutesString(int minutes) { if (minutes == 0) return string.Empty; if (minutes == 1) return"1 minute"; return string.Format("{0:0} minutes", minutes); } private static string GetSecondsString(int seconds) { if (seconds == 0) return string.Empty; if (seconds == 1) return"1 second"; return string.Format("{0:0} seconds", seconds); } } |
在easiest路
1 | string formatted = (DateTime.Today + dateDifference).ToString("HH 'hrs' mm 'mins' ss 'secs'"); |
本厂是一长的时间差不超过24小时。
在
根据微软的文档,在时间结构exposes小时,分钟,秒和milliseconds的成员。也许你想让这样的事情:
1 | dateDifference.Hours.ToString() +" hrs," + dateDifference.Minutes.ToString() +" mins," + dateDifference.Seconds.ToString() +" secs" |
你可以使用下面的代码。
1 2 3 4 5 6 7 8 9 10 11 | public static class TimeSpanExtensions { public static String Verbose(this TimeSpan timeSpan) { var hours = timeSpan.Hours; var minutes = timeSpan.Minutes; if (hours > 0) return String.Format("{0} hours {1} minutes", hours, minutes); return String.Format("{0} minutes", minutes); } } |
感谢彼得的扩展方法。我的工作是与改进的时间跨度更长的时间更好。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | namespace ExtensionMethods { public static class TimeSpanExtensionMethods { public static string ToReadableString(this TimeSpan span) { string formatted = string.Format("{0}{1}{2}", (span.Days / 7) > 0 ? string.Format("{0:0} weeks,", span.Days / 7) : string.Empty, span.Days % 7 > 0 ? string.Format("{0:0} days,", span.Days % 7) : string.Empty, span.Hours > 0 ? string.Format("{0:0} hours,", span.Hours) : string.Empty); if (formatted.EndsWith(",")) formatted = formatted.Substring(0, formatted.Length - 2); return formatted; } } } |
我知道这是一个大问题,但是现在网上有4。支持自定义格式的时间。
我知道,但它引起了上述的被转换的DateTime蜱对我作品的推出,但不恰当的T手柄跨度超过24小时。
1 |
这是不是你会得到1点25点,你可能期望。
我也有类似的问题和我自己扩展的凸轮跟踪位但它似乎是不同的比其他的事情。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public static string TimeSpanToString(this TimeSpan timeSpan) { //if it's negative if (timeSpan.Ticks < 0) { timeSpan = timeSpan - timeSpan - timeSpan; if (timeSpan.Days != 0) return string.Format("-{0}:{1}", timeSpan.Days.ToString("d"), new DateTime(timeSpan.Ticks).ToString("HH:mm:ss")); else return new DateTime(timeSpan.Ticks).ToString("-HH:mm:ss"); } //if it has days else if (timeSpan.Days != 0) return string.Format("{0}:{1}", timeSpan.Days.ToString("d"), new DateTime(timeSpan.Ticks).ToString("HH:mm:ss")); //otherwise return the time else return new DateTime(timeSpan.Ticks).ToString("HH:mm:ss"); } |
我知道这是一晚,但我的答案是:这个作品
1 |
现在datedifference应该排除在较小的比第二部分。在.NET 2.0的作品了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 | ''' <summary> ''' Return specified Double # (NumDbl) as String using specified Number Format String (FormatStr, ''' Default ="N0") and Format Provider (FmtProvider, Default = Nothing) followed by space and, ''' if NumDbl = 1, the specified Singular Unit Name (SglUnitStr), else the Plural Unit Name ''' (PluralUnitStr). ''' </summary> ''' <param name="NumDbl"></param> ''' <param name="SglUnitStr"></param> ''' <param name="PluralUnitStr"></param> ''' <param name="FormatStr"></param> ''' <param name="FmtProvider"></param> ''' <returns></returns> ''' <remarks></remarks> Public Function PluralizeUnitsStr( _ ByVal NumDbl As Double, _ ByVal SglUnitStr As String, _ ByVal PluralUnitStr As String, _ Optional ByVal FormatStr As String ="N0", _ Optional ByVal FmtProvider As System.IFormatProvider = Nothing _ ) As String PluralizeUnitsStr = NumDbl.ToString(FormatStr, FmtProvider) &"" Dim RsltUnitStr As String If NumDbl = 1 Then RsltUnitStr = SglUnitStr Else RsltUnitStr = PluralUnitStr End If PluralizeUnitsStr &= RsltUnitStr End Function ''' <summary> ''' Info about a # Unit. ''' </summary> ''' <remarks></remarks> Public Class clsNumUnitInfoItem ''' <summary> ''' Name of a Singular Unit (i.e."day","trillion","foot") ''' </summary> ''' <remarks></remarks> Public UnitSglStr As String ''' <summary> ''' Name of a Plural Unit (i.e."days","trillion","feet") ''' </summary> ''' <remarks></remarks> Public UnitPluralStr As String ''' <summary> ''' # of Units to = 1 of Next Higher (aka Parent) Unit (i.e. 24"hours", 1000"million", ''' 5280"feet") ''' </summary> ''' <remarks></remarks> Public UnitsInParentInt As Integer End Class ' -- clsNumUnitInfoItem Dim TimeLongEnUnitInfoItms As clsNumUnitInfoItem() = { _ New clsNumUnitInfoItem With {.UnitSglStr ="day", .UnitPluralStr ="days", .UnitsInParentInt = 1}, _ New clsNumUnitInfoItem With {.UnitSglStr ="hour", .UnitPluralStr ="hours", .UnitsInParentInt = 24}, _ New clsNumUnitInfoItem With {.UnitSglStr ="minute", .UnitPluralStr ="minutes", .UnitsInParentInt = 60}, _ New clsNumUnitInfoItem With {.UnitSglStr ="second", .UnitPluralStr ="seconds", .UnitsInParentInt = 60}, _ New clsNumUnitInfoItem With {.UnitSglStr ="millisecond", .UnitPluralStr ="milliseconds", .UnitsInParentInt = 1000} _ } ' -- Dim TimeLongEnUnitInfoItms Dim TimeShortEnUnitInfoItms As clsNumUnitInfoItem() = { _ New clsNumUnitInfoItem With {.UnitSglStr ="day", .UnitPluralStr ="days", .UnitsInParentInt = 1}, _ New clsNumUnitInfoItem With {.UnitSglStr ="hr", .UnitPluralStr ="hrs", .UnitsInParentInt = 24}, _ New clsNumUnitInfoItem With {.UnitSglStr ="min", .UnitPluralStr ="mins", .UnitsInParentInt = 60}, _ New clsNumUnitInfoItem With {.UnitSglStr ="sec", .UnitPluralStr ="secs", .UnitsInParentInt = 60}, _ New clsNumUnitInfoItem With {.UnitSglStr ="msec", .UnitPluralStr ="msecs", .UnitsInParentInt = 1000} _ } ' -- Dim TimeShortEnUnitInfoItms ''' <summary> ''' Convert a specified Double Number (NumDbl) to a long (aka verbose) format (i.e."1 day, ''' 2 hours, 3 minutes, 4 seconds and 567 milliseconds") with a specified Array of Time Unit ''' Info Items (TimeUnitInfoItms), Conjunction (ConjStr, Default ="and"), Minimum Unit Level ''' Shown (MinUnitLevInt) (0 to TimeUnitInfoItms.Length - 1, -1=All), Maximum Unit Level Shown ''' (MaxUnitLevInt) (-1=All), Maximum # of Unit Levels Shown (MaxNumUnitLevsInt) (1 to 0 to ''' TimeUnitInfoItms.Length - 1, 0=All) and Round Last Shown Units Up Flag (RoundUpBool). ''' Suppress leading 0 Unit Levels. ''' </summary> ''' <param name="NumDbl"></param> ''' <param name="NumUnitInfoItms"></param> ''' <param name="ConjStr"></param> ''' <param name="MinUnitLevInt"></param> ''' <param name="MaxUnitLevInt"></param> ''' <param name="MaxNumUnitLevsInt"></param> ''' <param name="RoundUpBool"></param> ''' <param name="FormatStr"></param> ''' <param name="FmtProvider"></param> ''' <returns></returns> ''' <remarks></remarks> Public Function NumToLongStr( _ ByVal NumDbl As Double, _ ByVal NumUnitInfoItms As clsNumUnitInfoItem(), _ Optional ByVal ConjStr As String ="and", _ Optional ByVal MinUnitLevInt As Integer = -1, _ Optional ByVal MaxUnitLevInt As Integer = -1, _ Optional ByVal MaxNumUnitLevsInt As Integer = 0, _ Optional ByVal RoundUpBool As Boolean = False, _ Optional ByVal FormatStr As String ="N0", _ Optional ByVal FmtProvider As System.IFormatProvider = Nothing _ ) As String NumToLongStr ="" Const TUnitDelimStr As String ="," If (MinUnitLevInt < -1) OrElse (MinUnitLevInt >= NumUnitInfoItms.Length) Then Throw New Exception("Invalid MinUnitLevInt:" & MaxUnitLevInt) End If If (MaxUnitLevInt < -1) OrElse (MaxUnitLevInt >= NumUnitInfoItms.Length) Then Throw New Exception("Invalid MaxDetailLevelInt:" & MaxUnitLevInt) End If If (MaxNumUnitLevsInt < 0) OrElse (MaxNumUnitLevsInt > NumUnitInfoItms.Length) Then Throw New Exception("Invalid MaxNumUnitLevsInt:" & MaxNumUnitLevsInt) End If Dim PrevNumUnitsDbl As Double = NumDbl Dim CurrUnitLevInt As Integer = -1 Dim NumUnitLevsShownInt As Integer = 0 For Each UnitInfoItem In NumUnitInfoItms CurrUnitLevInt += 1 With UnitInfoItem Dim CurrNumUnitsDbl As Double = PrevNumUnitsDbl * .UnitsInParentInt Dim CurrTruncNumUnitsInt As Integer = Math.Truncate(CurrNumUnitsDbl) PrevNumUnitsDbl = CurrNumUnitsDbl If CurrUnitLevInt < MinUnitLevInt Then Continue For PrevNumUnitsDbl -= CurrTruncNumUnitsInt 'If (CurrUnitLevInt > TimeUnitInfoItms.Length) _ ' OrElse _ ' ( _ ' (CurrUnitLevInt > MaxUnitLevInt) AndAlso _ ' (MaxUnitLevInt <> -1) _ ' ) _ ' OrElse _ ' ( _ ' (NumUnitLevsShownInt + 1 > MaxNumUnitLevsInt) AndAlso _ ' (MaxNumUnitLevsInt <> 0) _ ' ) Then Exit For If (CurrUnitLevInt = (NumUnitInfoItms.Length - 1)) OrElse _ (CurrUnitLevInt = MaxUnitLevInt) OrElse _ ((NumUnitLevsShownInt + 1) = MaxNumUnitLevsInt) Then If NumUnitLevsShownInt > 0 Then Dim TUnitDelimStrLenInt As Integer = TUnitDelimStr.Length NumToLongStr = NumToLongStr.Remove( _ NumToLongStr.Length - TUnitDelimStrLenInt, _ TUnitDelimStrLenInt) NumToLongStr &="" & ConjStr &"" End If Dim CurrNunUnitsRoundedInt As Integer If RoundUpBool Then If CurrNumUnitsDbl <> CurrTruncNumUnitsInt Then CurrNunUnitsRoundedInt = CurrTruncNumUnitsInt + 1 Else CurrNunUnitsRoundedInt = CurrTruncNumUnitsInt End If Else CurrNunUnitsRoundedInt = Math.Round( _ value:=CurrNumUnitsDbl, mode:=MidpointRounding.AwayFromZero) End If NumToLongStr &= _ PluralizeUnitsStr(CurrNunUnitsRoundedInt, _ .UnitSglStr, .UnitPluralStr, FormatStr, FmtProvider) Exit For Else ' -- Not (MaxUnitLevInt or MaxNumUnitLevsInt) If NumUnitLevsShownInt > 0 OrElse CurrTruncNumUnitsInt <> 0 Then NumToLongStr &= _ PluralizeUnitsStr(CurrTruncNumUnitsInt, _ .UnitSglStr, .UnitPluralStr, FormatStr, FmtProvider) & _ TUnitDelimStr NumUnitLevsShownInt += 1 End If End If ' -- Else Not (MaxUnitLevInt or MaxNumUnitLevsInt) End With ' -- UnitInfoItem Next UnitInfoItem End Function ''' <summary> ''' Call NumToLongStr with a specified TimeSpan's (TS) TotalDays. ''' </summary> ''' <param name="TS"></param> ''' <param name="TimeUnitInfoItms"></param> ''' <param name="ConjStr"></param> ''' <param name="MinUnitLevInt"></param> ''' <param name="MaxUnitLevInt"></param> ''' <param name="MaxNumUnitLevsInt"></param> ''' <param name="RoundUpBool"></param> ''' <param name="FormatStr"></param> ''' <param name="FmtProvider"></param> ''' <returns></returns> ''' <remarks></remarks> Public Function TimeSpanToStr( _ ByVal TS As TimeSpan, _ ByVal TimeUnitInfoItms As clsNumUnitInfoItem(), _ Optional ByVal ConjStr As String ="and", _ Optional ByVal MinUnitLevInt As Integer = -1, _ Optional ByVal MaxUnitLevInt As Integer = -1, _ Optional ByVal MaxNumUnitLevsInt As Integer = 0, _ Optional ByVal RoundUpBool As Boolean = False, _ Optional ByVal FormatStr As String ="N0", _ Optional ByVal FmtProvider As System.IFormatProvider = Nothing _ ) As String Return NumToLongStr( _ NumDbl:=TS.TotalDays, _ NumUnitInfoItms:=TimeUnitInfoItms, _ ConjStr:=ConjStr, _ MinUnitLevInt:=MinUnitLevInt, _ MaxUnitLevInt:=MaxUnitLevInt, _ MaxNumUnitLevsInt:=MaxNumUnitLevsInt, _ RoundUpBool:=RoundUpBool, _ FormatStr:=FormatStr, _ FmtProvider:=FmtProvider _ ) End Function ''' <summary> ''' Call TimeSpanToStr with TimeLongEnUnitInfoItms. ''' </summary> ''' <param name="TS"></param> ''' <param name="MinUnitLevInt"></param> ''' <param name="MaxUnitLevInt"></param> ''' <param name="MaxNumUnitLevsInt"></param> ''' <param name="RoundUpBool"></param> ''' <param name="FormatStr"></param> ''' <param name="FmtProvider"></param> ''' <returns></returns> ''' <remarks></remarks> Public Function TimeSpanToLongEnStr( _ ByVal TS As TimeSpan, _ Optional ByVal MinUnitLevInt As Integer = -1, _ Optional ByVal MaxUnitLevInt As Integer = -1, _ Optional ByVal MaxNumUnitLevsInt As Integer = 0, _ Optional ByVal RoundUpBool As Boolean = False, _ Optional ByVal FormatStr As String ="N0", _ Optional ByVal FmtProvider As System.IFormatProvider = Nothing _ ) As String Return TimeSpanToStr( _ TS:=TS, _ TimeUnitInfoItms:=TimeLongEnUnitInfoItms, _ MinUnitLevInt:=MinUnitLevInt, _ MaxUnitLevInt:=MaxUnitLevInt, _ MaxNumUnitLevsInt:=MaxNumUnitLevsInt, _ RoundUpBool:=RoundUpBool, _ FormatStr:=FormatStr, _ FmtProvider:=FmtProvider _ ) End Function |