2016-07-05 58 views
1

考慮在Windows 7系統上執行以下代碼運行:日期驗證與時鐘命令

% info patchlevel 
8.6.4 
% clock scan "1995-01-35" -format "%Y-%m-%d" 
791856000 
% clock format [clock scan "1995-01-35" -format "%Y-%m-%d"] -format "%Y-%m-%d" 
1995-02-04 
% 

我碰到這種情況試圖確定一個字符串是一個有效的日期的時候,我期待第一個時鐘掃描失敗,因爲35不是有效的一天,但是會發生的是我在1月1日後35天得到一個日期。

在我的代碼中,我現在將第二個時鐘命令的輸出與原始輸入進行比較,如果結果不同,則判定該字符串不是真正的有效日期。

是否有更好的方法來驗證日期,這是時鐘命令的預期行爲,我找不到它在手冊頁中描述的時鐘?

回答

3

這不是Tcl中的內置功能。如果日期/月份超過,則將其添加到連續的日期/月份。

在你的情況下,你給1月的第35個月。額外的4天(即31 + 4 = 35)被添加並計算爲2月份的第4天。

在該添加天的給定數產生一個日期 不存在,因爲它屬於內的下降天離奇情況下 儒略對公曆轉換,將日期轉換,如果它是在 朱利安日曆。

增加若干月或數年是相似的;它 將給定時間轉換爲日曆日期和時間。然後 添加必要的月份或年數,並將結果日期和時間重新轉換爲絕對時間。

如果生成的日期不可能,因爲該月的天數太少(例如,在1月31日增加1個月的時間) 月份的最後一天將被替換爲 。因此,在1月31日增加1個月將在2月28日的普通年或2月29日的閏年產生 。

proc is_valid_date {date {date_format "%Y-%m-%d"}} { 
    return [string equal [clock format [clock scan $date -format $date_format] -format $date_format] $date] 
} 

日期格式是一個可選的並且默認爲%Y-%m-%d。如果格式不匹配,則會失敗。您可以處理例外情況。

輸出:

% is_valid_date "1995-02-28" 
1 
% is_valid_date "1995-01-35" 
0 
% 

我們的日期轉換爲長,再次恢復到的日期。如果兩者不相同,則給定的輸入不正確。

參考:clock

+0

這本手冊的部分涉及到日期計算不時鐘format命令,你的is_valid_date PROC確實是我結束了驗證日期的方法。 – Jackson

+2

'時鐘掃描'命令是這樣工作的,因爲它需要處理一些'時鐘添加'不起作用的現實世界的情況。這很奇怪,但這是你的日期:他們很奇怪...... –