string轉DateTime(時間格式轉換)


1、不知道為什么時間在數據庫用varchar(8)來保存,例如"19900505",但是這樣的保存格式在處理時間的時候是非常不方便的。

但是轉換不能用Convert.ToDateTime(string s),詳細可以參考

 1  //
 2         // 摘要: 
 3         //     將日期和時間的指定字符串表示形式轉換為等效的日期和時間值。
 4         //
 5         // 參數: 
 6         //   value:
 7         //     日期和時間的字符串表示形式。
 8         //
 9         // 返回結果: 
10         //     value 的值的日期和時間等效項,如果 value 為 null,則為 System.DateTime.MinValue 的日期和時間等效項。
11         //
12         // 異常: 
13         //   System.FormatException:
14         //     value 不是格式正確的日期和時間字符串。
15  public static DateTime ToDateTime(string value);
Convert.ToDateTime


也不能用DateTime.Parse(string s),詳細參考

 1 //
 2         // 摘要: 
 3         //     將日期和時間的指定字符串表示形式轉換為其等效的 System.DateTime。
 4         //
 5         // 參數: 
 6         //   s:
 7         //     包含要轉換的日期和時間的字符串。
 8         //
 9         // 返回結果: 
10         //     一個對象,它等效於 s 中包含的日期和時間。
11         //
12         // 異常: 
13         //   System.ArgumentNullException:
14         //     s 為 null。
15         //
16         //   System.FormatException:
17         //     s 中不包含有效的日期和時間的字符串表示形式。
18         public static DateTime Parse(string s);
DateTime.Parse


之所以不能用這兩個內置的方法是因為s的格式不能被識別,能識別的格式為"yyyy-MM-dd",類似這樣的格式才能被識別。

所以,糾結到最后還是自己寫了個方法,如下:

 1  /// <summary>
 2         /// 獲取年齡
 3         /// </summary>
 4         /// <param name="birthday"></param>
 5         /// <returns></returns>
 6         public string GetAge(string birthday)
 7         {
 8             DateTime sNow = DateTime.Now;
 9             DateTime.Parse(birthday);
10             Convert.ToDateTime(birthday);
11             int year = Convert.ToInt32(birthday.Substring(0, 4));
12             int month = Convert.ToInt32(birthday.Substring(4, 2));
13             int iAge = (sNow.Year * 12 + sNow.Month - year * 12 - month)/12;
14             return iAge.ToString();
15         }

順便對Convert類和Parse做了一些了解。

