Tôi nhầm lẫn với thời gian xử lý trong thời gian java. Tôi đã làm việc lâu dài dưới giả định rằng nếu một dấu thời gian được chỉ định là thời gian zulu, java sẽ chăm sóc bù đắp liên quan đến giờ địa phương.Lẫn lộn với Java Phân tích cú pháp thời gian UTC
Để minh họa. Tôi hiện đang ở BST có khoản chênh lệch là UTC +1. Với ý nghĩ đó, tôi mong chờ thời gian zulu này:
2016-09-12T13:15:17.309Z
là
2016-09-12T14:15:17.309
LocalDateTime sau khi phân tích nó. Điều này là do thời gian hệ thống mặc định của tôi được đặt thành BST và dấu thời gian trên (thời gian zulu) chỉ định rằng đó là thời gian UTC.
Thay vào đó tuy nhiên xem xét mẫu này:
String ts = "2016-09-12T13:15:17.309Z";
LocalDateTime parse = LocalDateTime.parse(ts, DateTimeFormatter.ISO_DATE_TIME);
System.out.println(parse);
này sẽ in:
2016-09-12T13:15:17.309
Vì vậy, các dấu thời gian, phân tích như một LocalDateTime, không được công nhận như thời gian UTC và thay vào đó coi như localtime trực tiếp. Vì vậy, tôi nghĩ, có lẽ tôi cần phải phân tích nó như là một ZonedDateTime và chuyển đổi nó để LocalDateTime cụ thể để có được thời gian địa phương chính xác. Với xét nghiệm này:
String ts = "2016-09-12T13:15:17.309Z";
ZonedDateTime parse = ZonedDateTime.parse(ts, DateTimeFormatter.ISO_DATE_TIME);
System.out.println(parse);
System.out.println(parse.toLocalDateTime());
tôi nhận được kết quả đầu ra:
2016-09-12T13:15:17.309Z
2016-09-12T13:15:17.309
Cùng sản lượng cho cả ngày.
Cách duy nhất để phân tích một cách chính xác này mà tôi có thể tìm thấy, là:
String ts = "2016-09-12T13:15:17.309Z";
Instant instant = Instant.parse(ts); // parses UTC
LocalDateTime ofInstant = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
System.out.println(instant);
System.out.println(ofInstant);
in này:
2016-09-12T13:15:17.309Z
2016-09-12T14:15:17.309
Đó là chính xác.
Vậy câu hỏi (s) là:
- nên không có thời gian java nhận ra một UTC dấu thời gian và phân tích nó để mặc định hệ thống có đúng không?
- Làm cách nào để sử dụng phương thức
LocalDateTime#parse
để nhận kết quả chính xác? - Tôi có nên sử dụng
Instant
cho mọi thứ ngay bây giờ và hủy phân tích cú pháp không?
Vấn đề là các mô-đun thời gian java của phân tích cú pháp dấu thời gian bằng định dạng ISO và phương pháp LocalDateTime#parse
thông thường. Tôi nhận ra rằng thời gian của tôi là không tắt vì họ đang được coi là LocalTime
trong khi trên thực tế họ đang trong thời gian Zulu.
Ví dụ của bạn có vẻ như sẽ thực hiện cuộc trò chuyện tức thì trong ví dụ của tôi 3. Bạn nói đúng, tôi hiểu nhầm những gì LocalDateTime là viết tắt của. ughh .. timezones :) Cảm ơn – pandaadb
Ah, vì vậy ZonedDateTime nhận ra múi giờ là "Z" mà nó diễn giải là UTC tự động (chỉ là những gì tôi muốn) - có đúng không? – pandaadb
@pandaadb Vâng, nó có lẽ chỉ là một cách khác để viết này. –