随着云计算时代的到来,应用的用户可能来自世界各地,如果依然固执的认为时间都是北京时间,就有些固步自封了。
时区的问题非常复杂,不时会让人陷入迷惘之中。下面我为介绍一下我项目中的经验,希望抛砖引玉,让我们且行且思考。
很久很久以前,一般企业应用都是这样假定的:客户端(使用者),应用服务器,DB服务器都位于同一个时区,它们的时间被精准同步。
客户端时区 / 应用服务器时区 / DB服务器时区 |
TZ(+8:00) |
这种情况下,开发者无需考虑时区的问题,在任何一层取时间,如js端的new Date(), .Net 端的DateTime.Now, DB端的getDate()之类,获取的数据都被认为是相同的。而对于日期数据的传递,一般采用固定格式的字符串,比如yyyy-MM-dd hh:mm:ss。可是时间易逝,纯真难寻。一旦考虑到多时区的问题,这一切立即变得复杂起来:
客户端时区 |
应用服务器时区 |
DB服务器时区 |
TZ-B |
TZ-C |
TZ-D |
对于一个需要支持Global应用,它的用户可能位于不同的时区,应用服务器和DB服务器也可能跨时区部署。现在,一旦你获取时间,或者对时间进行运算,格式化,传输等等,都必须考虑时区问题了。
更为不幸的是,项目的需求可能会进一步加强复杂性:
1. 支持用户设置偏好时区