在vb.net中有一个包含#号的日期他们做什么?

问题描述:

通常当比较硬编码的日期时,我会使用一个字符串,但如果未在AS 400数据库中设置日期,则我的查询将带回#1/1/0001 12:00:00 AM#。我厌倦了比较“1/1/0001 12:00:00 AM”,因为虽然那是另一个错误,但它似乎可以找到与另一个日期时间的比较。 在这种情况下#的含义是什么。在vb.net中有一个包含#号的日期他们做什么?

If lastChg <> #1/1/0001 12:00:00 AM# Then 

''do stuff 

End If 
+0

它被称为*日期文字*它将TEXT转换为实际的DateTime类型。'通常当比较一个硬编码的日期时,我会使用一个字符串'日期不是字符串,并且字符串不是日期 – Plutonix

+0

更具体地说,这是'Date.MinValue'的日期文字,你可以在这种情况下使用。 –

lastChg可能是声明为DateDateTimeDate只是System.DateTime的VB别名。您无法将Date值与String进行比较,但可以将Date常数与Date变量进行比较。 #1/1/0001 12:00:00 AM#是所谓的日期字面量,类型为Date。它是日期常量的文本表示。

你可以写

Const EmptyDate AS Date = #1/1/0001 12:00:00 AM# 

If lastChg <> EmptyDate Then 
    ''do stuff 
End If 

在任何情况下确保如果lastChg类型为Date你把它比作文字(与#)的日期,但如果它是一个String为字符串字面(带"

+1

lastChg “1/1/0001 12:00:00 AM”运行相同aslastChg #1/1/0001 12:00:00 AM#这就是为什么我很困惑 – Scath

+3

如果你有'Option Strict On '(你应该拥有它!),那么你会得到错误:* Option Strict On禁止从'String'到'Date'*的隐式转换。这些自动转换的问题是它们可能会隐藏编码错误。 –

+0

我明白了,在我总是使用字符串之前,我并不认为每个字符都转过来:/ thanks – Scath

这就像“为字符串,但# is for date

Dim date1 As Date = #5/1/2008 8:30:52AM# 

大多数语言都要求您为日期文字使用字符串,然后编译器会将该字符串解析为日期对象(在编译时,当然......它从来不是内存中的字符串)。 VB实际上有日期文字的特殊语法。

大多数情况下,特殊语法并不重要,正如其他语言所示,其中编译器通常会知道您对字符串与日期的含义。该样本是罚款转换到使用字符串十岁上下的日期文字任强类型语言,因为编译器会看到DateTime变量,并知道如何编码的文字:

If "2017-07-25" <> MyDateTimeVariable Then ... 

但也有一些情况下VB的语法很好。其中之一是动态对象。假设你有一个方法返回一个dynamic(COM这样做,或者一些非托管库会强制你)。在另一种语言,你可能有代码大致相当于此:

If "2017-07-25" = MyDynamicMethodThatIKnowReturnsADate() Then '... 

使用字符串表示法日期文字,编译器可能会只使用一个字符串文字在这里。您将*转换方法结果或构造DateTime对象以获得良好的代码。但是现在看看这个:

If #2017-07-25# = MyDynamicMethodThatIKnowReturnsADate() Then '... 

现在,编译器肯定会给你一个DateTime对象为文字,因为你知道的动态方法确实是要给你一个DateTime预期比较只会工作。繁荣。

另一个例子是数据库结果,它经常从ADO.Net返回,只是输入为Object。在那里有一个真正的DateTime文字允许运行时知道在与数据库列进行比较时该做什么。

+0

即使使用Option Strict Off,VB也不允许在日期的常量声明中使用字符串,因为转换是在运行时完成的。然而,日期文字在编译时被转换。 –

+0

是的,我知道。看来OP来自一个用于字符串表示法的平台,我试图解释为什么VB的语法是可取的。我有一个编辑可能有助于使这个更清晰。 –