现象,服务器是北京时区,客户电脑选的新加坡时区。 按理都是东8区,应该无所谓。 但是发现java.sql.Time类型序列化,反序列化后,差了半小时。
import java.util.ArrayList; import java.util.List; import java.util.TimeZone;
public class TestTime {
public static void main(String[] args) { //序列化前,时区 TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai")); List<java.sql.Time> list = new ArrayList<>(); java.sql.Time time = java.sql.Time.valueOf("00:00:00"); System.out.println(time); list.add(time); //序列化 byte[] bytes= SerializeUtil.serialize(list); //新时区 TimeZone.setDefault(TimeZone.getTimeZone("Asia/Singapore")); List<java.sql.Time> list2 = (List<java.sql.Time>)SerializeUtil.unserialize(bytes); System.out.println(list2.get(0)); }
}
结果是: 00:00:00 23:30:00
如果不用新加坡,使用Asia/Taipei,则没有问题。 -------------------------------------------- 先看一下历史知识: -------------------------------------------- 1941年二战已打得热火朝天,英国本土也早已被纳粹空军炸得面目全非,天高皇帝远的英属马来亚却仍然优哉游哉地搞所谓“文治”,一些闲得发慌的殖民地上层认为,“马来亚夏令时”所选择的标准子午线“有点歪”,导致夏时制较“规规整整”的印度支那时间快20分钟,显得有些不太方便,遂由马来亚殖民地立法局表决通过,于这年9月1日宣布调整“马来亚夏令时基准子午线”为东经112°30′00",这样一来“跟着马来亚夏令时走”的新加坡标准时间,自然也就随之改变,调整为GMD+7小时30分了。
但这个标准时间是最为短命的一个:同年12月8日,日本不宣而战,从泰国越境偷袭英属马来亚,并于1942年2月中旬逼近了新加坡。当时英国人经营的新加坡要塞,将防御重点放在海上,对从马来半岛方向杀来的日军手足无措,2月15日被迫投降,16日日军占领新加坡,宣布将新加坡改名“昭南岛”,为彰显“正朔”,“昭南岛”的标准时间被强迫改为和东京标准时间一致,即东京所属的东九区标准时间(以东经135°00′00"为基准子午线)GMD+9小时。
1945年8月15日,日军正式宣布投降,新加坡被日本占领时间宣告结束,同年9月13日,新加坡和西马一样被战后恢复的英属马来亚当局宣布“恢复战前标准时间”,即又回到了GMD+7小时30分的标准时间。
马来西亚联邦独立后,西马和东马(沙捞越、沙巴)间关系并不和睦,后者(尤其沙巴)经常宣称要“行使独立权”,马来西亚政府为和缓关系,采取了一系列怀柔措施,其中就包括统一东西马时间,废除夏时制,全马来西亚采用东八区标准时间,即以东经120°00′00"为基准子午线制订的GMD+8小时的标准时间。新加坡为方便和马来半岛频繁的海陆空交通,以及照顾两国间密切的商贸关系,于1981年12月31日通过“宪报”宣布自1982年1月1日起把时钟调快30分钟,以便“和马来西亚的时间保持一致”。 -------------------------------------------- 看明白了吗? java.sql.Time由于只有时分秒,没有日期,默认是1970年1月1日。 这个范围正好是7个半小时的时候。 哈哈~ 只能说,jdk真nb
|