IsDate 函数返回意外结果

2023-11-30

怎么会IsDate("13.50")回报True but IsDate("12.25.2010")回报False?


我最近被这个小“功能”绊倒了,想提高人们对围绕该功能的一些问题的认识。IsDateVB 和 VBA 中的函数。

简单的案例

正如你所期望的那样,IsDate回报True当传递日期数据类型时False对于除字符串之外的所有其他数据类型。对于字符串,IsDate回报True or False基于字符串的内容:

IsDate(CDate("1/1/1980"))  --> True
IsDate(#12/31/2000#)       --> True
IsDate(12/24)              --> False  '12/24 evaluates to a Double: 0.5'
IsDate("Foo")              --> False
IsDate("12/24")            --> True

是日期时间吗?

IsDate应该更准确地命名IsDateTime因为它返回True对于格式化为时间的字符串:

IsDate("10:55 AM")   --> True
IsDate("23:30")      --> True  'CDate("23:30")   --> 11:30:00 PM'
IsDate("1:30:59")    --> True  'CDate("1:30:59") --> 1:30:59 AM'
IsDate("13:55 AM")   --> True  'CDate("13:55 AM")--> 1:55:00 PM'
IsDate("13:55 PM")   --> True  'CDate("13:55 PM")--> 1:55:00 PM'

请注意上面最后两个示例IsDate不是一个完美的验证器次。

问题!

不仅IsDate接受时间,它接受多种格式的时间。其中之一使用句点 (.) 作为分隔符。这会导致一些混乱,因为句点可以用作时间分隔符,但不能用作日期分隔符:

IsDate("13.50")     --> True  'CDate("13.50")    --> 1:50:00 PM'
IsDate("12.25")     --> True  'CDate("12.25")    --> 12:25:00 PM'
IsDate("12.25.10")  --> True  'CDate("12.25.10") --> 12:25:10 PM'
IsDate("12.25.2010")--> False '2010 > 59 (number of seconds in a minute - 1)'
IsDate("24.12")     --> False '24 > 23 (number of hours in a day - 1)'
IsDate("0.12")      --> True  'CDate("0.12")     --> 12:12:00 AM

如果您正在解析字符串并根据其表观类型对其进行操作,这可能会出现问题。例如:

Function Bar(Var As Variant)
    If IsDate(Var) Then
        Bar = "This is a date"
    ElseIf IsNumeric(Var) Then
        Bar = "This is numeric"
    Else
        Bar = "This is something else"
    End If
End Function

?Bar("12.75")   --> This is numeric
?Bar("12.50")   --> This is a date

解决方法

如果您正在测试其基础数据类型的变体,您应该使用TypeName(Var) = "Date"而不是IsDate(Var):

TypeName(#12/25/2010#)  --> Date
TypeName("12/25/2010")  --> String

Function Bar(Var As Variant)
    Select Case TypeName(Var)
    Case "Date"
        Bar = "This is a date type"
    Case "Long", "Double", "Single", "Integer", "Currency", "Decimal", "Byte"
        Bar = "This is a numeric type"
    Case "String"
        Bar = "This is a string type"
    Case "Boolean"
        Bar = "This is a boolean type"
    Case Else
        Bar = "This is some other type"
    End Select
End Function

?Bar("12.25")   --> This is a string type
?Bar(#12/25#)   --> This is a date type
?Bar(12.25)     --> This is a numeric type

但是,如果您正在处理可能是日期或数字的字符串(例如,解析文本文件),则应该在检查它是否是日期之前检查它是否是数字:

Function Bar(Var As Variant)
    If IsNumeric(Var) Then
        Bar = "This is numeric"
    ElseIf IsDate(Var) Then
        Bar = "This is a date"
    Else
        Bar = "This is something else"
    End If
End Function

?Bar("12.75")   --> This is numeric
?Bar("12.50")   --> This is numeric
?Bar("12:50")   --> This is a date

即使您只关心它是否是日期,您也应该确保它不是数字:

Function Bar(Var As Variant)
    If IsDate(Var) And Not IsNumeric(Var) Then
        Bar = "This is a date"
    Else
        Bar = "This is something else"
    End If
End Function

?Bar("12:50")   --> This is a date
?Bar("12.50")   --> This is something else

CDate 的特点

正如@Deanna 在下面的评论中指出的那样,CDate()也是不可靠的。其结果根据传递的是字符串还是数字而有所不同:

?CDate(0.5)     -->  12:00:00 PM
?CDate("0.5")   -->  12:05:00 AM

尾随and如果数字作为字符串传递,则前导零很重要:

?CDate(".5")    -->  12:00:00 PM 
?CDate("0.5")   -->  12:05:00 AM 
?CDate("0.50")  -->  12:50:00 AM 
?CDate("0.500") -->  12:00:00 PM 

当字符串的小数部分接近 60 分钟标记时,行为也会发生变化:

?CDate("0.59")  -->  12:59:00 AM 
?CDate("0.60")  -->   2:24:00 PM 

最重要的是,如果您需要将字符串转换为日期/时间,您需要了解您期望它们采用的格式,然后在依赖之前适当地重新格式化它们CDate()来转换它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IsDate 函数返回意外结果 的相关文章

  • Excel Q - 带有二维数组的 SUMIFS

    我有一个二维数组 水平轴上的日期和垂直轴上的标识号 我想要以特定日期和 ID 为条件的总和 并且我想知道如何使用 SUMIFS 来执行此操作 由于某种原因 我似乎不能 因为数组是二维的 而标准范围是一维的 谁能给我关于我可以使用的其他公式的
  • VBA rand 如何使用上限和下限生成随机数?

    所以也许这是多余的 也许这就像问为什么大多数人生来就有 5 个手指 最后的简短答案总是 因为事情就是这样 而且它就是这样工作的 但我讨厌这个答案 该死的我想知道怎么做VBA 中的 Rnd 函数有效 Ms Office Excel 的 MSD
  • MS Access VBA:通过 Outlook 发送电子邮件 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何使用 MS Access VBA 通过帐户发送电子邮件 我知道这个问题很模糊 但是很难在网上找到在某种程度上还没有过时的相关信息 编辑
  • 如何粘贴到Excel B列的最后一行?

    我需要将单元格从 H2 L2 一直向下剪切并将其粘贴到 B 列的最后一行 数据每次都会不同 所以我无法对任何范围进行硬编码 VBA 代码会很好 从 H2 L2 向下剪切并粘贴 插入到 B 列的最后一行 到目前为止我得到了 Range H2
  • 如何将exe异常路由回VB6应用程序?

    我有一个 vb6 应用程序 它将调用 mencoder exe 它是 mplayer 的一部分 用于将某些文件转换为 flv 格式 每当我尝试转换这个 opendivx 文件时 我都会从 mencoder 收到这个奇怪的未处理异常问题 目前
  • 需要在Excel中合并3列

    我有 3 列 A B C 我需要合并这 3 列 并且我已经应用了 forumala A1 B1 C1输出为 E 列 我需要输出为 D 列 下面的公式将达到您想要的结果 TEXTJOIN TRUE A1 C1 Textjoin 的工作方式类似
  • VBA 中的 VSTO:AddIn.Object 有时不返回任何内容 (null)

    Given VSTO 插件 An override object RequestComAddInAutomationService 它返回一个名为的类的实例Facade在我的场景中 Excel 2007 中的 VBA 宏可访问AddIn O
  • 具有多个条件(全部等于相同值)的 IF 语句的替代方案

    还有比这更好的方法吗 假设所有变量都为零 If var1 0 Or var2 0 Or var3 0 Or var4 0 Or var5 0 Or var6 0 Then do something End If 你可以用Select Cas
  • 使用 VBA 通过简单命令从非连续范围的并集获取值到数组中(无循环)

    我有以下任务 表面上很简单 使用 VBA 将电子表格上多个列的值复制到二维数组中 为了让生活更有趣 这些柱子并不相邻 但它们的长度都相同 显然 可以通过依次循环每个元素来做到这一点 但这看起来非常不优雅 我希望有一个更紧凑的解决方案 但我很
  • MS Access 执行 POST Web 请求

    在我的 MS Access 应用程序中 我需要定期向我的网络服务器发送一批信息 我不需要任何花哨的东西 比如 SOAP XML RPC 或任何东西 只需一个简单的 POST 页面请求就足够了 我用谷歌搜索了一下 但找不到任何真正有用的东西
  • 在 VBA 中循环合并单元格

    是否可以循环遍历合并的单元格vba questions tagged vba 我的范围内有 6 个合并单元格B4 B40 我只需要这 6 个单元格中的值 6 次迭代 上面的答案看起来已经让你排序了 如果您不知道合并的单元格在哪里 那么您可以
  • VBA XML V6.0 如何让它等待页面加载?

    我一直在努力寻找答案 但似乎找不到任何有用的东西 基本上 我是从一个网站上拉取的 当您在该页面上时 该网站会加载更多项目 我希望我的代码在加载完成后提取最终数据 但不知道如何让 XML httprequest 等待 Edited Sub p
  • Confluence:使用 VBA 更新现有页面

    我尝试使用 VBA 更新 Confluence 页面 我的想法是使用REST API加载页面内容 修改内容然后上传修改后的版本 这是我的代码 Private Sub TestRESTApi Dim uname As String uname
  • Outlook 无法识别一个或多个姓名

    我有以下 vba 代码 它读取邮箱并向任何发送无效代码作为邮箱回复的用户发送回复 但有时会收到运行时错误 Outlook 无法识别一个或多个名称 我的问题是 创建新的 MAPI 配置文件是否可以解决该问题 或者我是否需要添加一个代码来解析地
  • 根据单元格值向用户窗体添加复选框

    我对 VBA 很陌生 只有 3 天 但我发现它非常有用且易于使用 但现在我面临一个问题 我需要制作一个具有不同复选框的用户窗体 但我需要根据工作表某一列中使用的信息自动添加它们 我相信我可以使用 For Each Next 但我真的不知道如
  • VBA 字符串 255 个字符限制

    我在使用 VBA 时遇到问题 并注意到它的字符串限制为 255 个字符 我实际上正在尝试通过 POST 发送 JSON 并暂停执行 我注意到该字符串始终只有 255 个字符 有没有办法调整字符串的大小或其他什么 我在这个问题上浪费了大约 6
  • 将ADODB二进制流转换为字符串vba

    我有以下问题 我有一个存储在服务器上的 CSV 文件 但它有 3 个字符作为分隔符 我想从 URL 加载数据并使用 作为分隔符将数据填充到 Excel 页面的列中 到目前为止 我找到了使用 ADODB 记录集从网站加载文件的代码 但我无法进
  • 当使用公式生成超链接时,VBA 打开 Excel 超链接不起作用

    使用公式生成的 Excel 超链接似乎存在错误 我使用的是 Excel 2010 我有一个电子表格 其中的单元格包含 URL 我的目标是执行以下两件事 将这些单元格变成超链接 创建一个键盘快捷键来打开这些超链接 这样我就不必使用鼠标了 为了
  • 将 Excel 范围转换为 VBA 字符串

    我想将给定范围内的值转换为 VBA 字符串 其中原始单元格值由任何选定的列分隔符和行分隔符分隔 分隔符可以是一个字符或更长的字符串 行分隔符是行末尾的字符串 该字符串应该像我们从左上角 从左到右 到右下角读取文本一样完成 以下是范围 A1
  • 需要从 DCOM 配置中删除对象 (DCOMCNFG)

    我们有一个带有 activex exe 和 com dll 的应用程序 安装后 我们会在 DCOM 配置中创建一个对象 如果我们尝试从 DCOM 配置中删除该对象 它就会关闭 直到我们再次重新打开它 想知道是否有任何程序可以从 DCOM 及

随机推荐

  • Pygame 按键/按键

    我正在为学校的计算机俱乐部制作一个小马里奥 好吧 作为团队的一部分 无论如何 我在使用 keyup keydown 命令时遇到了一些麻烦 这是我的代码 1 Import library import pygame from pygame l
  • WooCommerce 更改加载微调器图标

    IM 尝试更改 WooCommerce 加载旋转图标 它在 woocommerce css 中定义 woocommerce blockUI blockOverlay before height 1em width 1em display b
  • 如何配置应用程序以在具有高 DPI 设置(例如 150%)的计算机上正确运行?

    我用 C 创建了一个简单的 Winforms 应用程序 当我在具有高 DPI 设置 例如 150 的计算机上运行应用程序时 应用程序会放大 到目前为止 一切都很好 但所有文本也只是按比例放大 而不是使用更大的字体大小渲染字体 这当然会导致文
  • 鼠标光标与画布不匹配

    我有一个问题 当我在画布上画一条线时 似乎鼠标位置与画布位置不匹配 所以每当我画画时 光标和画线之间都有一定的距离 请帮助我这个问题 这是我的代码 document ready function context document getEl
  • 卸载矩阵并释放内存

    我可以从文本文件加载矩阵 load mydata txt 问题是我的矩阵文件大约有 250Mb 经过几次这样的加载后 我没有内存来处理下一个文件 如何卸载它并释放资源以供进一步使用 Use clear or 清除变量 默认情况下 MATLA
  • Swift 2.2,包含方法不起作用

    包含方法无法正常工作 即使它与对象匹配 它也会给我错误的结果 我的代码如下 class Generic NSObject NSCoding var genericCode String var genericName String var
  • 为什么 PostgreSQL 适配器 psycopg2 在 Google App Engine dev_appserver.py 中失败?

    我想将 GAE 中的应用程序与 ElephantDB 连接起来 我想使用 lib psycopg2 但发现了一个问题 我在本地安装了该库来测试它并完美运行 然后我将该库安装在我的应用程序的 lib 文件夹中 就像我对其他库所做的很多次一样
  • 命名空间和类同名吗?

    我正在组织一个图书馆项目 并且有一个名为的中央管理器类Scenegraph以及位于 Scenegraph 命名空间中的一大堆其他类 我真正想要的是场景图MyLib Scenegraph和其他类别MyLib Scenegraph 但似乎唯一的
  • AngularJS UI-Router:在应用程序加载之前预加载 $http 数据

    我需要使用过 ui router 插件的 AngularJS 专家的帮助 有人可以提供一个在应用程序运行之前预加载 http 数据请求的 plunker 示例吗 我做了一些研究 但最接近的是这两个堆栈溢出 AngularJS 如何在应用程序
  • Java程序禁用SSL认证存在安全风险

    我们的团队会抓取网站以使我们的信息保持最新 我遇到了抓取HTTPS页面时的安全异常 问题在于 Java 在接受页面自签名证书时存在问题 我没有保留要接受的证书列表 将来可能很难维护 而是使用 neu242 提供的解决方法来禁用 SSL 证书
  • 在运行时将 C# 标签添加到表单

    我正在尝试用 C 制作一个简单的基于文本的游戏 我想实现这一点的方法是向表单添加标签 而不是使用命令提示符 我在将它们添加到屏幕时遇到一些问题 Visual Studio 给出了一个未指定的错误 只是说我有一个未处理的异常 你调用的对象是空
  • 如何去除抽屉上方的台阶

    我在用着DaisyUI and 顺风CSS 我正在使用一个drawer and steps div class drawer div
  • 在托管类中调用非托管函数时出现 C++/CLI System.AccessViolationException

    我在 C 中有一个本机回调函数 让我们这样说 void CallbackFunction void Do nothing 现在我有另一个本机函数 void SomeNativeFunction void m callback std tr1
  • 终止子进程时终止所有(孙)子进程

    我将直接进入 简短且具有描述性 C Windows API 我正在使用创建子进程CreateProcess运行外部 命令行 应用程序 我已经内置了一个超时 如果到那时子进程还没有返回正常执行 我希望强制终止该子进程 理想情况下 我希望该子进
  • 如何使用 ASP.NET 身份模型进行 WCF 服务授权和身份验证

    我正在开发一个 ASP NET 4 5 Web 应用程序 它使用 ASP NET 身份模型进行身份验证和授权 该 Web 应用程序还托管 WCF 服务并同时使用它 还有另一个基于 WPF 的应用程序将使用托管的 WCF 服务 以及作为客户端
  • 如何减少 YOLOv3 文件中的类数量?

    我正在使用 YOLOv3 来检测视频中的汽车 我下载了代码中使用的三个文件coco names yolov3 cfg and yolov3 weights它们针对 80 种不同类别的待检测物体进行了训练 该代码可以运行 但速度非常慢 每帧需
  • 如何使用 YouTube Android 播放器 API 播放 YouTube 直播?

    我已经成功使用 YouTubePlayer 播放 YouTube 视频 但是 当我尝试使用 YouTubePlayer 播放直播时 没有任何反应 API支持直播吗 如果是这样 我该怎么做 播放普通 YouTube 视频和直播视频没有区别 我
  • (psycopg2.DataError) 整数输入语法无效:从 csv 文件导入?

    我的csv文件中的数据是这样的 081299289X China Dolls Lisa See 2014 0345498127 Starter for Ten David Nicholls 2003 0061053716 Imajica C
  • python np.nan 和 '==' & 'is' [重复]

    这个问题在这里已经有答案了 当我检查 Python 操作数的相等性和同一性时 例如a b a我明白了 a b gt True a is b gt True 我明白了 那么 为什么我得到 np nan 的 diff 结果 a np nan b
  • IsDate 函数返回意外结果

    怎么会IsDate 13 50 回报True but IsDate 12 25 2010 回报False 我最近被这个小 功能 绊倒了 想提高人们对围绕该功能的一些问题的认识 IsDateVB 和 VBA 中的函数 简单的案例 正如你所期望