[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[备忘]java序列化,java.sql.Time值受新加坡时区影响,差了半小时

上一篇:[备忘]gdb做jvm的dump
下一篇:[备忘]git慎用revert功能,可能导致代码丢失

添加日期:2021/12/6 16:02:13 快速返回   返回列表 阅读717次
现象,服务器是北京时区,客户电脑选的新加坡时区。
按理都是东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
 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved