遠い記憶

导航

网站全球化:时间问题

我家附近有一家宾馆,墙上挂着各种钟,有的是7点,有的是8点,有的是9点,还有个12点的。也不知道哪个时间是对的,后来宾馆服务员告诉我说,7点的是纽约时间,8点的是北京时间,9点的是东京时间,12点的是伦敦时间而且不是12点是0点。于是我凌乱了。

后来上了几天学,老师教给我说,一天有24个小时,把地球竖着切成24块,相临的两块相差1个小时。格林威治天文台所在的那块的时间叫世界时(UTC - Coordinated Universal Time),也叫格林威治时间(GMT - Greenwich Mean Time),180度经线定为国际日期变更线(IDL - International Date Line),两边差1天。

但是,如果你真的以为世界只有这24个时区,那你就太天真了。中国所在的时区是GMT+08:00,有个叫仰光的地方,时区是GMT+06:30,而加德满都的时区竟然是GMT+05:45。看来时区也是可以有零有整的。

可问题远没有到此为止,1986年5月4日凌晨2点,时钟向前拨1个小时,中国开始实行夏令时(DST - Daylight Saving Time)。虽然6年后的1992年中国暂时停止了夏令时的使用。但目前还有很多资本主义国家依然在使用夏令时。

如果不去考虑这些问题,会怎样呢。

当你的网站推向世界的时候,一个来自英国的会员提交了一份申请,时间显示为17:00,可是他的时间是上午9:00。

公司老大用你的系统发布了一则会议通知,时间是14:00,结果来自日本的同事提前到了1个小时。

好在.NET Framework 从2.0开始为我们提供了TimeZoneInfo来进行时间上的协调,他可以把UTC时间转为当地时间,也可以把当地时间转换为UTC时间,还可以判断这个时间是否存在。

为什么会有不存在的时间呢?让我们回到想当初的中国,1986年5月4日凌晨1:59:59。再过1秒,时间将进入中国的夏令时,前进1个小时,就是说,接下来的时间不是2:00而是3:00。GMT+8 1986-05-04 02:00:00 这个时间是不存在的。

说完上面的废话,接下来要说下面的废话了。

首先为会员增加一个TimeZoneInfo的属性,标识他使用哪个时区的时间。

系统自动产生当前时间时用DateTime.UtcNow,会员输入时间时使用TimeZoneInfo.ConvertTimeToUtc(时间, 会员时区)转为UTC时间,这里需要判断时间的合法性,最后把UTC时间存入数据库。

显示时间的时候,从数据库中读出UTC时间,根据会员的TimeZoneInfo属性来转为当地时间显示,TimeZoneInfo.ConvertTimeFromUtc(时间, 会员时区)。

还有最后一个问题,如果是匿名访问,怎么办呢?

唉,这个问题,我没有找到好的办法,时区信息是属于系统的,浏览器恐怕也没那么大的权利去拿这个信息。

如果有IP地址库对应的时区表,进行一个检索直接拿到访问者的时区信息就方便多了,目前看来,IP地址库对应地区的很多,但对应时区的我还没有找到。

否则只能用javascrip的new Date().getTimezoneOffset()获得一个以分为单位的偏移量,乘以-1后提给服务器再做打算了。

 

这个是一对一教学的预约功能截图,首先使用北京时间为教师开设可预约的时间,从早上8点开始。取得时间后转换为UTC时间写入数据库。

学生进行预约时,从数据库中读出UTC时间,并转换为学生当地时间再进行处理。因为当前学生的设置是UTC时间,所以被自动转换为凌晨0点。

posted on 2012-12-20 22:10  遠い記憶  阅读(240)  评论(0编辑  收藏  举报