关于时区时间的设计
由于系统使用的地域不同,时区和时间也不同,因此,需要对时区时间处理进行设计,保证系统的时间正确。各个site的时区由用户指定,时间用本地时区时间以字符串保存,使用时带上时区转换为本地时间,终端使用的时区是本地时区,所以时间是本地时间。大多数国家采用夏令时,所以在使用夏令时的时候,把t_timeZone的时区timeZone加1,夏令时结束时,再把t_timeZone的时区timeZone减去1。
一. 选择时区功能。
用户选择国家,然后系统从配置文件查出该国的所有时区,由用户选择。所选择的时区key保存在t_site的timezone字段,在t_timeZone保存其时区、国家、key。国家的时区有资料。当结束夏令时的时候,用户点击一个按钮,系统保存这个结束的时间。在夏令时结束的时候,会把时间减少1小时,因此会有一个小时的重复,比如3点调为2点,就会出现2个2到3点的时间段。为此需要区别后来的2到3点这一个小时,方法是把这个小时的时间对应的timezoneOffset设为1,以后使用时加以区别。timezoneOffset默认为0。一般各国夏令时的这个开始、结束的时间是固定的,比如3月的第一个星期日2点开始,11月的第一个星期日的3点结束,大多数国家的夏令时是有区别的。
与时间相关的表都有timezoneOffset字段,在夏令时结束的时候,对重复的一个小时的时间,将timezoneOffset设为1。以后访问表的日期字段时,需要从夏令时表中查询夏令时结束的时间,如果使用的时间在这个重复的时间段,则通过timezoneOffset字段来区别。
为此需要新增一张夏令时表t_dst_end,保存本区夏令时结束的时间。
二. 选择时间的功能。
1.服务器时间
用DateUtils.formatCurrentDate("GMT+0" ),得到标准时间。显示此时间调用String formatCurrentDate2(String date, "GMT+0");
2.用户界面设置时间。
界面所选择的时间为本地时间,以字符串保存在数据库中,以后可以获取使用这个时间,使用时调用Date getTimeFromString(String date, String countryTo)得到本地时间,参数countryTo为本地时区,显示此时间调用String formatCurrentDate(Date date,String countryTo);,或String formatCurrentDate2(String date,String countryTo);
使用getTimeFromString(Stringdate, String countryTo)方法,不管是哪个时区,结果都是String date的时间。
3.schedule的时间。
取小时可以通过日期调用intgetHour(String countryFrom,String date),类似可以得到年月日、时分秒的数字,便于比较处理。
三. 使用时间的办法。
日期处理工具类DateUtils做了修改,各个方法在参数中加了时区参数StringcountryFrom,以后使用需要加上这个参数。
在用户登录以后,系统从界面选择时区,把时区的key存入t_site表,把国家、时区和key存入t_timeZone;系统使用时区时根据t_site的key从t_timeZone中查询出这个时区timeZone。
2015-3-2