求一个关于时间的公式或函数?
求任意两个时间之间经过每一天的5点至10点这个时间段的总秒数的公式或函数?
期待您的完全解答,谢谢!
(区分任意两个时间的所有情况写一个函数或公式)
例一:
时间一2003-11-28 02:30:23到时间二2003-11-28 05:30:23经过每一天的5点至10点这个时间段的总秒数为1823秒
例二:
时间一2003-11-28 05:30:00到时间二2003-11-28 06:30:00经过每一天的5点至10点这个时间段的总秒数为3600秒
例三:
时间一2003-11-26 05:00:00到时间二2003-11-28 06:30:00经过每一天的5点至10点这个时间段的总秒数为23400秒
...还有更多情况
问题点数:100、回复次数:17Top
1 楼szyhy810518()()回复于 2003-12-02 14:26:08 得分 0
没看懂?Top
2 楼yesyou888()回复于 2003-12-02 14:36:52 得分 0
就是写一个分段计费的算法!上面是计算任意两个时间之间经过每一天的某个时间段的总秒数!
例子已经够清楚了!Top
3 楼hhjjhjhj(大头)(http://office.9zp.com)回复于 2003-12-02 14:50:18 得分 0
一共才4种情况
t=5点至10点的全部秒数
d=时间二-时间一的天数
case 时间一的时间>5点 AND 时间二的时间<10点
SUMT=(时间二的时间-时间一的时间)+t*d
case 时间一的时间>5点 AND 时间二的时间>10点
SUMT=(10点的时间-时间一的时间)+t*d
case 时间一的时间<5点 AND 时间二的时间<10点
SUMT=(时间二的时间-5点的时间)+t*d
case 时间一的时间<5点 AND 时间二的时间>10点
SUMT=t+t*d
Top
4 楼yesyou888()回复于 2003-12-02 15:04:48 得分 0
如果不是5点和10点是任意的两个点也是一样的吗?你能写一个函数吗?如果测试正确马上给分!Top
5 楼lxcc()回复于 2003-12-02 15:18:47 得分 0
Private Sub Command1_Click()
MsgBox DateDiff("s", CDate("2003-12-01 05:00:00"), CDate("2003-12-02 10:00:00"))
End Sub
Top
6 楼lxcc()回复于 2003-12-02 15:20:05 得分 0
只要日期时间格式和值合法,均可计算差值,具体查MSDN的datediff函数Top
7 楼yesyou888()回复于 2003-12-02 15:52:44 得分 0
不是lxcc(虫子) 的意思
hhjjhjhj(大头) 方法是对的!但没有完全解答!
Top
8 楼victorycyz(--)回复于 2003-12-02 15:57:42 得分 0
先不要结,待我给你写一下。思路简单,就是有些罗嗦。Top
9 楼lxcc()回复于 2003-12-02 15:59:24 得分 0
sorry!没看清!Top
10 楼szyhy810518()()回复于 2003-12-02 16:04:28 得分 100
Private Function PartTime_lng(dtmST As Date, dtmET As Date) As Long
Dim lngDay As Long
Dim lngTempST5 As Long
Dim lngTempET5 As Long
Dim lngTempST10 As Long
Dim lngTempET10 As Long
Dim lngTemp As Long
Dim lngPart As Long
Dim dtmTime As Date
Dim dtmTempST As Date
Dim dtmTempET As Date
If DateDiff("s", dtmST, dtmET) < 0 Then
lngDay = DateDiff("d", dtmST, dtmET)
dtmTempST = Format(dtmST, "HH:mm:ss")
dtmTempET = Format(dtmET, "HH:mm:ss")
lngPart = DateDiff("s", "05:00:00", "10:00:00")
lngTemp = DateDiff("s", dtmTempST, dtmTempET)
lngTempST5 = DateDiff("s", dtmTempST, "05:00:00")
lngTempET5 = DateDiff("s", dtmTempET, "05:00:00")
lngTempST10 = DateDiff("s", dtmTempST, "10:00:00")
lngTempET10 = DateDiff("s", dtmTempET, "10:00:00")
If lngTempST5 <= 0 And lngTempST10 >= 0 Then
If lngTempET5 <= 0 And lngTempET10 >= 0 Then
PartTime_lng = lngTemp + lngDay * lngPart
ElseIf lngTempET5 > 0 And lngTempET10 >= 0 Then
PartTime_lng = lngTempST10 + (lngDay - 1) * lngPart
ElseIf lngTempET5 <= 0 And lngTempET10 < 0 Then
PartTime_lng = lngTempST10 + lngDay * lngPart
End If
ElseIf lngTempST5 > 0 And lngTempST10 >= 0 Then
If lngTempET5 <= 0 And lngTempET10 >= 0 Then
PartTime_lng = Abs(lngTempET5) + lngDay * lngPart
ElseIf lngTempET5 > 0 And lngTempET10 >= 0 Then
PartTime_lng = lngDay * lngPart
ElseIf lngTempET5 <= 0 And lngTempET10 < 0 Then
PartTime_lng = (lngDay + 1) * lngPart
End If
ElseIf lngTempST5 <= 0 And lngTempST10 < 0 Then
If lngTempET5 <= 0 And lngTempET10 >= 0 Then
PartTime_lng = Abs(lngTempET5) + (lngDay - 1) * lngPart
ElseIf lngTempET5 > 0 And lngTempET10 >= 0 Then
PartTime_lng = (lngDay - 1) * lngPart
ElseIf lngTempET5 <= 0 And lngTempET10 < 0 Then
PartTime_lng = lngDay * lngPart
End If
End If
Else '开始时间大于结束时间
PartTime_lng = -1 '统一赋值为-1
End If
End Function
Top
11 楼yesyou888()回复于 2003-12-02 16:15:14 得分 0
最好将5点-10点(指每一天的)变为两个参数!再写一个函数!测试正确后马上给分!Top
12 楼Maconel(Maconel)回复于 2003-12-02 16:18:41 得分 0
hhjjhjhj(大头) 的四种情况外还有别的,因为还有日期
就是比如昨天的4:00到后天的11:00等等,所以要先判断 if 时间二 - 时间一>24小时Top
13 楼szyhy810518()()回复于 2003-12-02 16:23:10 得分 0
昏,这还要写两个参数,建议楼主你自己搞定!!
Top
14 楼planetike(胜哥哥)回复于 2003-12-02 16:36:03 得分 0
DateDiff就行,你自己参考一下MSDNTop
15 楼victorycyz(--)回复于 2003-12-02 16:40:29 得分 0
Private Function GetSeconds(dtStart As Date, dtEnd As Date) As Long
Dim lSeconds As Long
Dim intDay As Integer
intDay = DateDiff("d", dtStart, dtEnd)
If intDay = 0 Then '起止时间在同一天
lSeconds = IIf(DatePart("h", dtEnd) > 10, 36000, Seconds(dtEnd)) - IIf(DatePart("h", dtStart) < 5, 18000, Seconds(dtStart))
GetSeconds = IIf(lSeconds < 0, 0, lSeconds) '这是考虑到起止时间没有经过5到10点的情况。
Else
lSeconds = IIf(DatePart("h", dtEnd) > 10, 36000, Seconds(dtEnd)) - 18000
GetSeconds = IIf(lSeconds < 0, 0, lSeconds)
lSeconds = 36000 - IIf(DatePart("h", dtStart) < 5, 18000, Seconds(dtStart))
GetSeconds = GetSeconds + IIf(lSeconds < 0, 0, lSeconds)
If intDay > 2 Then '如果跨2天以上的日期,中间的日期的秒数是固定的:
GetSeconds = GetSeconds + 18000 * (intDay - 2)
End If
End If
End Function
'取得某个时间点从零点开始经过的秒数
Private Function Seconds(dtTime As Date) As Long
Seconds = DatePart("h", dtTime) * 3600 + DatePart("n", dtTime) * 60 + DatePart("s", dtTime)
End Function
Top
16 楼Random(随便)回复于 2003-12-02 16:42:31 得分 0
Public Function GetSecond(ByVal StartTime As Date, EndTime As Date) As Long
Dim TmpTime As Date
Dim StartDate As String, EndDate As String
Dim lngSec1 As Long, lngSec2 As Long
If EndTime < StartTime Then
TmpTime = StartTime
StartTime = EndTime
EndTime = TmpTime
End If
StartDate = Format(StartTime, "YYYY-M-D")
EndDate = Format(EndTime, "YYYY-M-D")
If CDate(StartDate & " 05:00:00") > StartTime Then
lngSec1 = 18000
ElseIf CDate(StartDate & " 10:00:00") < StartTime Then
lngSec1 = 0
Else
lngSec1 = DateDiff("s", StartTime, CDate(StartDate & " 10:00:00"))
End If
If CDate(EndDate & " 05:00:00") > EndTime Then
lngSec2 = 0
ElseIf CDate(EndDate & " 10:00:00") < EndTime Then
lngSec2 = 18000
Else
lngSec2 = DateDiff("s", CDate(EndDate & " 05:00:00"), EndTime)
End If
GetSecond = 18000 * (DateDiff("d", StartTime, EndTime) - 1) + lngSec1 + lngSec2
End Function
Top
17 楼liyd1978(阿东)回复于 2003-12-02 16:48:01 得分 0
不明白为什么不用 DateDiff 函数。
Top




