Menu
CoddyTech

タイムゾーンの処理

CoddyのJavaジャーニー「ロジックとフロー」セクションの一部。レッスン 59/59。

Java の ZonedDateTime は、タイムゾーン付きの日付と時刻を表します。異なるタイムゾーンを扱ったり、タイムゾーン間で変換したりする場合に便利です。

特定のタイムゾーンで時刻を作成します:

ZonedDateTime tokyo = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));

LocalDateTimeを使用してZonedDateTimeを.atZone()から作成することもできます。

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を使用します。xxxパターンでオフセットを追加します。これは+09:00または-04:00として出力され、ゼロオフセットは+00:00として出力されます(代わりに、大文字のXXXではゼロオフセットがZとして出力されます)。

// オフセットなし
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
challenge icon

チャレンジ

簡単

convertTimeという名前のメソッドを作成し、4つの引数を受け取るようにします:

  1. 形式が "yyyy-MM-dd HH:mm" の String(dateTimeStr)
  2. ソースタイムゾーン ID の String(sourceZone)
  3. ターゲットタイムゾーン ID の String(targetZone)
  4. 出力にタイムゾーンオフセットを含めるかどうかを示す boolean(showOffset)

メソッドは次の処理を行う必要があります:

  1. 入力日時をソースタイムゾーンで解析する
  2. ターゲットタイムゾーンに変換する
  3. 両方の時刻に関する書式設定済みの情報を返す

返すメッセージは次のとおりです:

  • 日時が無効な場合:"Invalid datetime format" を返す
  • ゾーンが無効な場合:"Invalid time zone" を返す
  • showOffset が true の場合:出力にオフセットを含め、xxx パターンで書式設定する。そのため、オフセットがゼロの場合は +00:00 と表示されます
  • 形式:"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));
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン

自分で練習してみよう: Javaオンラインコンパイラ