使用带有DateTime.AddDays参数的自定义方法

时间:2018-08-15 01:09:31

标签: c# datetime timespan

在DateTime的算术运算中,称为

的方法
DateTime.AddDays Method (Double) 

如果我们只想使用没有分数的天数,则使用此方法可能很容易 (例如,完成日期将以带整数的double参数引用) 或常见的天数部分(例如,它将被引用为double参数,其中0.5代表一半,而0.25代表第八位)

对于我来说,如果我要求提供一天的double参数值(例如12天5小时30分钟54秒235毫秒),这将是一个问题

将其转换为分数可能会有一定的难度,并且可能会浪费时间

因此,我决定构建一个自定义方法(在C#的中级级别),该方法根据参数的特定值为double提供实例值:

public static double TimeToFraction(int day, int hour, int minute, int second, int millisecond)
    {
        var hour_to_date    = TimeSpan.FromHours(hour).TotalDays;
        var min_to_day      = TimeSpan.FromMinutes(minute).TotalDays;
        var second_to_day   = TimeSpan.FromSeconds(second).TotalDays;
        var millisec_to_day = TimeSpan.FromMilliseconds(millisecond).TotalDays;

        return day+ hour_to_date + min_to_day + second_to_day + millisec_to_day;       
    }

并在以下代码及其工作中进行尝试

class Program
{
    public static void Main()
    {
        var GetDate = new DateTime(2000, 01, 01, 00, 00, 00, 000);

        // Set The value 
        var dd = Program.TimeToFraction(1, 3, 00, 0, 0);
        // Using The regular way 
        var resukt = GetDate.AddDays(1.125);
        // using my method 
        var result = GetDate.AddDays(dd);

        Console.WriteLine(resukt.ToString("yyyy'/'MM'/'dd HH:mm:ss.fffff"));
        Console.WriteLine(result.ToString("yyyy'/'MM'/'dd HH:mm:ss.fffff"));

       // outputs 
       //2000/01/02 03:00:00.00000
       //2000/01/02 03:00:00.00000


        Console.ReadLine();
    }

    public static double TimeToFraction(int day, int hour, int minute, int second, int millisecond)
    {
        var hour_to_date    = TimeSpan.FromHours(hour).TotalDays;
        var min_to_day      = TimeSpan.FromMinutes(minute).TotalDays;
        var second_to_day   = TimeSpan.FromSeconds(second).TotalDays;
        var millisec_to_day = TimeSpan.FromMilliseconds(millisecond).TotalDays;

        return day+ hour_to_date + min_to_day + second_to_day + millisec_to_day;       
    }
}

我只想听你们的消息说我做的好不好?对此有任何想法..或对该方法进行了代码改进..

2 个答案:

答案 0 :(得分:2)

此方法可以完全替换为TimeSpan。 TimeSpan可以这样使用:

var ts = new TimeSpan(days, hours, minutes, seconds, milliseconds);

要像您的示例一样使用它:

var dd = new TimeSpan(1, 3, 00, 0, 0);
// using my method 
var result = GetDate.Add(dd);

使用TimeSpan也更安全,因为您没有将一系列floating point numbers一起添加。这是因为TimeSpan实际上是converts的输入,以毫秒为单位,然后在不使用浮点数的情况下进行滴答,因此可以保证您增加了实际输入的时间。就是说,我找不到这种情况导致您的方法中断的情况。

答案 1 :(得分:1)

您可以像这样简化您的方法:

public static void Main()
{
    var GetDate = new DateTime(2000, 01, 01, 00, 00, 00, 000);

    // Using The regular way 
    var resukt = GetDate.AddDays(1.125);
    // using my method 
    var result = GetDate.Add(1, 3, 00, 0, 0);

    Console.WriteLine(resukt.ToString("yyyy'/'MM'/'dd HH:mm:ss.fffff"));
    Console.WriteLine(result.ToString("yyyy'/'MM'/'dd HH:mm:ss.fffff"));

   // outputs 
   //2000/01/02 03:00:00.00000
   //2000/01/02 03:00:00.00000


    Console.ReadLine();
}

public static class DatimeExtensions
{
    public static DateTime Add(this DateTime date, int day, int hour, int minute, int second, int millisecond) =>
        date.AddDays(day).AddHours(hour).AddMinutes(minute).AddSeconds(second).AddMilliseconds(millisecond);
}

让我知道它是否对您有帮助。