2017-07-25 31 views
2

通常當比較硬編碼的日期時,我會使用一個字符串,但如果未在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'的日期文字,你可以在這種情況下使用。 –

回答

4

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

0

這就像「爲字符串,但# is for date

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

大多數語言都要求您爲日期文字使用字符串,然後編譯器會將該字符串解析爲日期對象(在編譯時,當然......它從來不是內存中的字符串)。 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的語法是可取的。我有一個編輯可能有助於使這個更清晰。 –

相關問題