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 属性

获取不依赖于区域性(固定)的 CultureInfo。 
固定区域性不区分区域性。可以使用空字符串 ("") 按名称或者按区域性标识符 0x007F 来指定固定区域性。InvariantCulture 检索固定区域性的实例。它与英语语言关联,但不与任何国家/地区关联。它几乎可用在要求区域性的“全局化”命名空间中的所有方法中。

要做到国际化还需要注意一个问题,数据库存储的日期时间需要存UTC时间,这个时间是一个标准时间和时区就没有关系了。举个例子,在北京时间和越南河内的时间相差一个小时,在越南发送一个信息存入数据库,在北京这边看这条信息的时间应该是同一个时间。所以现在就存在一个问题,如果我们显示的时间都是本地时间,就需要将UTC时间存入数据库中,因为越南的本地时间和北京的本地时间差一个小时呢?除非给客户显示的是跟时区没有关系的UTC时间。本地时间和UTC时间的转化也很简单,C#代码是

datetime.ToUniversalTime();
datetime.ToLocalTime();

这种转化跟datetime.Kind属性有关系。

posted on 2014-05-04 09:22  黑夜寻梦  阅读(4999)  评论(0编辑  收藏  举报