2012-03-14 10 views
13

Denklik sayısını saat, gün ve saat olarak çevirmeye çalışıyorum.Ondalik saatleri DD'ye dönüştürün: HH: MM

Şimdiye kadar sahip olduğum şey, henüz tam orada değil. Eğer bu mantıklı olursa saatlerden günler arasındaki saat sayısını çıkarmak zorundayım?

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

ÇÖZÜM:

/// <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; 
     } 
    } 
Sen saatten (D * 24) ... çıkarmak gerekir

cevap

37

Sen zaman aralığını elde etmek TimeSpan.FromHours kullanabilirsiniz şunlar gereklidir:

Örneğin
TimeSpan ts = TimeSpan.FromHours(Decimal.ToDouble(dHours)); 

:

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

Teşekkürler, çözümümden çok daha az iş. – WraithNath

+0

Ondalıktan ikiye dönüştürme işleminin sorunlara neden olabileceği durumlar var - (örneğin, beklediğinizden daha az bir dakika ile sonuçlanabilir) ama bu kesinlikle basit bir yaklaşım olabilir :) –

+0

Gördüm! Yorum silindi :-). Güzel cevap (hepimiz aynı anda cevap verdik). Hala benim +1'imi aldın. –

3

ya da sadece kullanabilirsiniz:

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

Eğer int yayın yapmak için gidiyoruz Her neyse, Math.Floor'u aramanıza gerek yoktur. Yani, örneğin, aslında kullanabilirsiniz: - her türlü şey bu durumda kötü görünse bitebileceğini o negatif olabilir eğer

// 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); 

Öte yandan, dikkatli olmak gerekir. Bunu yapman gerektiğine inanmıyorsanız, başka bir şey yapmadan önce dHours'un negatif olup olmadığını açıkça kontrol edip bir istisna atarım. o zaman her şeye sahip

(.. senin deneme/yakalama bloğu Sadece ondan kurtulmak anlamsız ve şu anda dikkat dağıtıcı olduğunu unutmayın)

+0

teşekkürler, saat oldu - (D * 24) Kaybettim, şu an mükemmel çalışıyor – WraithNath

+0

neden deneme noktası anlamsız? sadece sağladığım kod örneği için mi yoksa genel olarak mı? – WraithNath

+0

@WraithNath: Vücudu sadece 'atmak' olan tek bir "catch" bloğuna sahip olduğunuz zaman, try/catch'u tamamen kaldırmalısınız. Hiçbir amaca hizmet etmez (hata ayıklama için * tartışmasız * dışında) ve kod tabanınızı karıştırır. Her iki durumda da, yöntemin gövdesi içine bir istisna atılırsa, yığın yığılır. –

2

Neden böyle bir şey yapamaz?

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

Bu size verecektir: istediğiniz gibi

t = 1.01:14:06.8280000 

Sonra TimeSpan nesneyi sorgulayabilirsiniz: http://msdn.microsoft.com/en-us/library/system.timespan.aspx

NOT: Bir double girişi değil, bir decimal ihtiyacı TimeSpan.FromHours.

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

basit. Sayaç = 1 daha sonra sonuç böylece 00:01:00 olabilir ve eğer

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

sonuç, 00:00:15 saniye olacaktır.

İlgili konular