私はタイマーを使用して特定の期間内に特定のタスクを実行しています。このメソッドは、その日付からタスクを開始し、すべての期間に繰り返す場合は、Date型が必要です。特定のタイムゾーンで日付を設定するには?
私は何時間も解決策を見出そうとしていましたが、何も思い付きませんでした。私はカレンダーを作成し、タイムゾーンを設定します。そして、そのカレンダーから日付を取得すると、この日付に私のローカル時刻が含まれます。 SimpleDataFormatを使用してDateからstringを取得しようとしましたが、SimpleDataFormatのタイムゾーンを個別に設定していたために機能しました。その後、その文字列を日付に解析しようとしても、それはまだ動作しませんでした。私はちょっとこの時点で絶望的です。カレンダーのタイムゾーンを設定できない場合はどうすればいいですか?私は現地時間を得ていない場合でも、何かをすることができましたが、代わりにUTCを取得していました。しかしそれはどちらの場合もそうではありません。私は、このアプリケーションをコンピュータの現地時間に基づいて実行させたくありません。それは地元の時間を得て、それを私が望む時間帯に変えることができるはずです。
コード:
TimeZone eu = TimeZone.getTimeZone("GMT+1");
TimeZone america = TimeZone.getTimeZone("EST");
TimeZone asia = TimeZone.getTimeZone("GMT+7");
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
df.setTimeZone(eu);
Calendar euCal = Calendar.getInstance(eu);
Date dateEu = euCal.getTime();
System.out.println(dateEu); //Prints local time date
euCal.setTimeZone(eu);
System.out.println(dateEu); //Still prints local time date
String formattedDateEu = df.format(dateEu);
System.out.println(formattedDateEu); //This one works fine but it is string
try {
dateEu = df.parse(formattedDateEu);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(dateEu); //Fun part. Although I don't get exception dateEu is still not in the time zone I want.
サンプル出力:
Mon Nov 27 14:37:21 MSK 2017
Mon Nov 27 14:37:21 MSK 2017
27/11/2017 12:37:21
Mon Nov 27 14:37:21 MSK 2017
古い「カレンダー」ではなく、 'Date'を初期化するための最新の' ZonedDateTime'をお勧めします(そして 'java.util.Timer'には' Date'が必要です)。 'ZonedDateTime'を表示すると、タイムゾーンが正しいことがわかります。 'Date'に変換するには' Date.from(yourZonedDateTime.toInstant()) 'を使います。 –
'Date'クラスには多くの設計上の欠陥があります。その1つはJVMの現在のデフォルトタイムゾーンを適用してその値を表すStringを生成する' toString'メソッドです。このクラスは 'Calendar'と一緒になりましたので、避けて、java.timeクラスに置き換えてください。レガシークラスとモダンクラスを変換するには、古いクラスに追加された新しいメソッド、特に 'Date.from(instant)'を調べてください。 –