【问题标题】:Foxpro is returning a date type indication for a non-existing dateFoxpro 正在返回不存在日期的日期类型指示
【发布时间】:2020-09-18 20:23:59
【问题描述】:

如果您在命令框中运行以下函数,它会在应该返回 [U] 时返回 [D]。因为 1964 年 4 月 31 日不是有效日期。这是因为 1964 年是闰年吗?这是一个错误吗?

? Type('DATE(Val(Substr([19640430],1,4)),Val(Substr([19640430],5,2)),Val(Substr([19640430],7,2)) + 1)' )

任何有关这方面的信息都会非常有帮助。

谢谢 杰夫

【问题讨论】:

    标签: visual-foxpro


    【解决方案1】:

    这是因为,即使它是空的,Date 数据类型也会返回 D。在您的情况下,它返回空,因为 Date(1964, 4, 31) 不是有效日期。它可能会或可能不会记录在案,我不知道,在 Date() 函数中,检查第二个参数是否在 1-12 范围内,并检查第三个参数是否在 1-31 范围内。就是这样,除此之外,不存在的日期不会导致错误,只是简单地返回一个空日期,但它仍然是一个 DATE。

    你可以试试:

    ? Date(2000,2,29)
    ? Date(2001,2,29)
    * or even
    ? Date(2020,2,31)
    

    最后两个不会出错,但会返回空的“DATE”。

    如果您正在对日期的有效性进行类型检查,那么最好检查它是否不为空。

    【讨论】:

    • 您是正确的,在此评估中,它将每月的第 31 天计算为任何月份的正确天数。起作用的是以正确的顺序重新组装日期并评估它的 CTOD() 是否为空。 CTOD() 是通过日期消歧系统传递的,而 TYPE() 不是。这里有两组不同的规则。 CTOD() 速度非常快。所以这是一场彻底的胜利。
    • 我不明白你的意思。 TYPE() 工作正常,正如上面解释的那样。您可以使用 Date() 或 Ctod() 来检查它。如果是 CTOD(),请确保您使用的是严格的日期格式。
    • 我是 Foxpro 的忠实粉丝已有 20 多年了。你的答案很准确,我希望有一天能和你一起工作。
    【解决方案2】:
    Procedure VDATE
        Lparameters v1, v2, v3
    
        v1 = Str(v1,4,0)
    
        v2 = str2(v2)
    
        If Len(v2) < 2
            v2 = [0] + v2
        Endif
    
        v3 = str2(v3)
    
        If Len(v3) < 2
            v3 = [0] + v3
        Endif
    
        Do Case
            Case Empty(Ctod(v2 + [/] + v3 + [/] + v1))
                Return .F.
            Case Ctod(v2 + [/] + v3 + [/] + v1) > Date()
                Return .F.
            Case Ctod(v2 + [/] + v3 + [/] + v1) < Ctod([01/01/1000])
                Return .F.
            Otherwise
                Return .T.
        Endcase
    

    【讨论】:

    • 这是我创建的历史网站。它会在星期一起来。时间线历史网
    猜你喜欢
    • 1970-01-01
    • 2020-07-15
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多