2012-11-14 37 views
2

遇到一個奇怪的問題。在我們的代碼有一天。我想出了一個快速解決方案,但我不禁想知道是否有更好的方法。區分日期/時間版本

將通過QueryString提交的字符串值解析爲最終以SQL存儲過程最終結束的類型對象時出現問題。對於大多數最終的比較類型來說,比較字符串是好的,但要做到「小於」或「大於」等日期,字符串必須首先轉換爲日期。 -

所以,我們在做這個值被拉出查詢字符串後,被提交到函數的字符串:

if (DateTime.TryParse(value, out newTime)) 
{ 
    value = newTime.ToStringIsoUtc(); 
} 

return value 

這幾年工作的罰款,直到有人試圖提交由三部分組成的版本數。突然1.3.1變成2001-03-01,比較停止工作。

我的快速修復只是檢查是否有潛在的「日期」中有多個點,如果是,請將其保留爲字符串。簡單。但問題是,雖然我們的客戶目前都沒有使用UTC日期格式以外的任何其他客戶,但是當我查看維基百科時,我感到害怕,並發現有多少個國家使用dd.mm.yy這樣的標準日期格式。

有沒有更好的方式告訴一個日期的無類型版本號?

+0

我認爲沒有通用的方法來做到這一點。想象一下有效的日期,也可以是有效的版本:1.12.2012或者......可以是日期,也可以是s.b.的版本。每增加一個版本都會增加版本號。 – dognose

+0

您希望支持哪些輸入日期格式(視爲有效輸入)? dd/MM/yyyy,MM/dd/yyyy等? – giacomelli

+1

您爲什麼擔心時間和日期格式不適用於您的客戶?如果你使用'DateTime.ParseExact',你可以忽略任何不適用於你的客戶端的格式。 –

回答

3

沒有辦法,你可以做到這一點的原因只是單獨的日期值。你需要什麼真的是另一個值,指示查詢字符串中DateTime的格式是什麼。

以您的1.3.1格式爲例。誰是說它不能被解釋爲2011年1月3日(從左到右,而不是從右到左)。

你有兩個選擇:

  • 如果你想要一個完全開放的價值,你需要一個線索表明它應該如何解釋(你會用它來調整您的來電設置選項在通話至DateTime.TryParse),同時要注意的是,如果提示未提供,則當輸入不明確時結果可能是不確定的

  • 拒絕任何不是預期格式的內容。

第一種方法在處理用戶輸入時更爲可取,因爲您希望儘可能簡化用戶並降低輸入欄的大小。

請注意,如果用戶輸入來自說,使用HTML 5的網頁,您應該知道input標籤允許datedatetime輸入類型。這不僅具有允許瀏覽器提供標準化(至少在整個平臺上)輸入這種類型的數據的方式的好處,而且還提供了標準化數據傳輸的格式,這意味着您的輸入更多地落入# 2比它在#1。

當處理API調用時,由於可以修改DateTime實例(或其表示形式)以符合您的期望(因爲它們在調用API之前已經在內存中有強類型表示)。

+0

是的,我認爲這可能是答案。但我想看看是否有另一種解決方案。感謝您確認我的懷疑。 –

+0

@MattThrower根據提交查詢字符​​串的內容,您可以傾向於2),因爲HTML5允許輸入「date」和「datetime」類型。如果您知道您的網頁使用的是HTML5格式,則每次都會保證您的值的格式,就像您在代碼中提供網址中的值一樣。 – casperOne

+0

可悲的是,輸入不是來自一個表格 - 我應該清楚地說明。它是通過調用實際上是Web服務的QueryString來實現的,所以我們無法在它到達我們的代碼之前對它進行消毒。 –

1

它工作得很好多年,直到有人試圖提交 三部分版本號。突然1.3.1變成了2001-03-01和 比較停止工作。

這將是你應該使用的DateTime ParseExact(字符串s,字符串格式,的IFormatProvider povider)

using System; 
using System.Globalization; 

public class Example 
{ 
    public static void Main() 
    { 
     string dateString, format; 
     DateTime result; 
     CultureInfo provider = CultureInfo.InvariantCulture; 

     // Parse date-only value with invariant culture. 
     dateString = "06/15/2008"; 
     format = "d"; 
     try { 
     result = DateTime.ParseExact(dateString, format, provider); 
     Console.WriteLine("{0} converts to {1}.", dateString, result.ToString()); 
     } 
     catch (FormatException) { 
     Console.WriteLine("{0} is not in the correct format.", dateString); 
     } 

     // Parse date-only value without leading zero in month using "d" format.// Should throw a FormatException because standard short date pattern of // invariant culture requires two-digit month. 
     dateString = "6/15/2008"; 
     try { 
     result = DateTime.ParseExact(dateString, format, provider); 
     Console.WriteLine("{0} converts to {1}.", dateString, result.ToString()); 
     } 
     catch (FormatException) { 
     Console.WriteLine("{0} is not in the correct format.", dateString); 
     } 

     // Parse date and time with custom specifier. 
     dateString = "Sun 15 Jun 2008 8:30 AM -06:00"; 
     format = "ddd dd MMM yyyy h:mm tt zzz"; 
     try { 
     result = DateTime.ParseExact(dateString, format, provider); 
     Console.WriteLine("{0} converts to {1}.", dateString, result.ToString()); 
     } 
     catch (FormatException) { 
     Console.WriteLine("{0} is not in the correct format.", dateString); 
     } 

     // Parse date and time with offset but without offset's minutes. // Should throw a FormatException because "zzz" specifier requires leading // zero in hours. 
     dateString = "Sun 15 Jun 2008 8:30 AM -06"; 
     try { 
     result = DateTime.ParseExact(dateString, format, provider); 
     Console.WriteLine("{0} converts to {1}.", dateString, result.ToString()); 
     } 
     catch (FormatException) { 
     Console.WriteLine("{0} is not in the correct format.", dateString); 
     } 

     dateString = "15/06/2008 08:30"; 
     format = "g"; 
     provider = new CultureInfo("fr-FR"); 
     try { 
     result = DateTime.ParseExact(dateString, format, provider); 
     Console.WriteLine("{0} converts to {1}.", dateString, result.ToString()); 
     } 
     catch (FormatException) { 
     Console.WriteLine("{0} is not in the correct format.", dateString); 
     } 
    } 
} 

Source

+0

謝謝你。這是我嘗試的第一種方法,但它仍然(顯然)將格式限制爲我們認爲「可接受」的格式。我想看看是否有更多的開放式使用。 –