Почему TimeSerial не вычисляет правильное значение для отрицательного второго значения? - PullRequest
1 голос
/ 08 июля 2019

Просто сталкиваемся с новым странным поведением (или ошибкой) в 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.

Почему такой неожиданный вывод?

Справка только говорит:

Однако вы также можете указать относительное время для каждого аргумента, используя любое числовое выражение, представляющее некоторое количество часов, минут или секунд до или после определенного времени.

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Здесь есть ошибка / проблема, но не с той частью, которую вы подозреваете.

Проблема здесь в том, что функция, которая преобразует базовое значение варианта в строку, неправильно обрабатывает отрицательные числа.

Значение результата TimeSerial, однако, является правильным, но преобразование его в строку - нет.

Функция 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

Как видите, вы получаете отрицательное значение, не время .

0 голосов
/ 08 июля 2019

Возможно, стоит использовать другой метод для предоставления относительного смещения для секунд, вы должны быть в состоянии сделать это, используя DateAdd() и передав -15, затем используйте TimeValue(), чтобы вернуть только часть времени.

Dim dt: dt = DateAdd("s", -15, TimeSerial(0, 0, 0))
WScript.Echo TimeValue(dt)

Выход:

23:59:45

Это интересный вопрос, который кажется ошибкой с относительными секундами. Был ли быстрый тест, который проходит через 24 часа в 15-минутные периоды и вычитает 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...