关于c#:如何将TimeSpan转换为格式化字符串?

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
new DateTime(timeSpan.Ticks).ToString("HH:mm");


这是最短的解决方案。

1
timeSpan.ToString(@"hh\:mm");


(3)将timespan.tostring的你吗?如果不是,它看起来像这样的代码示例,介绍如何在页面的自定义格式的TimeSpan对象。


使用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路TimeSpan格式它是添加到DateTime和格式是:

1
string formatted = (DateTime.Today + dateDifference).ToString("HH 'hrs' mm 'mins' ss 'secs'");

本厂是一长的时间差不超过24小时。

TodayDateTime物业收益值在零时间的操作系统组件,组件的时间是TimeSpan的结果值。


根据微软的文档,在时间结构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
new DateTime((DateTime.Now - DateTime.Now.AddHours(-25)).Ticks).ToString("HH:mm")

这是不是你会得到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
TimeSpan dateDifference = new TimeSpan(0,0,0, (int)endTime.Subtract(beginTime).TotalSeconds);

现在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