Time 为什么';t时间序列计算负秒值的正确值?

Time 为什么';t时间序列计算负秒值的正确值?,time,vbscript,Time,Vbscript,只是面对VBScript中新的奇怪行为(或bug): 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

只是面对VBScript中新的奇怪行为(或bug):

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.
00:00:15

00:00:15可能值得使用不同的方法来提供秒的相对偏移量,您应该能够使用
DateAdd()
并传递
-15
来完成此操作,然后使用
TimeValue()
仅返回时间部分

Dim dt:dt=DateAdd(“s”,-15,时间序列(0,0,0))
WScript.Echo时间值(dt)
输出:

23:59:45

这是一个有趣的问题,它似乎是一个相对秒数的bug。快速测试在15分钟内循环24小时,每次减去15秒,结果除了
00:00:00
是正确的,所以午夜是一个奇怪的错误

选项显式
常数小时=24
常数分钟=60
常数最小偏移量=15
常数秒偏移量=-15
暗h、m、s
对于h=0到小时-1
对于m=0到分钟-1步最小偏移量
回音时间序列(h、m、s)
回音时间序列(h、m、秒偏移)
下一个
下一个
输出:

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/问题,但与您怀疑的部件无关

这里的问题是,将基础变量值转换为字符串的函数不能正确处理负数

但是,时间序列结果的值是正确的,但将其转换为字符串则不正确

如果提供有效的时间值,TimeSerial函数只承诺返回时间,因此0-23表示小时,0-59表示分和秒。如果您开始使用负数,那么最终会得到一个相对值,并且在将结果转换为字符串时,这部分显然没有得到正确处理

例如:

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

如您所见,返回的是负值,不是时间

我认为这只是字符串表示的问题。如果您将每个值转换为双精度,您会发现使用
(1,0,-15)
的值实际上是正确的,它只是被错误地转换为字符串。@LasseVågsætherKarlsen因此字符串转换中的错误,听起来似乎有道理。@LasseVågsætherKarlsen如上所述,
(1,0,-15)的结果
这不是问题,因为我可能复制了控制台输出。很抱歉。@maxyme我指的不是
1,0,-15
我指的是
0,0,-15
。不管怎样,
DateAdd()
都是一个解决方法。这是一项很好的检测工作,因此看起来在
时间
到字符串的转换中存在固有的缺陷。我猜底层值(子类型日期的变体)实际上存储了单个值,转换成字符串并不能很好地处理负值。是的,我相信这就是正在发生的事情。我认为这里的字符串转换只是为了支持时间值,而不是相对时间值,换句话说,我认为任何负值的结果目前都没有定义。@maxyme有助于使用
DateAdd()
,而不是解决同样的问题。甚至
TimeSerial(-1,0,0)
的结尾是
01:00:00
,这显然也是错误的。但是,如果将其添加到日期中,则从午夜返回一小时,
WScript.Echo(DateSerial(2019,7,8)+TimeSerial(-1,0,0))
给出了
07.07.2019 23:00:00
@Lankymart该解决方案不是必需的,是由于上面关于错误复制结果的评论,解决的问题不是实际问题,是由于复制/粘贴错误造成的。它无法解决将时间序列的负面结果正确转换为字符串的问题。对不起,我不是有意要击倒你。我的观点是,我认为选择时间序列作为开始是有原因的,这里使用负值也是有原因的。这个变通方法工作得很好,但与我的假设有所不同。本质上,如果你想让零下一小时变成23:00:00,时间就是