最近、プロジェクトのタイムスタンプを使用してリプレイ攻撃をチェックしたい(N分の時間差はリプレイ攻撃と見なされ、処理が拒否された)
ただし、一般的な「yyyy-MM-dd HH:mm:ss」形式の時間は、各タイムゾーンで問題があることがわかります。
タイムスタンプは、統一された方法でタイムゾーンを切り替えることができるようにするためです。誰もが同じ物理的な瞬間にいます。
あなたはイースト8地区のタイムゾーンであり、私はイーストナイン地区のタイムゾーンです。8時はまさに私です9時。
実装計画:
1.タイムスタンプは、グリニッジ標準時(GMT)1970年1月1日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