如何在C#中对HH:MM:SS格式的时间字符串进行除法?

时间:2011-01-11 21:48:16

标签: c# javascript time

我有一系列时间来自Web服务的字符串。时间格式为HH:MM:SS:000(3毫秒数字)。我需要比较两次,以确定一个是否是另一个的两倍多:

if ( timeA / timeB > 2 )

使用时间字符串最简单的方法是什么?


如果我用Python编写,这将是我的问题的答案: Difference between two time intervals?

(除了我需要的算子是除法,而不是减法)


编辑:我真正想要的是获得timeA到timeB的比率的方法,这需要除法而不是减法。不幸的是,DateTime结构似乎没有除法运算符。更新了问题标题和正文以反映这一点。


解决方案:

基于我在下面选择的答案,这是迄今为止所有提议的方法中最简单的,这是工作解决方案:

DateTime timeA;
DateTime timeB;
DateTime.TryParse(webServiceTimeString_A, out timeA);
DateTime.TryParse(webServiceTimeString_B, out timeB);

// TimeA is more than twice the duration of TimeB.
if ( (double)timeA.TimeOfDay.Ticks / (double)timeB.TimeOfDay.Ticks > 2.0f )
{
    // Do stuff.
}
else
{
    // Do different stuff.
}

JavaScript的:

最近,在AJAX调用的JavaScript中也需要这个功能,因此,我必须编写一个转换函数(只是不在C#中)。如果需要:

if (_timeInSeconds(timeA) / _timeInSeconds(timeB) > 2) {
    // Do stuff.
}

// Convert HH:MM:SS:000 string to a number of seconds so we can do math on it.
function _timeInSeconds(stringTime) {
    var timeArray = stringTime.split(":");
    var timeInSeconds = 0;

    //HH
    timeInSeconds += (parseInt(timeArray[0], 10) * 3600);

    //MM
    timeInSeconds += (parseInt(timeArray[1], 10) * 60);

    //SS
    timeInSeconds += (parseInt(timeArray[2], 10));

    //Milliseconds
    timeInSeconds += (parseInt(timeArray[3], 10) / 1000);

    return timeInSeconds;
}

明智的话:确保指定parseInt的第二个参数...

parseInt(string, 10)

...指定字符串是Base-10数字。否则,如果字符串以0开头(常见于HH:MM:SS格式),则JavaScript会将其确定为Base-8编号。这会导致字符串"08""09"转换为十进制整数0(因为Base-8中不存在8和9),并且计算结束了。

5 个答案:

答案 0 :(得分:3)

首先按parsing the string然后the math is easy创建DateTime:)

请注意,使用-运算符减去两个日期将返回TimeSpan,请查看MSDN文档中的内容。

答案 1 :(得分:3)

查看TimeSpan结构,然后Calculate period of time with .NET

实际上,您的代码可以简化:

    DateTime timeA = DateTime.Now;
    DateTime timeB = DateTime.Now.AddHours(-10.0);

    if ( (double)timeA.TimeOfDay.Ticks / (double)timeB.TimeOfDay.Ticks > 2.0f )
        Console.WriteLine("Time A is more than twice time B");
    else
        Console.WriteLine("Time A is NOT more than twice time B");

答案 2 :(得分:1)

我认为解析字符串的最简单方法是在.Net 4中使用TimeSpan.ParseExact

    public static bool MoreThanDouble(string t1, string t2)
    {
        const string format = @"%h\:mm\:ss\:fff";
        long ticks1 = TimeSpan.ParseExact(t1, format, null).Ticks,
             ticks2 = TimeSpan.ParseExact(t2, format, null).Ticks;
        return ticks1 - ticks2 > ticks2;
    }

    static void Main(string[] args)
    {
        Console.WriteLine(MoreThanDouble("10:11:12:123", "1:23:45:000"));
        Console.WriteLine(MoreThanDouble("10:11:12:123", "9:23:45:000"));
    }

这将打印True False。 如果您没有.Net 4,则可以使用DateTime

    public static bool MoreThanDouble2(string t1, string t2)
    {
        const string format = @"%h\:mm\:ss\:fff";
        long ticks1 = DateTime.ParseExact(t1, format, null,
             System.Globalization.DateTimeStyles.NoCurrentDateDefault).Ticks,
             ticks2 = DateTime.ParseExact(t2, format, null,
             System.Globalization.DateTimeStyles.NoCurrentDateDefault).Ticks;
        return ticks1 - ticks2 > ticks2;
    }

答案 3 :(得分:0)

使用DateTime.FormatExact()从您的字符串转换为DateTime,然后通过对它们进行区分,您可以获得TimeSpan来玩。

答案 4 :(得分:0)

我只是将字符串解析为时间跨度而不是先转换为DateTime

以下是如何执行此操作的示例:

class Program
{
    static void Main( string[] args )
    {
        Console.WriteLine( ( "02:00:00:001".ToTimeSpan().TotalMilliseconds / "01:00:00:000".ToTimeSpan().TotalMilliseconds ) > 2 );
        Console.WriteLine( ( "02:00:00:001".ToTimeSpan().TotalMilliseconds / "00:60:00:000".ToTimeSpan().TotalMilliseconds ) > 2 );
        Console.WriteLine( ( "02:00:00:000".ToTimeSpan().TotalMilliseconds / "01:00:00:001".ToTimeSpan().TotalMilliseconds ) > 2 );
        Console.WriteLine( ( "25:12:60:002".ToTimeSpan().TotalMilliseconds / "12:12:60:002".ToTimeSpan().TotalMilliseconds ) > 2 );
    }
}

public static class Helpers
{
    public static TimeSpan ToTimeSpan(this string time )
    {
        var split = time.Split( ':' );
        if( split.Length != 4 )
        {
            throw new InvalidOperationException("Invalid format");
        }
        //First posistion is days.
        return new TimeSpan(0, split[ 0 ].ToInt(), split[ 1 ].ToInt(), split[ 2 ].ToInt(), split[ 3 ].ToInt() );
    }

    public static int ToInt( this string str )
    {
        return Convert.ToInt32( str );
    }
}

根据您对时间字符串的预期一致性,您可以根据需要为上述代码添加更多验证。