Menu
CoddyTech

Xử lý múi giờ

Thuộc phần Logic và luồng chương trình trong hành trình Java của Coddy. Bài học 59 trên 59.

ZonedDateTime trong Java biểu diễn ngày giờ kèm múi giờ. Kiểu này hữu ích khi làm việc với nhiều múi giờ hoặc chuyển đổi giữa chúng.

Tạo thời gian trong một múi giờ cụ thể:

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

Bạn cũng có thể tạo ZonedDateTime từ LocalDateTime bằng cách dùng .atZone():

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

Chuyển đổi thời gian giữa các múi giờ:

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

Sau khi chạy đoạn code trên, newYork chứa cùng thời điểm với tokyo, nhưng theo múi giờ của New York:

2024-03-15T10:30-04:00[America/New_York]
// Ví dụ về đầu ra

Để định dạng ZonedDateTime, hãy dùng DateTimeFormatter. Thêm độ lệch múi giờ bằng mẫu xxx: mẫu này in ra +09:00 hoặc -04:00, và in độ lệch bằng không thành +00:00 (còn mẫu viết hoa XXX in ra Z khi độ lệch bằng không):

// Không có độ lệch múi giờ
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
// Có độ lệch múi giờ (ví dụ: +09:00 hoặc -04:00)
DateTimeFormatter fmtWithOffset = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm xxx");
String result = newYork.format(fmtWithOffset);
// Ví dụ: 2024-03-15 10:30 -04:00
challenge icon

Thử thách

Dễ

Tạo một phương thức tên là convertTime nhận bốn đối số:

  1. Một chuỗi (dateTimeStr) theo định dạng "yyyy-MM-dd HH:mm"
  2. Một chuỗi (sourceZone) là mã múi giờ nguồn
  3. Một chuỗi (targetZone) là mã múi giờ đích
  4. Một giá trị boolean (showOffset) cho biết có bao gồm độ lệch múi giờ trong đầu ra hay không

Phương thức cần:

  1. Phân tích ngày giờ đầu vào theo múi giờ nguồn
  2. Chuyển đổi sang múi giờ đích
  3. Trả về thông tin đã định dạng về cả hai thời điểm

Các thông báo trả về:

  • Nếu ngày giờ không hợp lệ: trả về "Invalid datetime format"
  • Nếu múi giờ không hợp lệ: trả về "Invalid time zone"
  • Nếu showOffset là true: bao gồm độ lệch trong đầu ra, được định dạng bằng mẫu xxx, để độ lệch bằng không hiển thị là +00:00
  • Định dạng: "Source: [time1], Target: [time2]"

Tự làm thử

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) {
        // Viết code của bạn ở đây
    }
    
    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 iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Trình biên dịch Java online