SimpleDateFormat的时区记录

在开发过程中,经常碰到时区问题,一般解决思路,数据库时区问题,
服务器时区,还有就是数据返回出去的时候(例如spring jackson )
在这几个解决思路中,有些是要用到Date 和 String 进行转换的。所以这
我想记录下SimpleDateFormat平日使用可能会被忽略的知识点

Date 转 String

    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(sdf.format(new Date()));
    }

上述代码很简单,就是直接当前时间并按照制定格式输出。
这里我想应该要明白以下几个点:

  • (1)Date 内部存储其实是个Long 类型的时间戳,可以通过new Date()源码发现
//new Date() 相关源码
    private transient long fastTime;
    ...
    public Date(long date) {
        fastTime = date;
    }
    ...
    public Date() {
        this(System.currentTimeMillis());
    }
  • (2)SimpleDateFormat 在没有指定TimeZone的情况下,其实是以当前系统的时区的。
    测试环境:
    在这里插入图片描述
    上述代码执行结果:和当前系统时间一致
    在这里插入图片描述
    测试环境:将系统时区改成其它地区的
    在这里插入图片描述
    上述代码执行结果:和当前系统时间一致
    在这里插入图片描述
    现在代码里指定下TimeZone,结果将会按照设定的时区去format。
    测试环境:
    在这里插入图片描述
    代码执行:
    在这里插入图片描述
  • (3)format(Date date) 方法就是把时间戳 按照时区抓成对应格式的时间字符串

String 转 Date

其实和上面的 Date 转 String 很类似 , 在没有指定TimeZone的情况下,采用当前系统的时区;否则按照指定的时区进行转换。

测试环境:
在这里插入图片描述
代码执行:
在这里插入图片描述
在这里插入图片描述
所以,parse(String ) 是将 指定TimeZone的时区的字符串 转成 和当前系统时区一致的 Date 对象。

总结:当SimpleDateFormat 设定了时区的情况下:

转换结论
Date => StringDate 里存储的时间戳 转成指定时区下的字符串
String => Date指定时区下的字符串 转成当前系统里的Date

**时区 对应的 都是字符串 **

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值