将小数小时转换为DD:HH:MM

时间:2012-03-14 09:22:33

标签: c# datetime

我试图将一个小时的小时数转换为天,小时和分钟。

到目前为止,这是我所拥有的,它尚未完全存在。如果有意义,我需要从小时部分中减去小时数?

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

6 个答案:

答案 0 :(得分:37)

您可以使用TimeSpan.FromHours来获取时间跨度,然后就可以获得所需的一切:

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

例如:

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

答案 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块目前毫无意义且令人分心。只需摆脱它。)

答案 2 :(得分: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

答案 3 :(得分:2)

简单。

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

结果将是00:00:15秒。如果counter = 1,那么结果将是00:01:00,依此类推。

答案 4 :(得分:0)

这是另一个解释它非常好的帖子。

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

DateTime.ToString(“yyyy-MM-dd hh:mm:ss”);

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

答案 5 :(得分:0)

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