2011-05-01 29 views
12

¿Hay un formato de cadena simple que tome un decimal que represente horas y fracciones de horas y lo muestre como horas y minutos?C# String Formato para horas y minutos desde decimal

Por ejemplo: 5.5 formateado para mostrar 5 horas y 30 minutos.

estoy feliz de escribir el código de mí mismo, sin embargo, prefiere utilizar la funcionalidad existente si está disponible

Respuesta

25
decimal t = 5.5M; 
Console.WriteLine(TimeSpan.FromHours((double)t).ToString()); 

Eso te dará "05:30:00" que es bastante estrecha. A continuación, puede dar formato a que el resultado deseado:

var ts = TimeSpan.FromHours((double)t); 
Console.WriteLine("{0} hrs {1} minutes", ts.Hours, ts.Minutes); 

Tenga en cuenta que hay un potencial para la pérdida de precisión en la conversión de decimal a doblar, pero no creo que sería notable en la escala de minutos. Alguien con una comprensión tipo Skeet del sistema de tipo podría sonar aquí.

+1

Bien, no pensé en usar TimeSpan (probablemente debería haberlo hecho :)). Agregué un poco más de formato para ocultar los minutos si fueran 0: string.Format ("{0} hrs {1}", ts.Hours, ts.Minutes> 0? String.Format ("{0}", ts .Minutos) : ""); – johnc

+0

Sí, buena idea. También he usado TimeSpan de esta manera en los informes de Reporting Services, para obtener un lapso de tiempo legible para los humanos. Es un gran truco. –

+0

El segundo ejemplo debe evitarse si tiene un lapso de tiempo> 24 horas. – Matthieu

1

Escribí algunos pequeños métodos de ayuda para esto basados ​​en el comentario de Matt. Puede ser útil para que alguien lo salve escribiéndolo usted mismo.

/// <summary>Converts a decimal e.g. 1.5 to 1 hour 30 minutes</summary> 
/// <param name="duration">The time to convert as a double</param> 
/// <returns> 
///  Returns a string in format: 
///  x hours x minutes 
///  x hours (if there's no minutes) 
///  x minutes (if there's no hours) 
///  Will also pluralise the words if required e.g. 1 hour or 3 hours 
/// </returns> 
public String convertDecimalToHoursMinutes(double time) 
{ 
    TimeSpan timespan = TimeSpan.FromHours(time); 
    int hours = timespan.Hours; 
    int mins = timespan.Minutes; 

    // Convert to hours and minutes 
    String hourString = (hours > 0) ? string.Format("{0} " + pluraliseTime(hours, "hour"), hours) : ""; 
    String minString = (mins > 0) ? string.Format("{0} " + pluraliseTime(mins, "minute"), mins) : ""; 

    // Add a space between the hours and minutes if necessary 
    return (hours > 0 && mins > 0) ? hourString + " " + minString : hourString + minString; 
} 

/// <summary>Pluralise hour or minutes based on the amount of time</summary> 
/// <param name="num">The number of hours or minutes</param> 
/// <param name="word">The word to pluralise e.g. "hour" or "minute"</param> 
/// <returns> Returns correct English pluralisation e.g. 3 hours, 1 minute, 0 minutes</returns> 
public String pluraliseTime(int num, String word) 
{ 
    return (num == 0 || num > 1) ? word + "s" : word; 
} 
+0

no funcionará si el tiempo es> 24 horas. – Matthieu

0

Si tiene tiempo que puede ser más de 24 horas, usted tiene que considerar que la clase TimeSpan tiene una propiedad Días, y la propiedad horas serán ciclo. Algo así evitará cualquier error de tiempo con más de 24 horas:

var tsExample = TimeSpan.FromHours(timeInDecimal); 
var result = $"{tsExample.Hours + (tsExample.Days * 24):00}:{tsExample.Minutes:00}"; 
Cuestiones relacionadas