68042


JST の 「年 月 日 時 分 秒 ミリ秒」 からDateをインスタンス化したいです。  
それは↓のコードで完璧に動作します。

[code]

    SimpleDateFormat format = new SimpleDateFormat("yyyy MM dd HH mm ss SSS z");
    format.parse(new StringBuilder()
    .append(year).append(' ')
    .append(month).append(' ')
    .append(day).append(' ')
    .append(hour).append(' ')
    .append(minute).append(' ')
    .append(second).append(' ')
    .append(milli).append(" JST").toString());
    
[/code]

ですが、このコードは非効率だと思います。  
なぜなら、日付情報などはフォーマットで保持しておらず、最初から整数として持っているからです。  
このコードだと  
年月日などの整数 → フォーマット → フォーマット解析 → Date  
という処理になってしまいます。

もっと効率よくDateをインスタンス化する方法を探しています。

[code]

    Calendar cl = new GregorianCalendar(TimeZone.getTimeZone("JST"));
    cl.set(uear, month-1, day, hour, minute, second);
    cl.getTime();
    
[/code]

この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」となりタイムゾーン関連で期待通りの数値になりませんでした。

どのような方法がありますでしょうか？


CC BY-SA 4.0
2020-06-26T18:19:21.210
68041
2020-06-26T21:09:27.200
10346
question
java kotlin
Java で 年月日 などから Date をインスタンス化する


`OffsetDateTime.of()`で`OffsetDateTime`オブジェクトを生成した後、`Date`へ変換することができます。

[code]

    // 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());
    
[/code]


CC BY-SA 4.0
2020-06-26T20:55:53.480
68042
2020-06-26T21:09:27.200
2020-06-26T21:09:27.200
2808
2808
68041
answer