【问题标题】:Visual Basic 6.0 IF statement won't go through, only keeps going to ELSE statementVisual Basic 6.0 IF 语句不会通过,只会继续 ELSE 语句
【发布时间】:2021-06-21 07:24:49
【问题描述】:

我正在尝试使用 IF 语句比较 2 个日期,但似乎 Visual Basic 不会比较它们,因为我总是以我 Else 上的 msgbox 结束,这是我的代码:

If Format(theSysDT, "mm/dd/yyyy HH:MM:SS") > Format(CLParamDL, "mm/dd/yyyy HH:MM:SS") Then
        MsgBox ("theSysDt is greater than CLParamDL")
Else
        MsgBox ("error error")
End If

theSysDT: 06/21/2021, 15:22:35

CLParamDL:2017 年 9 月 21 日,17:02:00

我不知道为什么它不会进入 IF 语句。

【问题讨论】:

  • I'm trying to compare 2 dates - 不,您正在尝试比较两个字符串。鉴于您有两个日期开头(theSysDTCLParamDL),因此更不清楚为什么要在比较之前专门破坏它们。

标签: vb6


【解决方案1】:

假设 SysDT 和 CLParamDL 都是 Date 类型,那么只需比较它们而不尝试将它们转换为字符串:

If theSysDT > CLParamDL Then
    MsgBox ("theSysDt is greater than CLParamDL")
Else
    MsgBox ("error error")
End If

【讨论】:

    【解决方案2】:

    回答

    尝试使用格式yyyy/mm/dd 而不是mm/dd/yyyy,以便日期字符串可以按字典顺序排序。

    theSysDT: 06/21/2021, 15:22:35 -> 2021/06/21 15:22:35

    CLParamDL: 09/21/2017, 17:02:00 -> 2017/09/21 17:02:00

    If Format(theSysDT, "yyyy/mm/dd HH:MM:SS") > Format(CLParamDL, "yyyy/mm/dd HH:MM:SS") Then
        MsgBox ("theSysDt is greater than CLParamDL")
    Else
        MsgBox ("error error")
    End If
    

    附录:常见问题(关于此答案)

    为什么这个帖子是正确的答案?我们不应该直接比较两个日期吗?

    虽然看起来最初的问题是为了询问“如何比较两个日期”,但实际上并非如此。这是一个关于“如何canonicalize字符串格式的日期(因此可以使用普通的字符串比较运算符将其与其他值进行比较)”的问题。因此,这篇文章可以是被接受的正确答案。在这种情况下,直接显示比较两个日期的方法是没有意义的。

    原代码解读:

    一般来说,比较两个日期是通过直接比较两个日期来完成的,这是每个人都知道的(可能原始发布者也知道)。

    If theSysDT > CLParamDL Then
        MsgBox ("theSysDt is greater than CLParamDL")
    Else
        MsgBox ("error error")
    End If
    

    但是原来的代码不是这样写的,

    If Format(theSysDT, "mm/dd/yyyy HH:MM:SS") > Format(CLParamDL, "mm/dd/yyyy HH:MM:SS") Then
        MsgBox ("theSysDt is greater than CLParamDL")
    Else
        MsgBox ("error error")
    End If
    

    因为是minimal test code 来澄清问题,“为什么不能按预期比较日期-字符串”。代码清楚地显示了how date-strings are composedhow comparison is made。由于所有元素都(也)紧凑地打包在一个 IF 子句中,因此尝试使用字符串比较来比较两个日期看起来像是一个尴尬的代码。但这是一个有目的地设计的正确代码。通过不带偏见地看到原始问题来正确把握整个画面对我们来说很重要。

    【讨论】:

    • 将两个日期转换为两个字符串以进行比较是非常错误的建议。代码应该是If theSysDT > CLParamDL Then
    • 我完全同意@GSerg。它甚至不是String 比较,因为使用的Format 变体是Variant 变体,这可能会或可能不会导致正确比较。如果这两个日期可能是不同的类型,例如 VB Date 和 Win32 FILETIME 结构,最好将一个转换为另一个 (Win32 API SystemTimeToVariantTime) 并进行比较。
    • 没有错。对于minimal, reproducible example 的问题,我发布了一个使代码 sn-p 工作的最小建议。由于提问者问为什么带有字符串比较的IF 条件不能按预期工作,我指出字符串可能没有正确组合。虽然我知道在这种情况下直接比较日期值的可能性,但我选择了修改格式字符串的解决方案,尊重提问者的 will 使用Format() 函数和字符串比较。如果您有更好的解决方案,请发布。
    • @ardget:虽然您的回答技术上是正确的,但它会强化坏习惯。我认为 SO 作为一个社区,能够提供更好的 答案而不是技术上 正确的答案。至于 OP 的 will:他说他想比较 dates,但发布了一个 string 比较。你和我一样都知道,没有经验的程序员会利用现有知识为新问题提出奇怪的解决方案。因此,让我们向他们展示他们正在尝试做的事情的新的和更好的东西。至少我个人很欣赏以这种方式获得的新知识。
    • @nabuchodonossor If Format(one_int, "0000000000") > Format(another_int, "0000000000") Then 一点都不优雅。尽管它产生的结果与正确的If one_int > another_int Then 相同,但它令人困惑和错误。这段代码正是如此。
    猜你喜欢
    • 2022-11-03
    • 1970-01-01
    • 2021-03-23
    • 2016-11-21
    • 1970-01-01
    • 2022-01-06
    • 2012-02-08
    • 2016-07-30
    • 1970-01-01
    相关资源
    最近更新 更多