

2016年1月1日 0時0分0秒00ミリ秒」の情報を持つDateクラスインスタンスを生成すること、その後、1970 年 1 月 1 日 00:00:00
GMT からの経過時間をミリ秒数で表示する方法を知りたいです。

タイムゾーンをJSTにする処理と、ミリ秒を指定する処理のやり方がわかりません。


CC BY-SA 4.0
2019-10-19T05:59:35.040
59806
2020-06-26T21:08:22.643
2019-10-19T21:43:16.897
3605
36259
question
java
JavaにおけるDate型の利用


Date型のインスタンス生成ですが，最近のJavaですとDateに特定の日付をsetしてインスタンス化するというのは非推奨となっているため，Calendarクラスで一度インスタンス化してからDate型に変換します．  
また，同時にTimezoneも指定してやります．

[code]

    Calendar cal = Calendar.getInstance();
    TimeZone jst = TimeZone.getTimeZone("JST");
    cal.set(2016, 1, 1, 0, 0, 0);
    cal.setTimeZone(jst);
    Date date = cal.getTime();
    
[/code]

ミリ秒はDateクラスのgetTimeメソッドで取得できます．

[code]

    long ms = date.getTime();
    
[/code]


CC BY-SA 4.0
2019-10-19T17:28:09.517
59815
2019-10-19T17:28:09.517
29506
59806
answer


Java8以降では新しい日付時刻型を利用し、`java.util.Date`などの旧来の型へは(過去のAPIを利用する場合など)必要に応じて変換することが推奨されます。

質問文の通りに書くと次のようになります:

[code]

    // 2016年1月1日
    // 補足: 最後の引数はミリ秒でなくナノ秒です
    final LocalDateTime time = LocalDateTime.of(2016, 1, 1, 0, 0, 0, 0);
    System.out.println("datetime: " + time);
    
    // "日本時間の"2016年1月1日
    // 補足: "JST"のようなショートゾーンIDの使用は推奨されていません(JavaDoc参照)
    // https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/time/ZoneId.html#SHORT_IDS
    final ZoneId jst = ZoneId.of("JST", ZoneId.SHORT_IDS);
    final ZonedDateTime jstTime = ZonedDateTime.of(time, jst);
    System.out.println("datetime(JST): " + jstTime);
    
    final OffsetDateTime baseTime = OffsetDateTime.of(1970, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC);
    System.out.println("base: " + baseTime);
    
    final long millis = ChronoUnit.MILLIS.between(baseTime, jstTime);
    System.out.println("diff: " + millis);
    
    // Java8 Dae&Time型から java.util.Date型への変換
    final Date jstDate = Date.from(jstTime.toInstant());
    System.out.println("date: " + jstDate);
    
[/code]

冗長(と思われる)処理を省くとこんな感じになります:

[code]

    // 2016-01-01T00:00+09:00
    final ZoneOffset offset = ZoneOffset.ofHours(9);
    final OffsetDateTime japaneseTime = OffsetDateTime.of(2016, 1, 1, 0, 0, 0, 0, offset);
    System.out.println("time(+9:00): " + japaneseTime);
    
    // 任意の時点の差分を取りたいわけではなくエポック秒を得たいだけなので計算不要
    final long millis = japaneseTime.toInstant().toEpochMilli();
    System.out.println("diff: " + millis);
    
    // Java8 Dae&Time型から java.util.Date型への変換
    final Date date = Date.from(japaneseTime.toInstant());
    System.out.println("date: " + date);
    
[/code]


CC BY-SA 4.0
2019-10-20T05:12:05.967
59821
2020-06-26T21:08:22.643
2020-06-26T21:08:22.643
2808
2808
59806
answer