我需要将这些日期格式化为 yyyy/mm/dd 以查询 MySQL 数据库 - 查看这两个语句,您会认为它们会产生相同的结果,对吗?
dateOne = Format(#9/1/2013#, "yyyy/mm/dd")
dateTwo = Format(#9/1/2013#, "yyyy/mm/dd")
dateOne 现在等于 2013/09/01 ,而 dateTwo 等于 9/1/2013。我疯了吗?这发生在我的脚本的最开始,我有 Option Explicit 并且我知道它正在保存到正确的变量中..
Sub main()
Dim dateOne, dateTwo As Date
Dim answer As Integer
answer = MsgBox("Would you like to generate a Transfer Report?", vbYesNoCancel + vbQuestion)
If answer <> 6 Then Exit Sub
'dateOne = InputBox("Input the first (earliest) date in mm/dd/yyyy format")
'dateTwo = InputBox("Input the second (latest) date in mm/dd/yyyy format")
dateOne = Format(#9/1/2013#, "yyyy/mm/dd")
dateTwo = Format(#9/1/2013#, "yyyy/mm/dd")
现在 dateOne 是 2013/09/01,而 dateTwo 是 9/1/2013。
我最初在不同的日期使用它们,以查询范围 - 在将我的头撞到我的键盘之前,为了绝对确保我在两者上以相同的方式执行该功能,我复制了 dateOne 中的文本,将其粘贴了一行,并将变量更改为 dateTwo。完全相同的命令,分开执行两行,产生不同的结果。脚本快完成了,但是它如何,为什么,它正在做它正在做的事情?
也许我可以要求用户以 yyyy/mm/dd 格式输入它,但我真的很想知道为什么会这样。任何人都可以帮忙吗?
最佳答案
你的例行程序有两个问题,它们结合起来产生了这些看似不合逻辑的结果:
Sub main()
Dim dateOne, dateTwo As Date
Dim answer As Integer
.
.
.
dateOne = Format(#9/1/2013#, "yyyy/mm/dd")
dateTwo = Format(#9/1/2013#, "yyyy/mm/dd")
首先,
Format(..)
创建了一个 Variant String ,但您似乎将其视为创建了 Date
。其次这一行:
Dim dateOne, dateTwo As Date
是 而不是 声明两个 Date 变量,正如您在编写它时可能相信的那样。相反,它声明 dateTwo
是一个 Date 变量,但它声明 dateOne
是一个 Variant(默认),因为你没有做任何其他事情。要使它们都成为日期,您需要 Dim dateOne As Date, dateTwo As Date
。因此,将这两个事实放在一起,
dateOne
发生的事情是 Format
按照您的意图生成字符串,然后由于目标变量是 Variant,将其作为 Variant String 存储在那里。然而,
dateTwo
的工作方式不同,因为它首先按照您的指示生成日期字符串 ("2013/09/01"),但随后看到您告诉它将 String
分配给不同数据类型的 Date
,所以然后它将字符串 转换回 为日期,但使用您本地系统的 NLS 设置来确定如何解释(在您的情况下)导致月和日数字被交换的字符串。清除?