Timespan formatting
本问题已经有最佳答案,请猛点这里访问。
当您将时间跨度声明为"1小时10分钟"时,如何优雅地将其格式化为示例"1小时10分钟"?
1 |
?
我当然知道你可以为这个做一些简单的数学,但我有点希望.NET中有一些东西可以为我处理这个-对于更复杂的场景。
如何设置字符串的副本。在.NET中使用自定义格式设置TimeSpan对象的格式?
这没有内置功能,您需要使用自定义方法,例如:
1 2 3 4 5 6 | TimeSpan ts = new TimeSpan(0, 70, 0); String.Format("{0} hour{1} {2} minute{3}", ts.Hours, ts.Hours == 1 ?"" :"s", ts.Minutes, ts.Minutes == 1 ?"" :"s") |
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 | public static string Pluralize(int n, string unit) { if (string.IsNullOrEmpty(unit)) return string.Empty; n = Math.Abs(n); // -1 should be singular, too return unit + (n == 1 ? string.Empty :"s"); } public static string TimeSpanInWords(TimeSpan aTimeSpan) { List<string> timeStrings = new List<string>(); int[] timeParts = new[] { aTimeSpan.Days, aTimeSpan.Hours, aTimeSpan.Minutes, aTimeSpan.Seconds }; string[] timeUnits = new[] {"day","hour","minute","second" }; for (int i = 0; i < timeParts.Length; i++) { if (timeParts[i] > 0) { timeStrings.Add(string.Format("{0} {1}", timeParts[i], Pluralize(timeParts[i], timeUnits[i]))); } } return timeStrings.Count != 0 ? string.Join(",", timeStrings.ToArray()) :"0 seconds"; } |
。
从这里复制了我自己的答案:如何将时间跨度转换为格式化字符串?
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} days,", span.Days) : string.Empty, span.Duration().Hours > 0 ? string.Format("{0:0} hours,", span.Hours) : string.Empty, span.Duration().Minutes > 0 ? string.Format("{0:0} minutes,", span.Minutes) : string.Empty, span.Duration().Seconds > 0 ? string.Format("{0:0} seconds", span.Seconds) : string.Empty); if (formatted.EndsWith(",")) formatted = formatted.Substring(0, formatted.Length - 2); if (string.IsNullOrEmpty(formatted)) formatted ="0 seconds"; return formatted; } |
我喜欢约翰正在研究的答案。这就是我想到的。
1 | Convert.ToDateTime(t.ToString()).ToString("h "Hour(s)" m "Minute(s)" s "Second(s)""); |
不考虑天数,因此如果需要,您需要添加。
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 | public static string GetDurationInWords( TimeSpan aTimeSpan ) { string timeTaken = string.Empty; if( aTimeSpan.Days > 0 ) timeTaken += aTimeSpan.Days +" day" + ( aTimeSpan.Days > 1 ?"s" :"" ); if( aTimeSpan.Hours > 0 ) { if( !string.IsNullOrEmpty( timeTaken ) ) timeTaken +=""; timeTaken += aTimeSpan.Hours +" hour" + ( aTimeSpan.Hours > 1 ?"s" :"" ); } if( aTimeSpan.Minutes > 0 ) { if( !string.IsNullOrEmpty( timeTaken ) ) timeTaken +=""; timeTaken += aTimeSpan.Minutes +" minute" + ( aTimeSpan.Minutes > 1 ?"s" :"" ); } if( aTimeSpan.Seconds > 0 ) { if( !string.IsNullOrEmpty( timeTaken ) ) timeTaken +=""; timeTaken += aTimeSpan.Seconds +" second" + ( aTimeSpan.Seconds > 1 ?"s" :"" ); } if( string.IsNullOrEmpty( timeTaken ) ) timeTaken ="0 seconds."; return timeTaken; } |
号