3

以下代码中的 long 数据类型有什么问题,它返回 -666167296,time=42 和 TimeStyle.Days?

    private long ConvertToMilliSeconds(int time, TimeStyle style)
    {
        long t = 0;
        switch (style)
        {
            case TimeStyle.Millisecons:
                t = time;
                break;
            case TimeStyle.Seconds:
                t = time * 1000;
                break;
            case TimeStyle.Minutes:
                t = time * 1000 * 60;
                break;
            case TimeStyle.Hours:
                t = time * 1000 * 60 * 60;
                break;
            case TimeStyle.Days:
                t = time * 86400000;
                break;
            default:
                break;
        }

        return t;
    }
4

3 回答 3

7

timeint, make it longor cast to longor* 86400000L

于 2012-08-03T07:57:13.183 回答
3

当您进行这样的计算时:

t = time * 86400000

t这是 a的事实long是无关紧要的:赋值运算符右侧的算术以 32 位执行,因为time86400000都是int值。您需要在long算术中执行操作以避免溢出。

考虑到long毫秒数是合理的,我只想更改tlong. 如果无法识别枚举值,我也会抛出异常,而不仅仅是返回 0:

private static long ConvertToMilliSeconds(long time, TimeStyle style)
{
    switch (style)
    {
        // Note: fixed typo in enum name
        case TimeStyle.Milliseconds: return time;
        case TimeStyle.Seconds:      return time * 1000;
        case TimeStyle.Minutes:      return time * 1000 * 60;
        case TimeStyle.Hours:        return time * 1000 * 60 * 60;
        case TimeStyle.Days:         return time * 86400000;
        default:
            throw new ArgumentOutOfRangeException("style");
    }
}

您可能还想将这些值更改为常量:

private const long MillisecondsPerSecond = 1000;
private const long MillisecondsPerMinute = MillisecondsPerSecond * 60;
private const long MillisecondsPerHour = MillisecondsPerMinute * 60;
private const long MillisecondsPerDay = MillisecondsPerHour * 24;

...并在方法中使用它们。

最后,为了避免在错误单位中获得值时可能出现的任何混淆,您可能只想使用TimeSpan开头... 如果您仍然发现日期/时间 API 很痛苦,您可能需要查看在我的野田时间图书馆:)

于 2012-08-03T07:59:47.493 回答
0

42 * 86400000 太长了。如果我在visual-studio中输入它,我会得到一个编译器错误:

在检查模式下,操作在编译时溢出

于 2012-08-03T08:00:18.203 回答