2012-03-14 7 views
13

時間を日、時間、分に変換しようとしています。小数をDDに変換してください。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; 
      } 
     } 

SOLUTION:

/// <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が否定的であれば例外をスローします。

(あなたのtry/catchブロックは、現時点では無意味と気が散ることに注意してくださいただ、それを取り除く。。)

+0

ありがとう、それは時間だった - (D * 24)私は行方不明だった、今すぐ完璧に動作する – WraithNath

+0

なぜtryキャッチ無意味ですか?私が提供している、または一般的なコード例を意味していますか? – WraithNath

+0

@WraithNath:本体が 'throw'である単一のcatchブロックがあるときは、try/catchを完全に削除する必要があります。それは目的を果たさず(デバッグには*間違いなく)、コードベースを騒がせます。どちらの方法でも、メソッドの本体内で例外がスローされた場合、スタックの上に伝播されます。 –

2

なぜこのような何かをしませんか?

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

これはあなたを与える:http://msdn.microsoft.com/en-us/library/system.timespan.aspx

注:double入力を必要とTimeSpan.FromHours、ないdecimalをあなたが望むよう

t = 1.01:14:06.8280000 

その後、TimeSpanオブジェクトを調べることができます。

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

シンプル。

結果は00:00:15秒になります。カウンタ= 1の場合、結果は00:01:00となります。

関連する問題