天天看點

CultureInfo.InvariantCulture 作用

sql的處理

經常會遇到拼sql的情況,将datetime拼到sql中以前的寫法不統一,有直接寫datetime.tostring()的,有寫datetime.toshortdatestring(),還有datetime.tostring("yyyy-mm-dd").總之,寫法不一。這些方法都和

thread.currentthread.currentculture有關系,這就是目前線程的文化。在應用程式啟動時,會複制作業系統的區域設定到currentculture中,直接導緻了不同的問題設定,導緻tostring()的結果不同。例如。設定為中文(台灣)時為2008/7/30

下午 08:49:43,設定為中國(香港特别行政區)為30/7/2008

20:49:43,這些tostring()的格式直接拼到sql中執行,會報錯,日期格式無法解析正确。

看到網上提到了有2個格式是不受語言影響的iso,iso 8601,使用這2中格式就能避免上面的問題,

c#

的表示方法是datetime.now.tostring(‘s‘,datetimeformatinfo.invariantinfo),但是這個沒有毫秒,是以使用自定義的格式

datetime.now.tostring("yyyy-mm-ddthh:mm:ss.fff",datetimeformatinfo.invariantinfo);這樣日期的序列化和反序列化都可以用這個格式啦。

"datetimeformatinfo.invariantinfo"可以替換成cultureinfo.invariantculture

msdn上的解釋是;

cultureinfo.invariantculture 屬性

擷取不依賴于區域性(固定)的 。 

固定區域性不區分區域性。可以使用空字元串

("") 按名稱或者按區域性辨別符 0x007f

來指定固定區域性。invariantculture 檢索固定區域性的執行個體。它與英語語言關聯,但不與任何國家/地區關聯。它幾乎可用在要求區域性的“全局化”命名空間中的所有方法中。

要做到國際化還需要注意一個問題,資料庫存儲的日期時間需要存utc時間,這個時間是一個标準時間和時區就沒有關系了。舉個例子,在中原標準時間和越南河内的時間相差一個小時,在越南發送一個資訊存入資料庫,在北京這邊看這條資訊的時間應該是同一個時間。是以現在就存在一個問題,如果我們顯示的時間都是本地時間,就需要将utc時間存入資料庫中,因為越南的本地時間和北京的本地時間差一個小時呢?除非給客戶顯示的是跟時區沒有關系的utc時間。本地時間和utc時間的轉化也很簡單,c#代碼是

datetime.touniversaltime();

datetime.tolocaltime();

這種轉化跟datetime.kind屬性有關系。