求一好的算法实现思路

wdthkyou 2007-10-24 10:38:15
问题描述:
1、任意给定两个日期date1,dat2(date1<=dat2,日期类型)。
2、任意给定初始时间点iH1和终止时间点iH2(只精确到小时),例如iH1=09,iH2=12。
3、小时间隔dH,dH取值为:1小时、3小时、6小时、12小时、24小时。
4、请按照时间顺序形成起止时段字符串存入二维动态数组SqlHH(cymd1,cymd2)中,cymd1、cymd2为

yyyymmddhh字符串格式。其中dH=1时,cymd1=cymd2;dH>1时,cymd2=cymd1+dH(这里用时间的数学加法

执行,请勿用字符串的加法。),下一次起止时间点满足cymd1=cymd2+1,cymd2=cymd1+dH。
5、小时取两位字符,不足两位时前面添"0",取值范围00,01,02,...,23。
例如date1=2007-10-23,date2=2007-10-24,iH1=10,iH2=08
(1)dH=1时,SqlHH(cymd1,cymd2)有
SqlHH("200710231010","200710231010")
SqlHH("200710231011","200710231011")
.....
SqlHH("200710241008","200710241008")
(2)dH=3时,SqlHH(cymd1,cymd2)有
SqlHH("200710231010","200710231013")
SqlHH("200710231014","200710231017")
.....

SqlHH("200710241002","200710241005")
SqlHH("200710241006","200710241008")
DH=6,12,24以此类推。
最近状态不好,这个问题把我弄糊涂了,请高手援手相助!非常感谢。
...全文
69 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdthkyou 2007-10-24
  • 打赏
  • 举报
回复
抱歉,多出了两位10,应该为:
(1)dH=1时,SqlHH(cymd1,cymd2)有
SqlHH("2007102310","2007102310")
SqlHH("2007102311","2007102311")
.....
SqlHH("2007102408","2007102408")
(2)dH=3时,SqlHH(cymd1,cymd2)有
SqlHH("2007102310","2007102313")
SqlHH("2007102314","2007102317")
.....

SqlHH("2007102402","2007102405")
SqlHH("2007102406","2007102408")
Tiger_Zhao 2007-10-24
  • 打赏
  • 举报
回复
200710231010
yyyymmddhh
格式和输出明显不匹配!
wdthkyou 2007-10-24
  • 打赏
  • 举报
回复
刚才忙其他事了,现修改好如下:
Private Sub T(ByVal date1 As Date, ByVal date2 As Date, ByVal iH1 As Integer, ByVal iH2 As Integer, ByVal DH As Integer)
Dim cymd1 As Date, cymd2 As Date
Dim iH As Long
cymd1 = date1 & " " & iH1 & ":00:00"
cymd2 = date2 & " " & iH2 & ":00:00"
iH2 = DateDiff("h", cymd1, cymd2) + iH1

For iH = iH1 To iH2 Step IIf(DH = 1, 1, DH + 1)
cymd1 = DateAdd("h", iH, date1)
If DH = 1 Then
cymd2 = cymd1
ElseIf iH + DH > iH2 Then
cymd2 = DateAdd("h", iH2, date1)
Else
cymd2 = DateAdd("h", DH, cymd1)
End If
Debug.Print Format$(cymd1, "yyyymmddhh"), Format$(cymd2, "yyyymmddhh")
Next
End Sub
dt1="2007-10-21":dt2="2007-10-24"
Call T(DT1, DT2, 9, 8, 6) 运行结果如下:
2007102109 2007102115
2007102116 2007102122
2007102123 2007102205
2007102206 2007102212
2007102213 2007102219
2007102220 2007102302
2007102303 2007102309
2007102310 2007102316
2007102317 2007102323
2007102400 2007102406
2007102407 2007102408
结贴了
Tiger_Zhao 2007-10-24
  • 打赏
  • 举报
回复
看例子
SqlHH("200710241002","200710241005")
SqlHH("200710241006","200710241008") <- 这里很明显对用结束时间进行了截尾,否则应该是 hh=09
如果不需要截尾将循环中的 ElseIf iH + DH > iH2 Then 分支删除就可以了。
wdthkyou 2007-10-24
  • 打赏
  • 举报
回复
dt1="2007-10-22":dt2="2007-10-24"
Call T(DT1, DT2, 9, 8, 6) 运行结果如下:
2007102209 2007102215
2007102216 2007102222
2007102223 2007102305
2007102306 2007102308 <-显然这里不符合要求,cymd2="2007102312"才对
2007102309 2007102315
2007102316 2007102322
2007102323 2007102405
2007102406 2007102408

我的思路比你还复杂,还没有完全实现,汉一个!谢谢楼上大虾,我在你的代码上试着修改一下,修改后再贴出来。
Tiger_Zhao 2007-10-24
  • 打赏
  • 举报
回复
Sub T(ByVal date1 As Date, ByVal date2 As Date, ByVal iH1 As Integer, ByVal iH2 As Integer, ByVal DH As Integer)
Dim dt As Date, cymd1 As Date, cymd2 As Date
Dim iH As Integer

If iH2 < iH1 Then iH2 = iH2 + 24

dt = date1
While dt < date2
For iH = iH1 To iH2 Step IIf(DH = 1, 1, DH + 1)
cymd1 = DateAdd("h", iH, dt)
If DH = 1 Then
cymd2 = cymd1
ElseIf iH + DH > iH2 Then
cymd2 = DateAdd("h", iH2, dt)
Else
cymd2 = DateAdd("h", DH, cymd1)
End If
Debug.Print Format$(cymd1, "yyyymmddhh"), Format$(cymd2, "yyyymmddhh")
Next

dt = DateAdd("d", 1, dt)
Wend
End Sub

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