質問: new GregorianCalendar(TimeZone.getTimeZone("JST")); cl.set(uear, month-1, day, hour, minute, second); cl.getTime(); ``` このCalendarを使用するコードは動作する端末のディフォルトタイムゾーンにより思うように動作しません。 私は事前にJSTをCalendarにセットすれば`set`メソッドで指定する数値はJSTのものでいいと思っていましたがそうではないみたいで 例えば ***2020/06/27 00:54:01 557*** という日付をCalendarでDateに変換したとき、 ***【UTC端末で実行したら】*** Fri Jun 26 15:54:01 UTC 2020 1593186841557 このタイムスタンプを日本時間に変換すると「2020/06/27 00:54:01」なので正常 ***【JST端末で実行したら】*** Sat Jun 27 09:54:01 GMT+09:00 2020 1593219241766 このタイムスタンプを日本時間に変換すると「2020/06/27 09:54:01」となりタイムゾーン関連で期待通りの数値になりませんでした。 どのような方法がありますでしょうか?
回答: `OffsetDateTime.of()`で`OffsetDateTime`オブジェクトを生成した後、`Date`へ変換することができます。 ``` // 2020/06/27 00:54:01 557 (JST) // 注: 第7引数はミリ秒でなくナノ秒 final OffsetDateTime datetime = OffsetDateTime.of(2020, 6, 27, 0, 54, 1, 557_000_000, ZoneOffset.ofHours(9)); // final ZonedDateTime datetime = ZonedDateTime.of(2020, 6, 27, 0, 54, 1, 557_000_000, ZoneId.of("JST", ZoneId.SHORT_IDS)); final Date date = Date.from(datetime.toInstant()); System.out.println(date); System.out.println(date.getTime()); ```