2

バックグラウンド

さまざまな時間関連のデータ操作を処理するために、Android 用のthreetenbp バックポート( here )を使用しています。

それらの 1 つは、時刻を別のタイムゾーンに変換することです (現在の UTC とその逆)。

次のようなものを使用すると、これが可能になることがわかります。

LocalDateTime now = LocalDateTime.now();
LocalDateTime nowInUtc = now.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime();

これは問題なく機能し、逆の操作も非常に簡単です。

問題

ライブラリの初期化を回避しようとしています。これにより、ゾーンのかなり大きなファイルがライブラリにロードされます。これを使わずにさまざまな日付/時刻関連の操作を処理する方法を既に理解しています。ただし、UTC に変換して元に戻す場合は除きます。

私が得たものには、正しい変換から 1 時間ずれているエラーがあります。

私が試したこと

これは私が見つけて試したものです:

// getting the current time, using current time zone: 
Calendar cal = Calendar.getInstance();
LocalDateTime now = LocalDateTime.of(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH), cal.get(Calendar.HOUR_OF_DAY),
            cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), cal.get(Calendar.MILLISECOND) * 1000000);

//the conversion itself, which is wrong by 1 hour in my tests: 
LocalDateTime alternativeNowInUtc = now.atZone(ZoneOffset.ofTotalSeconds(TimeZone.getDefault().getRawOffset() / 1000)).withZoneSameInstant(ZoneId.ofOffset("UTC", ZoneOffset.ofHours(0))).toLocalDateTime();

質問

私が書いたことの正確な何が問題なのですか?ライブラリを初期化せずに時間を変換するための代替コードを取得するにはどうすればよいですか?

入力として LocalDateTime のインスタンスが与えられた場合、それを現在のタイムゾーンから UTC に、および UTC から現在のタイムゾーンに変換するにはどうすればよいですか?

4

2 に答える 2