如何计算存储的DateTime.Now与当前DateTime.Now?

时间:2015-06-19 12:27:52

标签: c# .net winforms datetime

我有一个全局变量,我得到了DateTime.Now,一旦我点击一个按钮:

dt = DateTime.Now;

然后在我正在做的progresschanged事件中:

var currentTime = DateTime.Now;

现在我需要以秒为单位计算currentTime和存储时间(dt)之间的差异。然后我需要以秒为单位除以BytesSent。

这是我正在使用的progresschanged事件:

double mbSent = 0;
        int percentComplete = 0;
        static string progress = "";
        static string ttt = "";
        private void videosInsertRequest_ProgressChanged(IUploadProgress obj)
        {
            stringProgressReport[1] = obj.Status.ToString();
            backgroundWorker1.ReportProgress(0, 1);
            mbSent = ((double)obj.BytesSent) / (1 << 20);
            stringProgressReport[2] = mbSent.ToString();
            backgroundWorker1.ReportProgress(0, 2);
            percentComplete = (int)Math.Round(((double)obj.BytesSent) / totalBytes * 100);
            stringProgressReport[3] = percentComplete.ToString();
            backgroundWorker1.ReportProgress(0, 3);
            var currentTime = DateTime.Now;
         }

在事件的底部,我需要进行计算,这样我就可以报告平均速度。文件上传速度。

修改

我在做的时候会遇到异常:

var currentTime = DateTime.Now;
TimeSpan diff = currentTime - dt;
int diffSeconds = (int)diff.TotalSeconds;
long averageSpeed = obj.BytesSent / diffSeconds;

obj.BytesSent和diffSeconds都是0所以我得到的异常不能在averageSpeed上除以零。

为什么diffSeconds为0?试图计算dt和currentTime之间的时差。

修改

这就是我现在所做的:

if (obj.BytesSent != 0)
            {
                var currentTime = DateTime.Now;
                TimeSpan diff = currentTime - dt;
                var diffSeconds = (DateTime.Now - dt).TotalSeconds;
                long averageSpeed = diffSeconds != 0 ? obj.BytesSent / diffSeconds : 0L;
                double MBunits = ConvertBytesToMegabytes(averageSpeed);
                stringProgressReport[4] = MBunits.ToString();
                backgroundWorker1.ReportProgress(0, 4);
            }

但现在在long averageSpeed转换类型double到long时会出现错误。

这是我用来转换为MegaBytes的方法:

static double ConvertBytesToMegabytes(long bytes)
        {
            return (bytes / 1024f) / 1024f;
        }

在backgroundworker progresschanged事件中:

label8.Text = stringProgressReport[4];

如何向用户展示更好的内容?比如速度:

平均速度为:0.5 MB / s,然后是0.9 MB / s,然后是1.6 MB / s,这种格式或更好的东西。

3 个答案:

答案 0 :(得分:3)

您可以简单地减去两个DateTime个对象:

TimeSpan diff = currentTime - dt;
int diffSeconds = (int) diff.TotalSeconds;

答案 1 :(得分:2)

var elapedSeconds = (DateTime.Now-dt).TotalSeconds;

答案 2 :(得分:0)

您需要一些防御性编程来防止异常:

var diffSeconds = (DateTime.Now - dt).TotalSeconds;
long averageSpeed = diffSeconds !=0 ? obj.BytesSent / diffSeconds : 0L;