java时间中的1970-01-01 00:00:00转成时间戳为什么会是一个负数-28800000
- 问题重现:
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = fmt.parse("1970-01-01 00:00:00");
System.out.println(date.getTime());//-28800000
- 分析:
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(simpleDateFormat.format(new Date(0)));//1970-01-01 08:00:00
- 结果:
可以发现起始时间是从1970-01-01 08:00:00开始的,1970-01-01 00:00:00这个时间是1970-01-01 08:00:00之前的,所以是负的
记一次粗心导致的问题(将负数的时间戳转换成日期格式的字符串的时候相差12个小时)
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = fmt.parse("1969-01-01 00:00:00"); System.out.println(date.getTime());//-31564800000
Date data = new Date(date.getTime());
System.out.println(fmt.format(data));//1969-01-01 12:00:00
原因分析:
SimpleDateFormat中的小时用的是h而不是H,具体详见下方的时间格式yyyyMMddHHmmss的大小写,和字母含义。
字母 | 日期或时间元素 | 表示 | 示例 |
---|---|---|---|
G | Era 标志符 | Text | AD |
y | 年 | Year | 1996 ; 96 |
M | 年中的月份 | Month | July ; Jul ; 07 |
w | 年中的周数 | Number | 27 |
W | 月份中的周数 | Number | 2 |
D | 年中的天数 | Number | 189 |
d | 月份中的天数 | Number | 10 |
F | 月份中的星期 | Number | 2 |
E | 星期中的天数 | Text | Tuesday ; Tue |
a | Am/pm 标记 | Text | PM |
H | 一天中的小时数(0-23) | Number | 0 |
k | 一天中的小时数(1-24) | Number | 24 |
K | am/pm 中的小时数(0-11) | Number | 0 |
h | am/pm 中的小时数(1-12) | Number | 12 |
m | 小时中的分钟数 | Number | 30 |
s | 分钟中的秒数 | Number | 55 |
S | 毫秒数 | Number | 978 |
z | 时区 | General time zone | Pacific Standard Time ; PST ; GMT-08:00 |
Z | 时区 | RFC 822 time zone | -0800 |