代码之家  ›  专栏  ›  技术社区  ›  James Hay

划分两个时间跨度对象的最佳方法是什么?

c#
  •  8
  • James Hay  · 技术社区  · 16 年前

    我想得到一个时间跨度与另一个时间跨度的比率(基本上是播放视频的总时间进度)。我目前的方法是获取两个TimeSpan对象的毫秒数,并将它们彼此相除。类似:

            int durationInMilliseconds = totalTimeSpan.Milliseconds;
            int progressInMilliseconds = progressTimeSpan.Milliseconds;
    
            Double progressRatio = progressInMilliseconds / durationInMilliseconds;
    

    有更直接的路线吗?这是一个简单的问题,我只是好奇是否有一个超级优雅的方法来解决它。

    干杯! 詹姆斯

    4 回复  |  直到 7 年前
        1
  •  16
  •   Richard Szalay    16 年前

    你应该使用 Ticks TotalMilliseconds ,取决于所需的精度。 Milliseconds 是当前秒之后的毫秒数。

    至于更好的解决方案,它不会比除法简单,所以您当前的解决方案是好的(减去错误)。

        2
  •  17
  •   JDunkerley    16 年前
    double progressRatio = progressTimeSpan.Ticks / (double)totalTimeSpan.Ticks;
    

    必须将1强制转换为double,否则C将执行整数除法。滴答比总毫秒更好,因为这是它存储的方式,并且避免了任何转换。

        3
  •  1
  •   Brett Wolfington    7 年前

    TimeSpan 通过发布 .NET核心2 :

    public TimeSpan Divide(double divisor);
    public double Divide(TimeSpan ts);
    public TimeSpan Multiply(double factor);
    
    public static TimeSpan operator /(TimeSpan timeSpan, double divisor);
    public static double operator /(TimeSpan t1, TimeSpan t2);
    public static TimeSpan operator *(double factor, TimeSpan timeSpan);
    public static TimeSpan operator *(TimeSpan timeSpan, double factor);
    

    值得注意的是 时限 现在可以被另一个分开了 时限 :

    var a = new TimeSpan(10, 0, 0);
    var b = new TimeSpan(0, 30, 0);
    var c = new TimeSpan(0, 4, 30);
    
    Console.WriteLine(a / b);
    // Displays: "20"
    
    Console.WriteLine(b / c);
    // Displays: "6.66666666666667"
    
        4
  •  0
  •   shtse8    7 年前

    利用扩展方法可以提高代码的可读性。

    public static double DividedBy(this TimeSpan x, TimeSpan y)
    {
        return Convert.ToDouble(x.Ticks) / y.Ticks;
    }