Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Vb.net中的日期时间舍入到最接近的5分钟_.net_Vb.net_Visual Studio_Datetime_Visual Studio 2005 - Fatal编程技术网

如何将Vb.net中的日期时间舍入到最接近的5分钟

如何将Vb.net中的日期时间舍入到最接近的5分钟,.net,vb.net,visual-studio,datetime,visual-studio-2005,.net,Vb.net,Visual Studio,Datetime,Visual Studio 2005,我正在写一些数据分析软件,我想提高我的原始数据的时基。我的原始数据的时间步长约为20分钟。我希望以每小时、每天和每月5分钟的时间步长将数据扩展到几个数据库表中。我计划从原始数据中运行每一个,以保持准确性 我目前面临的问题是获取一个初始值,并找到我想要的最接近的“圆形”时间点,作为我的起点。例如,我将以13/03/12 00:01:36点作为起点,我希望代码找到13/03/12 00:00:00作为最近的时间点,以便从那里开始计算。对于每一个时间点,我想在每一边走一半的时间步。因此,12/03/1

我正在写一些数据分析软件,我想提高我的原始数据的时基。我的原始数据的时间步长约为20分钟。我希望以每小时、每天和每月5分钟的时间步长将数据扩展到几个数据库表中。我计划从原始数据中运行每一个,以保持准确性

我目前面临的问题是获取一个初始值,并找到我想要的最接近的“圆形”时间点,作为我的起点。例如,我将以13/03/12 00:01:36点作为起点,我希望代码找到13/03/12 00:00:00作为最近的时间点,以便从那里开始计算。对于每一个时间点,我想在每一边走一半的时间步。因此,12/03/12 23:57:30到13/03/12 00:02:29将成为13/03/12 00:00:00

数据是使用SQL查询从Access获取的,日期和值存储在两个并排的数组中。下面是到目前为止我的代码。它将把值四舍五入到接下来的5分钟,而不是向上或向下到最近的5毫秒

Private Sub RateStateScale(ByVal Parameter As Integer, ByVal Timebase As String)

    Dim NewDate(0)
    Dim NewData(0)
    Dim RecordCounter
    Dim MinValue As Date = ScaleDate(0)
    Dim startpoint As String

    For RecordCounter = 0 To ScaleDate.GetLength(0)
        If MinValue > ScaleDate(RecordCounter) Then
            MinValue = ScaleDate(RecordCounter)
        End If
    Next

    Do Until MinValue.Minute Mod 5 = 0
        MinValue = MinValue.AddMinutes(1)
    Loop



End Sub

感谢您的帮助

一种可能是:

var日期=新的日期时间(2012,03,12,23,57,30);
var fullFiveMinutes=日期。分钟/5;
//结果将是我们的日期四舍五入到之前的整整五分钟
var结果=新的日期时间(date.Year,date.Month,date.Day
日期。小时,整整五分钟*5,0);
//如果我们在日期变量中加上2.5分钟,结果表示
//我们还需要整整五分钟的时间。
如果(date.AddSeconds(2.5*60).Minute/5!=fullFiveMinutes)
结果=结果。添加分钟数(5);
这是C#代码,我相信你能翻译出来。

让我们试试VB的“四舍五入”功能:

' just some date, should be a parameter to your function
Dim mydatetime = new DateTime(2012,3,12,23,57,30)

' split into date + time parts
Dim datepart = mydatetime.Date
Dim timepart = mydatetime.TimeOfDay

' round time to the nearest 5 minutes
timepart = TimeSpan.FromMinutes(Math.Floor((timepart.TotalMinutes+2.5)/5.0) * 5.0)

' combine the parts
Dim newtime = datepart.Add(timepart)
' a function would return this value
你能做什么?(非常基本,但应该给出一个想法)


第一个数据点可能不在12/03/12 23:57:30,数据将来自几个不同的记录站点,在不同的时间启动和停止。起始点需要从数组中获取,因此循环将查找
min value
。代码中的注释还表示,
四舍五入到前一个完整的五分钟
,我希望代码四舍五入到最近的五分钟。@pezzz:请尝试一下。如果您只看到第一条注释,那么您没有阅读整个代码<代码>12/03/12 23:57:30将四舍五入为
12/03/13 00:00:00
。不需要使用数组中的任何内容,因为您只需要四舍五入到最接近的五分钟。@Blam,当我第一次查看代码时,它与现在的情况不同,共有3行,以var开头,一条注释,然后是if语句。他在编辑中修改了它。@pezzz:错了。我只是改变了语法的颜色。你可以在报纸上看到,怎么样
Dim tValue As Date = ScaleDate(0) 

'find the next highest 5 minute mark
For RecordCounter = 0 To ScaleDate.GetLength(0)              
    If tValue > ScaleDate(RecordCounter) Then                  
        tValue = ScaleDate(RecordCounter)              
    End If          
Next  

Do Until tValue.Minute Mod 5 = 0         
        tValue = tValue.AddMinutes(1)     
Loop

'compare the original value to the next highest.  If more than 2.5 minutes, then subtract 5 minutes
If DateDiff(DateInterval.Second, tValue, MinValue) > 150 Then
    MinValue = tValue.AddMinutes(-5)
Else
    MinValue = tValue
End If