为什么这个datetime方法失败了?

时间:2014-04-29 17:18:00

标签: c# unit-testing

我使用基本功能获得小时,分钟秒。如果时间少于24小时,一切都有效。我想要花上几个小时,即使他们超过24天而不是几天。

下面的示例产生: 00H:00米:00年代

我的测试:

[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
                       ); 
}

4 个答案:

答案 0 :(得分:6)

试试t.TotalHourst.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

答案 1 :(得分:1)

使用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
  ); 
}

答案 2 :(得分:1)

你应该使用TimeSpan.TotalHours,但它会返回一个双倍,所以也要修改格式:

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

答案 3 :(得分:-1)

为什么要打扰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 ;
}