365連休

にわかのandroidとかの開発メモ。

JavaのDateクラスとタイムゾーン

今更Dateクラス!

 

Dateクラスにはローカルのタイムゾーンが適用される!!!

 

でもgetTime()はGMT(≒UTC)

 

import java.util.Date;

public class HelloWorld{
     public static void main(String []args){
         //シリアル値から日付を取り出して再度Dateオブジェクト生成
         Date now = new Date(2020-1900, 1-1, 1);
         Date copy = new Date(now.getTime()/(1000*60*60*24L)*1000*60*60*24L);
         System.out.println(java.util.TimeZone.getDefault().getID());
         System.out.println(now + "\n" + copy);
     }
}

 

UTCロケールで実行

Etc/UTC
Wed Jan 01 00:00:00 UTC 2020
Wed Jan 01 00:00:00 UTC 2020

 

日本で実行

Asia/Tokyo
Wed Jan 01 00:00:00 JST 2020
Tue Dec 31 09:00:00 JST 2019 <--日付変わってる!!!!!!

 

 

改良案

import java.util.Date;

public class HelloWorld{
     public static void main(String []args){
         //シリアル値から日付を取り出して再度Dateオブジェクト生成
         
         //UTCで初期化すればgetTime()による演算は期待通り
         //Date now = new Date(2020-1900, 1-1, 1);
         Date now = new Date(Date.UTC(2020-1900, 1-1, 1, 0, 0, 0));
         
         Date copy = new Date(now.getTime()/(1000*60*60*24L)*1000*60*60*24L);
         System.out.println(java.util.TimeZone.getDefault().getID());
         System.out.println(now + "\n" + copy);
     }
}

 

日本で実行

Asia/Tokyo
Wed Jan 01 09:00:00 JST 2020
Wed Jan 01 09:00:00 JST 2020

 

 

 

日付トリビア

neet-rookie.hatenablog.com