划分两个TimeSpan对象的最佳方法是什么?

时间:2009-09-10 14:00:04

标签: c#

我希望得到一个TimeSpan与另一个TimeSpan的比率(基本上是从它的总时间开始播放视频的进度)。我目前的方法是获取两个TimeSpan对象的毫秒数,并将一个对象除以另一个。类似的东西:

        int durationInMilliseconds = totalTimeSpan.Milliseconds;
        int progressInMilliseconds = progressTimeSpan.Milliseconds;

        Double progressRatio = progressInMilliseconds / durationInMilliseconds;

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

干杯 詹姆斯

4 个答案:

答案 0 :(得分:17)

double progressRatio = progressTimeSpan.Ticks / (double)totalTimeSpan.Ticks;

您必须将一个转换为double,否则C#将执行整数除法。 Ticks优于TotalMilliseconds,因为它是如何存储的,并避免任何转换。

答案 1 :(得分:16)

您应该使用TicksTotalMilliseconds,具体取决于所需的精度。 Milliseconds是当前秒数之后的毫秒数。

至于更好的解决方案,它并不比分部简单,所以你当前的解决方案很好(减去错误)。

答案 2 :(得分:1)

TimeSpan通过发布 .NET Core 2.0 获得了几个新的运营商:

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

值得注意的是,TimeSpan现在可以被另一个TimeSpan划分:

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"

答案 3 :(得分:0)

使用扩展方法可以使代码更具可读性。

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