バックグラウンド
さまざまな時間関連のデータ操作を処理するために、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 から現在のタイムゾーンに変換するにはどうすればよいですか?