タイムゾーンの処理
CoddyのJavaジャーニー「ロジックとフロー」セクションの一部 — レッスン 59/59。
JavaのZonedDateTimeは、タイムゾーンを持つ日付と時間を表します。異なるタイムゾーンを扱う場合や、それらの間で変換を行う場合に便利です。
特定のタイムゾーンで時刻を作成します:
ZonedDateTime tokyo = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));また、.atZone()を使用して、LocalDateTimeからZonedDateTimeを作成することもできます。
LocalDateTime localDT = LocalDateTime.of(2024, 3, 15, 10, 30);
ZonedDateTime tokyo = localDT.atZone(ZoneId.of("Asia/Tokyo"));タイムゾーン間で時刻を変換します:
ZonedDateTime newYork = tokyo.withZoneSameInstant(ZoneId.of("America/New_York"));上記のコードを実行した後、newYork は tokyo と同じ瞬間を保持しますが、ニューヨークのタイムゾーンになります:
2024-03-15T10:30-04:00[America/New_York]
// 出力例ZonedDateTimeをフォーマットするには、DateTimeFormatterを使用します。パターン文字ZまたはXXXを使用して、出力にタイムゾーンのオフセットを含めることができます:
// オフセットなし
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
// オフセットあり (例: +09:00 または -04:00)
DateTimeFormatter fmtWithOffset = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm XXX");
String result = newYork.format(fmtWithOffset);
// 例: 2024-03-15 10:30 -04:00チャレンジ
簡単4つの引数を受け取るconvertTimeという名前のメソッドを作成してください:
- "yyyy-MM-dd HH:mm"形式の文字列(
dateTimeStr) - 変換元のタイムゾーンIDの文字列(
sourceZone) - 変換先のタイムゾーンIDの文字列(
targetZone) - 出力にタイムゾーンのオフセットを含めるかどうかを示すboolean値(
showOffset)
このメソッドは以下の処理を行う必要があります:
- 変換元のタイムゾーンで入力日時を解析する
- それを変換先のタイムゾーンに変換する
- 両方の時間に関するフォーマットされた情報を返す
返されるメッセージは以下の通りである必要があります:
- 日時が不正な場合:"Invalid datetime format"を返す
- タイムゾーンが不正な場合:"Invalid time zone"を返す
showOffsetがtrueの場合:出力にオフセットを含める- フォーマット:"Source: [time1], Target: [time2]"
自分で試してみよう
import java.util.Scanner;
import java.time.*;
import java.time.format.*;
public class Main {
public static String convertTime(String dateTimeStr, String sourceZone,
String targetZone, boolean showOffset) {
// ここにコードを書いてください
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String dateTimeStr = scanner.nextLine();
String sourceZone = scanner.nextLine();
String targetZone = scanner.nextLine();
boolean showOffset = Boolean.parseBoolean(scanner.nextLine());
System.out.println(convertTime(dateTimeStr, sourceZone, targetZone, showOffset));
}
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。