最近项目上想使用时间戳,做防止重放攻击的校验(时间差N分钟则认为是重放攻击,拒绝处理)
但是发现普通的"yyyy-MM-dd HH:mm:ss"格式的时间,在各个时区中,会出现问题.
时间戳的就是要能在各个时区之间,统一的转好转换.大家处于物理上的同一时刻.
你是东八区的时区,我是东九区的时区.你8点整,正好是我的9点整.
实现方案:
1.timestamp 是指格林威治时间( GMT ) 1970 年 01 月 01 日 00 时 00 分 00 秒起至现在的总秒数。同一时刻,在全世界任何地点获取的值都是一样的。
java用long currentTime = System.currentTimeMillis();来实现
long currentTime = System.currentTimeMillis();
System.out.println(currentTime);
System.out.println(System.nanoTime());
SimpleDateFormat dong8 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dong8.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));
Date date8 = new Date(currentTime);
System.out.println(dong8.format(date8));
SimpleDateFormat dong9 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dong9.setTimeZone(TimeZone.getTimeZone("GMT+09:00"));
Date date9 = new Date(currentTime);
System.out.println(dong9.format(date9));
输出
2019-07-10 15:29:16
2019-07-10 16:29:16
2.使用带时区的字符串
//转换为东八区时间
String str = "2019-07-10 19:09:32 GMT+10:00";
try {
SimpleDateFormat simpleDateFormat4 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
Date date4 = simpleDateFormat4.parse(str);
System.out.println("转换为东八区时间:" + simpleDateFormat4.format(date4));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
输出
转换为东八区时间:2019-07-10 17:09:32 GMT+08:00