Menu
Coddy logo textTech

Obsługa stref czasowych

Część sekcji Logika i przepływ sterowania ścieżki Java w Coddy. Lekcja 59 z 59.

ZonedDateTime w Javie reprezentuje datę i godzinę wraz ze strefą czasową. Przydaje się podczas pracy z różnymi strefami czasowymi lub konwertowania między nimi.

Utwórz czas w określonej strefie:

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

Możesz również utworzyć ZonedDateTime z LocalDateTime za pomocą .atZone():

LocalDateTime localDT = LocalDateTime.of(2024, 3, 15, 10, 30);
ZonedDateTime tokyo = localDT.atZone(ZoneId.of("Asia/Tokyo"));

Konwertuj czas między strefami:

ZonedDateTime newYork = tokyo.withZoneSameInstant(ZoneId.of("America/New_York"));

Po wykonaniu powyższego kodu newYork zawiera ten sam moment co tokyo, ale w strefie czasowej Nowego Jorku:

2024-03-15T10:30-04:00[America/New_York]
// Przykładowy wynik

Aby sformatować ZonedDateTime, użyj DateTimeFormatter. Dodaj przesunięcie za pomocą wzorca xxx: wyświetla on +09:00 lub -04:00, a zerowe przesunięcie jako +00:00 (wielkie litery w XXX powodują, że zerowe przesunięcie jest wyświetlane jako Z):

// Bez przesunięcia strefy czasowej
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
// Z przesunięciem strefy czasowej (np. +09:00 lub -04:00)
DateTimeFormatter fmtWithOffset = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm xxx");
String result = newYork.format(fmtWithOffset);
// Przykład: 2024-03-15 10:30 -04:00
challenge icon

Wyzwanie

Łatwy

Utwórz metodę o nazwie convertTime, która przyjmuje cztery argumenty:

  1. String (dateTimeStr) w formacie "yyyy-MM-dd HH:mm"
  2. String (sourceZone) — identyfikator źródłowej strefy czasowej
  3. String (targetZone) — identyfikator docelowej strefy czasowej
  4. boolean (showOffset) określający, czy uwzględnić przesunięcie strefy czasowej w wyniku

Metoda powinna:

  1. Parsować wejściową datę i godzinę w źródłowej strefie czasowej
  2. Konwertować je na docelową strefę czasową
  3. Zwracać sformatowane informacje o obu godzinach

Zwracane komunikaty powinny być następujące:

  • Jeśli data i godzina są nieprawidłowe: zwróć "Invalid datetime format"
  • Jeśli strefa jest nieprawidłowa: zwróć "Invalid time zone"
  • Jeśli showOffset ma wartość true: uwzględnij przesunięcie w wyniku, sformatowane wzorcem xxx, tak aby przesunięcie równe zero było wyświetlane jako +00:00
  • Format: "Source: [time1], Target: [time2]"

Spróbuj swoich sił

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) {
        // Napisz tutaj swój kod
    }
    
    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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator Java online