If statement 无法在VBScript中的If语句中正常组合条件

If statement 无法在VBScript中的If语句中正常组合条件,if-statement,vbscript,multiple-conditions,If Statement,Vbscript,Multiple Conditions,我想确定是不是在凌晨12点到1点之间。以下是我的if声明: If InStr(Time,"12") AND InStr(Time,"AM") Then ' Do something Else ' Do something else End If 问题是,即使这两个条件都为true,该语句的计算结果也是false。我知道这一点,因为我尝试过这样的嵌套if If InStr(Time,"12") Then If InStr(Time,"AM") Then

我想确定是不是在凌晨12点到1点之间。以下是我的if声明:

If InStr(Time,"12") AND InStr(Time,"AM") Then 
    ' Do something
Else
    ' Do something else
End If
问题是,即使这两个条件都为true,该语句的计算结果也是false。我知道这一点,因为我尝试过这样的嵌套if

If InStr(Time,"12") Then
    If InStr(Time,"AM") Then
        ' Do something
...
这就行了。这同样有效

If InStr(Time,"12")<>0 AND InStr(Time,"AM")<>0 Then
    ' Do something
...
同样的事情也发生了:if语句被计算为false,而“dosomething”命令被执行。但是,当我将第二个条件嵌套为第一个if语句中的另一个if语句时,执行了“dosomething”命令


这是为什么?没有0和嵌套有什么方法可以做到这一点吗?

如果Time()>=TimeValue(“12:00:00”)和Time()
如果Time()>=TimeValue(“12:00:00”)和Time()您观察到的问题是由VBScript对布尔运算和位运算使用相同的运算符引起的,取决于操作数的数据类型。除非其中一个字符串为
Null
,否则该函数将返回一个数值,因此该操作将变为按位比较,而不是布尔比较,如前所述。这种行为是:

If Time() >= TimeValue("12:00:00") AND Time() <= TimeValue("23:59:59") then 
   'Do Something
ElseIf  Time() >= TimeValue("00:00:00") AND Time() <= TimeValue("01:00:00") then 
   'Do the same 
Else
   'Do something different
End If
运算符还对两个数值表达式中相同位置的位执行逐位比较,并在
结果中设置相应位
[…]

演示:

>>> WScript.Echo "" & (True And True) True >>> WScript.Echo "" & (6 And 1) '0b0110 && 0b0001 ⇒ 0b0000 0 >>> WScript.Echo "" & (6 And 2) '0b0110 && 0b0010 ⇒ 0b0010 2 >>>WScript.Echo“”&(True和True) 符合事实的 >>>WScript.Echo“”&(6和1)'0b0110&&0b0001⇒ 0b0000 0 >>>WScript.Echo“”&(6和2)'0b0110&&0b0010⇒ 0b0010 2.
要强制执行布尔比较,您需要使用
InStr(…)>0
CBool(InStr(…)
(两者的计算结果均为布尔结果),而不仅仅是
InStr(…)
(计算结果为数字结果).

您观察到的问题是由于VBScript根据操作数的数据类型,对布尔运算和位运算使用相同的运算符。除非其中一个字符串为
Null
,否则该函数将返回一个数值,因此该操作将变为按位比较,而不是布尔比较,如前所述。这种行为是:

运算符还对两个数值表达式中相同位置的位执行逐位比较,并在
结果中设置相应位
[…]

演示:

>>> WScript.Echo "" & (True And True) True >>> WScript.Echo "" & (6 And 1) '0b0110 && 0b0001 ⇒ 0b0000 0 >>> WScript.Echo "" & (6 And 2) '0b0110 && 0b0010 ⇒ 0b0010 2 >>>WScript.Echo“”&(True和True) 符合事实的 >>>WScript.Echo“”&(6和1)'0b0110&&0b0001⇒ 0b0000 0 >>>WScript.Echo“”&(6和2)'0b0110&&0b0010⇒ 0b0010 2.
要执行布尔比较,您需要使用
InStr(…)>0
CBool(InStr(…)
(两者的计算结果均为布尔结果),而不仅仅是
InStr(…)
(计算结果为数字结果)。

日期和时间存储为,其中午夜为0.0,凌晨1点为1/24:

If Time <= 1/24 Then       ' or If Time <= #1am# Then

如果时间日期和时间存储为,其中午夜为0.0,凌晨1点为1/24:

If Time <= 1/24 Then       ' or If Time <= #1am# Then
If Time当您使用
Time()时
函数,如果这样的结果
10:12:12 AM
,则
Instr
将产生
Ture
,因为
Instr
默认情况下使用
vbbinarycompare
10:12:12 AM
中查找二进制格式的任何
12
,并且有秒和分12,因此它将返回True。 试试这个:

  myHour=replace(Time,Right(Time,9),"")     'get only the hour from time
  myAMPM=replace(Time,Time,Right(Time,2))     'get only AM or PM from time
    If InStr(1,myHour,12,1) > 0 AND InStr(1,myAMPM,"AM",1) > 0 Then 
       wscript.echo "True"
    Else
      wscript.echo "False"
    End If
使用
Time()时
函数,如果这样的结果
10:12:12 AM
,则
Instr
将产生
Ture
,因为
Instr
默认情况下使用
vbbinarycompare
10:12:12 AM
中查找二进制格式的任何
12
,并且有秒和分12,因此它将返回True。 试试这个:

  myHour=replace(Time,Right(Time,9),"")     'get only the hour from time
  myAMPM=replace(Time,Time,Right(Time,2))     'get only AM or PM from time
    If InStr(1,myHour,12,1) > 0 AND InStr(1,myAMPM,"AM",1) > 0 Then 
       wscript.echo "True"
    Else
      wscript.echo "False"
    End If

如果x和y
中的
运算符对两个数值表达式中相同位置的位执行逐位比较。如果x*y
的值等于0,则应用
,反之亦然。谢谢,这很奇怪,但我想这是有道理的。如果您将此作为答案,我会将其标记为答案
Instr
不返回
True
False
。它返回搜索字符串第一次出现的位置,如果未找到,则返回
0
。也许这让你感到困惑?对,这就是我的观点,
Instr
不返回布尔值,而是返回整数。问题是VBScript对布尔值和位运算使用相同的运算符,具体取决于操作数的数据类型。这种行为是不公平的。要强制执行布尔比较,您需要使用
InStr(…)>0
CBool(InStr(…)
(两者的计算结果均为布尔结果),而不仅仅是
InStr(…)
(计算结果为数字结果)。如果x和y
中的
运算符对两个数值表达式中相同位置的位执行逐位比较。如果x*y
的值等于0,则应用
,反之亦然。谢谢,这很奇怪,但我想这是有道理的。如果您将此作为答案,我会将其标记为答案
Instr
不返回
True
False
。它返回搜索字符串第一次出现的位置,如果未找到,则返回
0
。也许这让你感到困惑?对,这就是我的观点,
Instr
不返回布尔值,而是返回整数。问题是VBScript对布尔值和位运算使用相同的运算符,具体取决于操作数的数据类型。这种行为是不公平的。要执行布尔比较,您需要使用
InStr(…)>0
CBool(InStr(…)
(两者的计算结果均为布尔结果),而不仅仅是
InStr(…)
(计算结果为数字结果)。第一个条件是什么,OP要求的时间是上午12点到凌晨1点,而不是下午12点到晚上11:59:59?如果不是因为两件事,我会将此标记为答案:1)虽然这会起作用,但这是一个更复杂的问题