以下內容來世msdn(http://technet.microsoft.com/zh-cn/subscriptions/system.convert(v=vs.95).aspx)

Convert類主要的一個作用是將一個基本數據類型轉換為另一個基本數據類型。

Convert 類的靜態方法用於支持 .NET Framework 中與基數據類型之間的轉換。 受支持的基類型是BooleanCharSByteByteInt16Int32Int64UInt16UInt32UInt64SingleDoubleDecimalDateTime  String

與基類型之間的轉換

存在將每個基類型轉換為每個其他基類型的轉換方法。 但是,根據運行時基類型和目標基類型的值,對特定轉換方法的實際調用會產生五種結果之一。 這五種結果如下:

1、無轉換。 當嘗試將一個類型轉換為其本身時(如使用 Int32 類型參數調用 Convert.ToInt32(Int32))會發生這種情況。 在這種情況下,此方法只是返回原始類型實例。

2、一個 InvalidCastException。 當不支持特定轉換時會發生這種情況。 以下轉換會引發 InvalidCastException。

將 Char 轉換為 Boolean、Single、Double、Decimal 或 DateTime。

將 Boolean、Single、Double、Decimal 或 DateTime 轉換為 Char。

將 DateTime 轉換為 String 以外的任何其他類型。

將 String 以外的任何其他類型轉換為 DateTime。

3、FormatException 。 當由於字符串格式不正確而導致將字符串值轉換為任何其他基類型的嘗試失敗時,會發生該異常。 以下轉換會引發該異常:

要轉換為 Boolean 值的字符串不等於 Boolean.TrueString 或 Boolean.FalseString。

要轉換為 Char 值的字符串由多個字符組成。

要轉換為任何數值類型的字符串沒有被識別為有效數字。

要轉換為 DateTime 值的字符串沒有被識別為有效日期和時間值。

4、轉換成功。 對於前面結果中未列出的兩個不同基類型之間的轉換,所有擴大轉換和不會導致數據丟失的收縮轉換都將成功,此方法將返回目標基類型的值。

5、OverflowException。 當收縮轉換導致數據丟失時會發生這種情況。 例如,嘗試將值為 10000 的 Int32 實例轉換為 Byte 類型會引發 OverflowException,因為 10000 超出了 Byte 數據類型的范圍。

如果數字類型轉換導致精度丟失(即某些最低有效位丟失),不引發異常。 但是,如果結果超出了特定轉換方法的返回值類型所能表示的范圍,則將引發異常。

例如,當將 Double 轉換為 Single 時,可能會發生精度丟失,但並不引發異常。 但是,如果 Double 的值太大,無法由 Single 表示,則將引發溢出異常。

從自定義對象轉換為基類型

除了支持基類型之間的轉換外,Convert 方法還支持將任何自定義類型轉換為任何基類型。 為此,自定義類型必須實現 IConvertible 接口,該接口定義用於將實現類型轉換為每個基類型的方法。 特定類型不支持的轉換會引發 InvalidCastException。

向 ChangeType 方法傳遞自定義類型作為其第一個參數時,或者在調用 Convert.ToType 方法(如 Convert.ToInt32(Object) 或 Convert.ToDouble(Object, IFormatProvider))並向其傳遞自定義類型的實例作為其第一個參數時,Convert 方法反過來會調用自定義類型的 IConvertible 實現以執行轉換。 有關更多信息,請參見 .NET Framework for Silverlight 中的類型轉換。

區域性特定的格式設置信息

所有基類型轉換方法和 ChangeType 方法都包括具有類型為 IFormatProvider 的參數的重載。 例如,Convert.ToBoolean 方法具有下面兩個重載:

Convert.ToBoolean(Object, IFormatProvider)

Convert.ToBoolean(String, IFormatProvider)

IFormatProvider 參數可以提供區域性特定的格式設置信息以幫助轉換過程。 但是,大多數基類型轉換方法忽略了該參數。 只有下列基類型轉換方法使用該參數:

將值轉換為數值類型的方法。 IFormatProvider 參數由具有類型為 String 和 IFormatProvider 的參數的重載使用。 它也由具有類型為 Object 和 IFormatProvider 的參數的重載使用(如果對象的運行時類型為 String)。

將值轉換為日期和時間的方法。 IFormatProvider 參數由具有類型為 String 和 IFormatProvider 的參數的重載使用。 它也由具有類型為 Object 和 IFormatProvider 的參數的重載使用(如果對象的運行時類型為 String)。

包含 IFormatProvider 參數並將數字值轉換為字符串或將 DateTime 值轉換為字符串的 Convert.ToString 重載。

但是,實現 IConvertible 的任何用戶定義類型都可以使用 IFormatProvider 參數。

其他轉換方法

有一組方法可支持字節數組與 String 或由以 64 為基的數字字符組成的 Unicode 字符數組之間的轉換。 表示為以 64 為基的數字的數據可以很容易地通過只能傳輸 7 位字符的數據信道進行傳送。

 

Parse意為解析方法,顧名思義就是解析字符串的方法,例如DateTime.Parse(string s),就是將s解析成DateTime格式,即將日期和時間的字符串表示形式轉換為其等效的DateTime。

但需要注意是 因為日期和時間的字符串表示形式必須符合公認的模式,你應該總是調用時使用異常處理解析方法來分析用戶的輸入。 如果你不想處理異常,你可以調用的DateTime TryParse的方法來分析日期和時間字符串,這個方法返回一個值,指示分析操作是否成功。

 更多細節請參考(http://msdn.microsoft.com/zh-cn/library/System.DateTime.Parse(v=vs.110).aspx

-----------------------------------------------------我是分割線--------------------------------------------------------

感謝@muki的指導,其中還有個比較方便的方法是DateTime.ParseExact(string s, string format, IFormatProvider provider),詳細如下

 1  //
 2         // 摘要: 
 3         //     使用指定的格式和區域性特定格式信息,將日期和時間的指定字符串表示形式轉換為其等效的 System.DateTime。 字符串表示形式的格式必須與指定的格式完全匹配。
 4         //
 5         // 參數: 
 6         //   s:
 7         //     包含要轉換的日期和時間的字符串。
 8         //
 9         //   format:
10         //     用於定義所需的 s 格式的格式說明符。
11         //
12         //   provider:
13         //     一個對象,提供有關 s 的區域性特定格式信息。
14         //
15         // 返回結果: 
16         //     一個對象,它等效於 s 中包含的日期和時間,由 format 和 provider 指定。
17         //
18         // 異常: 
19         //   System.ArgumentNullException:
20         //     s 或 format 為 null。
21         //
22         //   System.FormatException:
23         //     s 或 format 是空字符串。 - 或 - s 不包含與 format 中指定的模式相對應的日期和時間。 - 或 - s 中的小時組成部分和
24         //     AM/PM 指示符不一致。
25         public static DateTime ParseExact(string s, string format, IFormatProvider provider);
DateTime ParseExact

其中需要注意的是雖然這個方法能直接"讀懂""yyyyMMdd",但是你必須在format這個參數中指定,而且s的長度必須和format一致,不然同樣會報錯。另外一個值得注意的地方是provider參數,參數解釋為   一個對象,提供有關 s 的區域性特定格式信息,如關聯的語言、子語言、國家/地區、日歷和區域性約定。

如關聯的語言、子語言、國家

/

地區、

日歷和區域性約定。

關於Convert.ToDateTime(string s),DateTime.Parse(string s)有什么區別,如果您有更詳細的說明和更深入的理解請和我交流,如果有不正確的地方請多多指教。

再次感謝您的閱讀,感謝各位大大!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM