猿问

如何将日期时间舍入到最接近的第 200 毫秒?

在我正在编写的 C#.Net 应用程序中,我希望将一些 DateTime 值四舍五入到最接近的第 200 毫秒。我想出了以下代码;


   public static DateTime RoundToTheTwoHundredthMillisecond(DateTime dt) {            

        var ms = dt.Millisecond;

        var s = dt.Second;

        var m = dt.Minute;

        var h = dt.Hour;

        var d = dt.Day;

        var M = dt.Month;

        var y = dt.Year;

        if (ms >= 900 && ms < 1000) ms = 1000; 

        if (ms >= 700 && ms < 900) ms = 800;

        if (ms >= 500 && ms < 700) ms = 600;

        if (ms >= 300 && ms < 500) ms = 400;

        if (ms >= 100 && ms < 300) ms = 200;

        if (ms >= 0 && ms < 100) ms = 0;


        // 1000 is an invalid millisecond. We need to round up a second. Use AddSeconds so it will automatically roll up should we be 1 second away from a new minute, 1 minute away from a new hour...etc...leap years and months are handled also....

        if (ms == 1000) {                

            return new DateTime(y, M, d, m, h, s, 0, dt.Kind).AddSeconds(1);

        } 

        else {

            return new DateTime(y, M, d, m, h, s, ms, dt.Kind);

        }                     

    }

我认为它可能有效。但是我想知道是否有人可以向我指出一种可能比我的摸索更可靠的方法?或者,也许,这是一个人会/应该为其编写单元测试的东西吗?(这样做似乎也容易引起我自己的摸索)


小唯快跑啊
浏览 138回答 2
2回答

largeQ

您可以只除以 200,四舍五入并乘以返回值。你也可以只减去原始的差异DateTime,不需要重建它的组件我的组件。public static DateTime RoundToTheTwoHundredthMillisecond(DateTime dt){&nbsp; &nbsp; var ms = Math.Round(dt.Millisecond / 200.0) * 200;&nbsp; &nbsp; return dt.AddMilliseconds(ms- dt.Millisecond);}编辑为了模仿if我们可以使用的确切序列MidpointRoundingpublic static DateTime RoundToTheTwoHundredthMillisecond(DateTime dt){&nbsp; &nbsp; var ms = Math.Round(dt.Millisecond / 200.0, MidpointRounding.ToEven) * 200;&nbsp; &nbsp; return dt.AddMilliseconds(ms- dt.Millisecond);}
随时随地看视频慕课网APP
我要回答