在开发过程中,经常碰到时区问题,一般解决思路,数据库时区问题,
服务器时区,还有就是数据返回出去的时候(例如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 => String | Date 里存储的时间戳 转成指定时区下的字符串 |
String => Date | 指定时区下的字符串 转成当前系统里的Date |
**时区 对应的 都是字符串 **