2012-03-14 2 views
13

Im пытается конвертировать числовое число часов в сутки, часы и минуты.Преобразование десятичных часов в ДД: HH: MM

Это то, что у меня есть до сих пор, его еще нет. Мне нужно вычесть количество часов из дней с части часов, если это имеет смысл?

 /// <summary> 
     /// Converts from a decimal value to DD:HH:MM 
     /// </summary> 
     /// <param name="dHours">The total number of hours</param> 
     /// <returns>DD:HH:MM string</returns> 
     public static string ConvertFromDecimalToDDHHMM(decimal dHours) 
     { 
      try 
      { 
       decimal hours = Math.Floor(dHours); //take integral part 
       decimal minutes = (dHours - hours) * 60.0M; //multiply fractional part with 60 
       int D = (int)Math.Floor(dHours/24); 
       int H = (int)Math.Floor(hours); 
       int M = (int)Math.Floor(minutes); 
       //int S = (int)Math.Floor(seconds); //add if you want seconds 
       string timeFormat = String.Format("{0:00}:{1:00}:{2:00}", D, H, M); 

       return timeFormat; 
      } 
      catch (Exception) 
      { 
       throw; 
      } 
     } 

РЕШЕНИЕ:

/// <summary> 
    /// Converts from a decimal value to DD:HH:MM 
    /// </summary> 
    /// <param name="dHours">The total number of hours</param> 
    /// <returns>DD:HH:MM string</returns> 
    public static string ConvertFromDecimalToDDHHMM(decimal dHours) 
    { 
     try 
     { 
      decimal hours = Math.Floor(dHours); //take integral part 
      decimal minutes = (dHours - hours) * 60.0M; //multiply fractional part with 60 
      int D = (int)Math.Floor(dHours/24); 
      int H = (int)Math.Floor(hours - (D * 24)); 
      int M = (int)Math.Floor(minutes); 
      //int S = (int)Math.Floor(seconds); //add if you want seconds 
      string timeFormat = String.Format("{0:00}:{1:00}:{2:00}", D, H, M); 

      return timeFormat; 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 

ответ

37

Вы можете использовать TimeSpan.FromHours, чтобы получить отрезок времени, то у вас есть все, что вам нужно:

TimeSpan ts = TimeSpan.FromHours(Decimal.ToDouble(dHours)); 

Например:

int D = ts.Days; 
int H = ts.Hours; 
int M = ts.Minutes; 
+0

Спасибо, намного меньше работы, чем мое решение. – WraithNath

+0

Интересно, возникают ли ситуации, когда преобразование из десятичного в двойное может вызвать проблемы - кажется, что может быть (и вы можете закончиться тем меньше, чем вы ожидаете, например), но это, безусловно, простой подход :) –

+0

Я видел! Комментарий удален :-). Хороший ответ (мы все ответили одновременно). У тебя все еще есть +1. –

3

Вы должны вычесть (D * 24) от часов ... или вы могли бы просто использовать:

int H = ((int) dHours) % 24; 

Если вы собираетесь бросить в int в любом случае, нет необходимости звонить Math.Floor. Так, например, вы могли бы реально использовать:

// I'd rename dHours as well, by the way... 
int wholeHours = (int) dHours; 
int days = wholeHours/24; 
int hours = wholeHours % 24; 
int minutse = (int) ((dHours % 1M) * 60); 

С другой стороны, вы должны быть осторожны, если это может быть отрицательным - все виды вещей могут закончиться поддатыми в этом случае. Если вы не верите, что вам нужно это обработать, я бы прямо его проверял и выдавал исключение, если dHours отрицательно, прежде чем что-либо делать.

(.. Обратите внимание, что попытка/поймать блок бессмысленно и отвлекают на данный момент просто избавиться от него)

+0

спасибо, это были часы - (D * 24), я пропал без вести, отлично работает сейчас – WraithNath

+0

Почему попытка поймать бессмысленно? вы имеете в виду только пример кода, который я предоставляю или вообще? – WraithNath

+0

@WraithNath: каждый раз, когда у вас есть единственный блок catch, чье тело просто «бросает», вы должны полностью удалить try/catch. Это нецелесообразно (кроме * возможно, * для отладки) и загромождает вашу базу кода. В любом случае, если исключение выбрано внутри тела метода, оно будет размножаться в стеке. –

2

Почему бы не сделать что-то вроде этого?

double d = 25.23523; 
Timespan t = TimeSpan.FromHours(d); 

Это даст вам:

t = 1.01:14:06.8280000 

Затем вы можете опрашивать TimeSpan объект, как вы хотите: http://msdn.microsoft.com/en-us/library/system.timespan.aspx

ПРИМЕЧАНИЕ: TimeSpan.FromHours нуждается в double вход, а не decimal.

0

это еще одно сообщение, которое распространяется на него довольно хорошо.

Convert date to string format yyyy-mm-dd HH:MM:SS - C#

MyDateTime.ToString ("YYYY-MM-дд чч: мм: сс");

также

http://blog.stevex.net/string-formatting-in-csharp/

+0

Я не конвертирую дату в строковый формат !? – WraithNath

+0

Извините, я неправильно понял ваш вопрос, TimeSpan.FromHours (hours) .ToString ("dd: hh: mm"); является правильным решением. – Mayank

0
public static string GetTimeString(Decimal dHours) 
{ 
    DateTime dTime = new DateTime().AddHours(dHours); 
    return dTime.ToString("HH:mm:ss"); // HH: 24h or hh: 12h 
} 
2

Simple.

  double counter = 0.25; 
      TimeSpan span = TimeSpan.FromMinutes(counter); 
      textbox1.Text = span.ToString(@"hh\:mm\:ss"); 

результат будет 00:00:15 секунд, если счетчик = 1, то результат будет 00:01:00 и так далее.

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