时区划分
- UTC:Coordinated Universal Time- 世界协调时间,零时区
- CST:4个不同的时区时间
- Central Standard Time (USA) UT-6:00
- Central Standard Time (Australia) UT+9:30
- China Standard Time UT+8:00
- Cuba Standard Time UT-4:00
- GMT:「格林威治标准时间」(Greenwich Mean Time,简称G.M.T.)
- PST:太平洋标准时间
关系:
UTC=GMT
CST=UTC/GMT +8=PST+8+8
CST=CET+7
UTC=PST+8
目前阿里的服务器统一采取的UTC时区,不带有任何地区标识
地时
时间由两个维度进行标识:时间值+时区
地球处于某一自转状态时对应的时间为地时,地时由时间值和时区组成,即(时间值,时区)二维坐标。地球某一自转状态时,不同时区的时间值不相同,但地时为同一个。地时有多种表达方式,每一个时区都对应一种表达方式,但都是等价的。
例如,(8:00,UTC+01),(9:00,UTC+02),(10:00,UTC+03),(11:00,UTC+04)
这4个地时为等价地时,同一地时在不同时区的转换称为地时的等价转换或恒定转换,将地时转化为相同时区称为地时的共区化。地时只能在相同时区下才能比较,这称为地时的同区比较
因此,对于时间的判断或传递。需要传入时区以及时间值,创建时间也需要包含时区信息,如果未包含,则时间信息无效
业务可能涉及的时区分类:
服务器的系统时间
它影响应用中new Date的值和date toString展示的时区标志,注意Date自身不包含时区标志,它本质上只是个时间戳,toString时仅仅取服务器系统时区作为date的时区标志
sessionTimeZone
它为应用与db会话时所定的时区,db根据这个时区来判断所接收到date的时区。
<bean id="db_config_shareipayment" class="com.alipay.zdatasource.LocalTxDataSourceDO">
<property name="jndiName" value="ShareipaymentDataSource"/>
<property name="connectionURL" value="jdbc:mysql://ipaymydev.devdb.alipay.net:3306/share_ipayment"/>
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="connectionProperties">
<map>
<entry key="sessionTimeZone" value="PST"/>
</map>
</property>
</bean>
数据库的系统时区
sql生成的时间的出生时区。如sql中使用set gmt_modified=sysdate()
时区问题解决
-
采取时间戳,因为不同时区的时间戳值一致,缺点主要是时间戳只能用到204X年
-
确定时区,恒定转换
在进行时间比较,都需要确定两者的时区一致,或者进行时间的返回渲染页面,也需要确保返回的时间和端的时区一致,以及时间的传递需要保证时间值+时区都穿
洛杉矶时间
洛杉矶时间会涉及冬令时和夏令时的变动,需要注意