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:00Thử thách
DễTạo một phương thức tên là convertTime nhận bốn đối số:
- Một chuỗi (
dateTimeStr) theo định dạng "yyyy-MM-dd HH:mm" - Một chuỗi (
sourceZone) là mã múi giờ nguồn - Một chuỗi (
targetZone) là mã múi giờ đích - 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:
- Phân tích ngày giờ đầu vào theo múi giờ nguồn
- Chuyển đổi sang múi giờ đích
- 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));
}
}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
1Mảng đa chiều
Kiến thức cơ bản về mảng 2DTruy cập phần tử trong mảng 2DVòng lặp lồng nhau với mảng 2DÔn tập về mảng 2DPhép cộng và phép trừ ma trậnMảng không đềuMảng 3D trở lênCác mẫu thường gặp với mảng 2DÔn tập về mảng2HashMap phần 1
HashMap là gì?Khai báo HashMapTruy cập giá trịKiểm tra khóa có tồn tạiChỉnh sửa từ điểnÔn tập: HashMapTự luyện tập: Trình biên dịch Java online