为什么此日期时间方法失败

本文关键字:方法 失败 时间 日期 为什么 | 更新日期: 2023-09-27 18:01:00

我正在使用一个基本函数来获取小时、分钟和秒。如果时间少于24小时,一切正常。我想得到时间,即使他们是超过24而不是天。

下面的示例产生:00h:00m:00s

我的测试:

[TestMethod()]      
public void Test_Hours_Greater_Than_24()
{
   EmployeeSkill target = new EmployeeSkill();  appropriate value
   double sec = 86400;
   string expected = "24h:00m:00s"; 
   string actual;
   actual = target.GetAgentTime(sec);
   Assert.AreEqual(expected, actual);
}

我的方法:

public string GetAgentTime(double sec)
{
   TimeSpan t = TimeSpan.FromSeconds(sec);
   return string.Format("{0:D2}h:{1:D2}m:{2:D2}s",
                        t.Hours,
                        t.Minutes,
                        t.Seconds
                       ); 
}

为什么此日期时间方法失败

尝试t.TotalHours。一旦达到全天,t.Hours将结束,并相应地增加t.Days

获取以整小时和小数小时表示的当前TimeSpan结构的值。

using System;
public class Example
{
   public static void Main()
   {
      // Define an interval of 1 day, 15+ hours.
      TimeSpan interval = new TimeSpan(1, 15, 42, 45, 750); 
      Console.WriteLine("Value of TimeSpan: {0}", interval);
      Console.WriteLine("{0:N5} hours, as follows:", interval.TotalHours);
      Console.WriteLine("   Hours:        {0,3}", 
                        interval.Days * 24 + interval.Hours);
      Console.WriteLine("   Minutes:      {0,3}", interval.Minutes);
      Console.WriteLine("   Seconds:      {0,3}", interval.Seconds);
      Console.WriteLine("   Milliseconds: {0,3}", interval.Milliseconds);
   }
}
// The example displays the following output: 
//       Value of TimeSpan: 1.15:42:45.7500000 
//       39.71271 hours, as follows: 
//          Hours:         39 
//          Minutes:       42 
//          Seconds:       45 
//          Milliseconds: 750

您应该使用TimeSpan.TotalHours,但它返回一个双精度,因此也修复了格式:

return string.Format("{0:00}h:{1:D2}m:{2:D2}s", t.TotalHours, 
                                                t.Minutes, t.Seconds);

使用TotalHours属性,该属性返回以整小时和小数小时表示的TimeSpan的整个值。您只需要截断值即可获得整个小时数:

public string GetAgentTime(double sec) {
  TimeSpan t = TimeSpan.FromSeconds(sec);
  return string.Format(
    "{0:D2}h:{1:D2}m:{2:D2}s",
    Math.Floor(t.TotalHours),
    t.Minutes,
    t.Seconds
  ); 
}

为什么要使用TimeSpan?这更简单,并且完全符合您的要求:

public static string GetAgentTime( double s )
{
  int    seconds   = (int) Math.Round(s,0) ;
  int    hours     = Math.DivRem( seconds , 60*60 , out seconds ) ; // seconds/hour
  int    minutes   = Math.DivRem( seconds , 60    , out seconds ) ; // seconds/minute
  string agentTime = string.Format( "{0:00}h:{1:00}m:{2:00}s",
                       hours , minutes , seconds
                       ) ;
  return agentTime ;
}