【问题标题】:Date Range Visual Basic Script Not Working as Expected? [duplicate]日期范围 Visual Basic 脚本未按预期工作? [复制]
【发布时间】:2019-04-15 12:04:13
【问题描述】:

我按以下顺序传递变量: FileEndDate StartDateRange EndDateRange

FileEndDate = 10/11/2019
StartDateRange = 01/04/2019
EndDateRange = 30/04/2019

但是,我的代码返回“True”,尽管 10/11/2019 不应在 01/04/2019 -> 30/04/2019 的日期范围内。

If (WScript.Arguments.Item(0) >= WScript.Arguments.Item(1)) And (WScript.Arguments.Item(0) <= WScript.Arguments.Item(2)) Then
   WScript.Stdout.Writeline "True"
Else    
   WScript.Stdout.Writeline "False"
End If

【问题讨论】:

  • 您正在比较字符串。如果要比较日期,则需要将字符串转换为日期,例如使用CDate
  • 对标签差异感到抱歉。

标签: date vbscript date-range


【解决方案1】:

您正在比较字符串,"10/11/2019" &gt; "01/04/2019""10/11/2019" &lt; "30/04/2019"

您可能希望改为使用日期,重写字符串以确保简单的字符串比较可以正常工作 (YYYY/MM/DD)

后者可以这样做:

dim FileEndDate : FileEndDate = "10/11/2019"
dim StartDateRange : StartDateRange = "01/04/2019"
dim EndDateRange : EndDateRange = "30/04/2019"

function ReformatDate(sInputDate)
    dim aResult
    aResult = Split(sInputDate, "/")
    ReformatDate = aResult(2) & "/" & aResult(1) & "/" & aResult(0)
end function

FileEndDate = ReformatDate(FileEndDate)
StartDateRange = ReformatDate(StartDateRange)
EndDateRange = ReformatDate(EndDateRange)

If (FileEndDate >= StartDateRange) And (FileEndDate <= EndDateRange) Then
   MsgBox "True"
Else    
   MsgBox "False"
End If

这会输出"False"


请注意,这不会检查字符串的初始格式。您可能需要编写自己的检查函数以确保它不会崩溃。

【讨论】:

  • 为什么不对特定的 LCID 使用 just use SetLocale to set the current regional settings,然后使用 CDate() 将其转换为 Date 变量?
  • @Lankymart 使用日期对象是我的第一个想法,但我不习惯在 VBS 中处理日期,我更喜欢处理字符串以允许进行字母数字比较。如果您想添加有关这种方式的详细信息,请随时编辑我的答案
【解决方案2】:

您正在比较字符串而不是日期。

让我们试试这个:将日期字符串转换为日期类型,然后比较它们:

Dim myDateFormat As String = "dd/MM/yyyy"
Dim date0 As Date = Date.ParseExact(WScript.Arguments.Item(0).ToString(), myDateFormat, System.Globalization.CultureInfo.InvariantCulture)
Dim date1 As Date = Date.ParseExact(WScript.Arguments.Item(1).ToString(), myDateFormat, System.Globalization.CultureInfo.InvariantCulture)
Dim date2 As Date = Date.ParseExact(WScript.Arguments.Item(2).ToString(), myDateFormat, System.Globalization.CultureInfo.InvariantCulture)

If (date0 >= date1) And (date0 <= date2) Then
   WScript.Stdout.Writeline "True"
Else    
   WScript.Stdout.Writeline "False"
End If

此外,使用它可以帮助避免不可告人的错误:

Option Strict On
Option Explicit On

玩得开心!

【讨论】:

  • 这不是有效的 VBScript。
  • 标签在我发布后已更新。
  • 我知道这一点,因为我是纠正标签的人。不过题目一开始就明确写着“Visual Basic Sc​​ript”,而且代码显然也是VBScript。
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
相关资源
最近更新 更多