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屬性有關系。