2013-04-01 1 views
1

У меня есть код, который берет, например, 27:30 (27 часов 30 минут) и преобразует его в десятичный, как 27.5. У меня есть другая функция, которая делает обратное.Код для конвертирования рабочего времени обертывается до 24 часов?

public class Time 
    { 
     public static string Hours(decimal d) 
     { 
      return TimeSpan.FromHours((double)(d + 0.005M)).ToString("h\\:mm"); 
     } 

     public static decimal Hours(string s) 
     { 
      decimal r; 
      if (decimal.TryParse(s, out r)) 
       return r; 

      return (decimal)TimeSpan.Parse(s).TotalHours + 0.005M; 
     } 
    } 

Проблема в том, что преобразование из десятичной строки в строку, кажется, завершается до 24 часов. Если я дам 30.0, это дает мне 6:00, что неправильно. Это должно быть 30:00

Что мне делать, чтобы избежать обертывания?

Благодаря

+2

Это не упаковка в течение 24 часов, вы также должны посмотреть на свойство «Дни». В течение 30 часов Дни = 1 и Часы = 6. Вот почему вы видите «6:00». – David

+0

@ConradFrix, «h» в ToString TimeSpan не показывает «TotalHours». Он тянет только из свойства «Часов». – David

+0

@David моя ошибка Я искал «Часы (строка s)» вместо «Часы (десятичные)» –

ответ

3

Там нет спецификатора формата для TotalHours, так что вы должны написать всю логику самостоятельно:

public static string Hours(decimal d) 
{ 
    var ts = TimeSpan.FromHours((double)(d + 0.005M)); 
    return string.Format("{0:0}:{1:00}", (int)ts.TotalHours, ts.Minutes); 
} 

(int)ts.TotalHours литья обрежет минуты от количества часов.

0

Используйте DateTime.ToString, чтобы получить минут только и рассчитать течение нескольких часов самостоятельно.

return string.Format("{0:0}:{1}", Math.Truncate(d+0.005m), TimeSpan.FromHours(d+0.005m).ToString("mm")); 
0

Формат h только часы отчетов не считаются частью дней. См. here.

Вы можете либо вывести количество дней, добавив d, либо выполнить преобразование в своем собственном коде, если вы хотите нестандартное поведение.

Смежные вопросы