2012-03-14 40 views
13

Tôi đang cố gắng chuyển đổi số giờ từ vài giờ sang ngày, giờ và phút.Chuyển đổi số thập phân sang DD: HH: MM

Đây là những gì tôi có cho đến nay, chưa hoàn toàn ở đó. Tôi cần phải trừ số giờ từ những ngày từ phần giờ nếu điều đó có ý nghĩa?

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

Trả lời

37

Bạn có thể sử dụng TimeSpan.FromHours để có được những khoảng thời gian, sau đó bạn có tất cả các bạn cần:

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

Ví dụ:

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

Cảm ơn, công việc ít hơn rất nhiều so với giải pháp của tôi. – WraithNath

+0

Tôi tự hỏi liệu có trường hợp chuyển đổi từ thập phân sang gấp đôi có thể gây ra vấn đề hay không - và bạn có thể kết thúc với ít phút hơn bạn mong đợi, nhưng chắc chắn là một cách tiếp cận đơn giản :) –

+0

Tôi đã thấy! Bình luận đã bị xóa :-). Câu trả lời hay (tất cả chúng tôi đều trả lời cùng một lúc). Bạn vẫn có +1 của tôi. –

3

Bạn cần phải trừ đi (D * 24) từ giờ ... hoặc bạn chỉ có thể sử dụng:

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

Nếu bạn đang đi để cast để int dù sao, không cần phải gọi Math.Floor. Vì vậy, ví dụ, bạn thực sự có thể sử dụng:

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

Mặt khác, bạn cần phải cẩn thận nếu nó có thể là tiêu cực - tất cả mọi thứ có thể sẽ screwy trong trường hợp đó. Nếu bạn không tin rằng bạn phải xử lý điều đó, tôi sẽ kiểm tra một cách rõ ràng và ném một ngoại lệ nếu dHours là tiêu cực trước khi bạn làm bất cứ điều gì khác.

(.. Lưu ý rằng khối try/catch của bạn là vô nghĩa và mất tập trung vào lúc này Chỉ cần thoát khỏi nó)

+0

cảm ơn, đó là giờ - (D * 24) Tôi bị mất tích, hoạt động hoàn hảo ngay bây giờ – WraithNath

+0

tại sao thử lại bắt vô nghĩa? bạn có nghĩa là chỉ cho ví dụ mã tôi đang cung cấp hoặc nói chung? – WraithNath

+0

@WraithNath: Bất kỳ lúc nào bạn có một khối 'catch' duy nhất có thân chỉ là 'ném', bạn nên loại bỏ hoàn toàn try/catch. Nó không phục vụ mục đích nào (ngoài việc cho phép * để gỡ rối) và tạo ra cơ sở mã của bạn. Dù bằng cách nào, nếu một ngoại lệ được ném vào bên trong phần thân của phương thức, nó sẽ được nhân lên trên ngăn xếp. –

2

Tại sao không làm một cái gì đó như thế này?

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

này sẽ cung cấp cho bạn:

t = 1.01:14:06.8280000 

Sau đó, bạn có thể thẩm vấn các đối tượng TimeSpan như bạn muốn: http://msdn.microsoft.com/en-us/library/system.timespan.aspx

LƯU Ý: TimeSpan.FromHours cần một đầu vào double, không phải là một decimal.

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

đơn giản.

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

kết quả sẽ là 00:00:15 giây, nếu truy cập = 1 thì kết quả sẽ là 00:01:00, v.v.

Các vấn đề liên quan