now new c# .net timespan

c# - new - timespan to time format



Formato del intervalo de tiempo (5)

Esta pregunta ya tiene una respuesta aquí:

¿Cómo puede dar formato elegante a un intervalo de tiempo para decir el ejemplo "1 hora 10 minutos" cuando lo ha declarado como:

TimeSpan t = new TimeSpan(0, 70, 0);

?

Por supuesto, estoy consciente de que podrías hacer algunos cálculos simples para esto, pero esperaba que haya algo en .NET para manejar esto por mí, para escenarios más complicados.

Duplicado de ¿Cómo puedo String.Formatear un objeto TimeSpan con un formato personalizado en .NET?


Copié mi propia respuesta desde aquí: ¿Cómo convierto un TimeSpan a una cadena formateada?

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; }


Me gusta la respuesta en la que está trabajando John. Esto es lo que se me ocurrió.

Convert.ToDateTime(t.ToString()).ToString("h /"Hour(s)/" m /"Minute(s)/" s /"Second(s)/"");

No tiene en cuenta los días, por lo que debería agregarlo si lo desea.


No hay una funcionalidad integrada para esto, necesitarás usar un método personalizado, algo como:

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")


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; }


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"; }