为什么 TimeSerial 不计算负秒值的正确值?
Why doesn't TimeSerial compute a correct value for negative second value?
VBScript 中出现了一个新的奇怪行为(或错误):
WScript.Echo TimeSerial(0, 0, 15)
WScript.Echo TimeSerial(0, 0, -15)
WScript.Echo TimeSerial(1, 0, 15)
WScript.Echo TimeSerial(1, 0, -15)
WScript.Echo TimeSerial(1, 1, 15)
WScript.Echo TimeSerial(1, 1, -15)
输出:
00:00:15
00:00:15 <- shouldn't be 23:59:45?
01:00:15
00:59:45 <- OK.
01:01:15
01:00:45 <- OK.
为什么会有这样意外的输出?
帮助只说:
However, you can also specify relative times for each argument using any numeric expression that represents some number of hours, minutes, or seconds before or after a certain time.
可能值得使用不同的方法来提供秒的相对偏移量,您应该能够使用 DateAdd()
并传递 -15
然后使用 TimeValue()
来完成此操作return只是时间部分。
Dim dt: dt = DateAdd("s", -15, TimeSerial(0, 0, 0))
WScript.Echo TimeValue(dt)
输出:
23:59:45
这是一个有趣的问题,它似乎确实是一个相对秒数的错误。是否进行了以 15 分钟为周期循环 24 小时并每次减去 15 秒的快速测试,除 00:00:00
之外的结果是正确的,所以午夜出现了一个奇怪的错误?
Option Explicit
Const hours = 24
Const minutes = 60
Const min_offset = 15
Const sec_offset = -15
Dim h, m, s
For h = 0 To hours - 1
For m = 0 To minutes - 1 Step min_offset
WScript.Echo TimeSerial(h, m, s)
WScript.Echo TimeSerial(h, m, sec_offset)
Next
Next
输出:
00:00:00
00:00:15
00:15:00
00:14:45
00:30:00
00:29:45
00:45:00
00:44:45
01:00:00
00:59:45
01:15:00
01:14:45
01:30:00
01:29:45
01:45:00
01:44:45
02:00:00
01:59:45
02:15:00
02:14:45
02:30:00
02:29:45
02:45:00
02:44:45
03:00:00
02:59:45
03:15:00
03:14:45
03:30:00
03:29:45
03:45:00
03:44:45
04:00:00
03:59:45
04:15:00
04:14:45
04:30:00
04:29:45
04:45:00
04:44:45
05:00:00
04:59:45
05:15:00
05:14:45
05:30:00
05:29:45
05:45:00
05:44:45
06:00:00
05:59:45
06:15:00
06:14:45
06:30:00
06:29:45
06:45:00
06:44:45
07:00:00
06:59:45
07:15:00
07:14:45
07:30:00
07:29:45
07:45:00
07:44:45
08:00:00
07:59:45
08:15:00
08:14:45
08:30:00
08:29:45
08:45:00
08:44:45
09:00:00
08:59:45
09:15:00
09:14:45
09:30:00
09:29:45
09:45:00
09:44:45
10:00:00
09:59:45
10:15:00
10:14:45
10:30:00
10:29:45
10:45:00
10:44:45
11:00:00
10:59:45
11:15:00
11:14:45
11:30:00
11:29:45
11:45:00
11:44:45
12:00:00
11:59:45
12:15:00
12:14:45
12:30:00
12:29:45
12:45:00
12:44:45
13:00:00
12:59:45
13:15:00
13:14:45
13:30:00
13:29:45
13:45:00
13:44:45
14:00:00
13:59:45
14:15:00
14:14:45
14:30:00
14:29:45
14:45:00
14:44:45
15:00:00
14:59:45
15:15:00
15:14:45
15:30:00
15:29:45
15:45:00
15:44:45
16:00:00
15:59:45
16:15:00
16:14:45
16:30:00
16:29:45
16:45:00
16:44:45
17:00:00
16:59:45
17:15:00
17:14:45
17:30:00
17:29:45
17:45:00
17:44:45
18:00:00
17:59:45
18:15:00
18:14:45
18:30:00
18:29:45
18:45:00
18:44:45
19:00:00
18:59:45
19:15:00
19:14:45
19:30:00
19:29:45
19:45:00
19:44:45
20:00:00
19:59:45
20:15:00
20:14:45
20:30:00
20:29:45
20:45:00
20:44:45
21:00:00
20:59:45
21:15:00
21:14:45
21:30:00
21:29:45
21:45:00
21:44:45
22:00:00
21:59:45
22:15:00
22:14:45
22:30:00
22:29:45
22:45:00
22:44:45
23:00:00
22:59:45
23:15:00
23:14:45
23:30:00
23:29:45
23:45:00
23:44:45
这里有一个 bug/issue,但不是您怀疑的部分。
这里的问题是将基础变量值转换为字符串的函数无法正确处理负数。
然而,TimeSerial 结果的 value 是正确的,但将其转换为字符串则不是。
如果您提供 有效 时间值,TimeSerial 函数只承诺 return 是一个时间 的东西,所以 0 -23 代表小时,0-59 代表分钟和秒。如果您开始使用负数,您最终会得到一个 relative 值,并且在将结果转换为字符串时,这部分显然没有正确处理。
举个例子:
WScript.Echo CDbl(TimeSerial(1, 0, -15))*24
WScript.Echo 1-15/(60*60)
给出相同的输出:
0,995833333333333
0,995833333333333
让我们加入你想要的时间:
WScript.Echo CDbl(TimeSerial(0, 59, 45))*24
这也给出了:
0,995833333333333
你的第二个例子:
WScript.Echo CDbl(TimeSerial(0, 0, -15))*24
WScript.Echo -15/(60*60)
给出:
-4,16666666666667E-03
-4,16666666666667E-03
如您所见,您得到一个负值,不是时间。
VBScript 中出现了一个新的奇怪行为(或错误):
WScript.Echo TimeSerial(0, 0, 15)
WScript.Echo TimeSerial(0, 0, -15)
WScript.Echo TimeSerial(1, 0, 15)
WScript.Echo TimeSerial(1, 0, -15)
WScript.Echo TimeSerial(1, 1, 15)
WScript.Echo TimeSerial(1, 1, -15)
输出:
00:00:15
00:00:15 <- shouldn't be 23:59:45?
01:00:15
00:59:45 <- OK.
01:01:15
01:00:45 <- OK.
为什么会有这样意外的输出?
帮助只说:
However, you can also specify relative times for each argument using any numeric expression that represents some number of hours, minutes, or seconds before or after a certain time.
可能值得使用不同的方法来提供秒的相对偏移量,您应该能够使用 DateAdd()
并传递 -15
然后使用 TimeValue()
来完成此操作return只是时间部分。
Dim dt: dt = DateAdd("s", -15, TimeSerial(0, 0, 0))
WScript.Echo TimeValue(dt)
输出:
23:59:45
这是一个有趣的问题,它似乎确实是一个相对秒数的错误。是否进行了以 15 分钟为周期循环 24 小时并每次减去 15 秒的快速测试,除 00:00:00
之外的结果是正确的,所以午夜出现了一个奇怪的错误?
Option Explicit
Const hours = 24
Const minutes = 60
Const min_offset = 15
Const sec_offset = -15
Dim h, m, s
For h = 0 To hours - 1
For m = 0 To minutes - 1 Step min_offset
WScript.Echo TimeSerial(h, m, s)
WScript.Echo TimeSerial(h, m, sec_offset)
Next
Next
输出:
00:00:00
00:00:15
00:15:00
00:14:45
00:30:00
00:29:45
00:45:00
00:44:45
01:00:00
00:59:45
01:15:00
01:14:45
01:30:00
01:29:45
01:45:00
01:44:45
02:00:00
01:59:45
02:15:00
02:14:45
02:30:00
02:29:45
02:45:00
02:44:45
03:00:00
02:59:45
03:15:00
03:14:45
03:30:00
03:29:45
03:45:00
03:44:45
04:00:00
03:59:45
04:15:00
04:14:45
04:30:00
04:29:45
04:45:00
04:44:45
05:00:00
04:59:45
05:15:00
05:14:45
05:30:00
05:29:45
05:45:00
05:44:45
06:00:00
05:59:45
06:15:00
06:14:45
06:30:00
06:29:45
06:45:00
06:44:45
07:00:00
06:59:45
07:15:00
07:14:45
07:30:00
07:29:45
07:45:00
07:44:45
08:00:00
07:59:45
08:15:00
08:14:45
08:30:00
08:29:45
08:45:00
08:44:45
09:00:00
08:59:45
09:15:00
09:14:45
09:30:00
09:29:45
09:45:00
09:44:45
10:00:00
09:59:45
10:15:00
10:14:45
10:30:00
10:29:45
10:45:00
10:44:45
11:00:00
10:59:45
11:15:00
11:14:45
11:30:00
11:29:45
11:45:00
11:44:45
12:00:00
11:59:45
12:15:00
12:14:45
12:30:00
12:29:45
12:45:00
12:44:45
13:00:00
12:59:45
13:15:00
13:14:45
13:30:00
13:29:45
13:45:00
13:44:45
14:00:00
13:59:45
14:15:00
14:14:45
14:30:00
14:29:45
14:45:00
14:44:45
15:00:00
14:59:45
15:15:00
15:14:45
15:30:00
15:29:45
15:45:00
15:44:45
16:00:00
15:59:45
16:15:00
16:14:45
16:30:00
16:29:45
16:45:00
16:44:45
17:00:00
16:59:45
17:15:00
17:14:45
17:30:00
17:29:45
17:45:00
17:44:45
18:00:00
17:59:45
18:15:00
18:14:45
18:30:00
18:29:45
18:45:00
18:44:45
19:00:00
18:59:45
19:15:00
19:14:45
19:30:00
19:29:45
19:45:00
19:44:45
20:00:00
19:59:45
20:15:00
20:14:45
20:30:00
20:29:45
20:45:00
20:44:45
21:00:00
20:59:45
21:15:00
21:14:45
21:30:00
21:29:45
21:45:00
21:44:45
22:00:00
21:59:45
22:15:00
22:14:45
22:30:00
22:29:45
22:45:00
22:44:45
23:00:00
22:59:45
23:15:00
23:14:45
23:30:00
23:29:45
23:45:00
23:44:45
这里有一个 bug/issue,但不是您怀疑的部分。
这里的问题是将基础变量值转换为字符串的函数无法正确处理负数。
然而,TimeSerial 结果的 value 是正确的,但将其转换为字符串则不是。
如果您提供 有效 时间值,TimeSerial 函数只承诺 return 是一个时间 的东西,所以 0 -23 代表小时,0-59 代表分钟和秒。如果您开始使用负数,您最终会得到一个 relative 值,并且在将结果转换为字符串时,这部分显然没有正确处理。
举个例子:
WScript.Echo CDbl(TimeSerial(1, 0, -15))*24
WScript.Echo 1-15/(60*60)
给出相同的输出:
0,995833333333333
0,995833333333333
让我们加入你想要的时间:
WScript.Echo CDbl(TimeSerial(0, 59, 45))*24
这也给出了:
0,995833333333333
你的第二个例子:
WScript.Echo CDbl(TimeSerial(0, 0, -15))*24
WScript.Echo -15/(60*60)
给出:
-4,16666666666667E-03
-4,16666666666667E-03
如您所见,您得到一个负值,不是时间。