- Nếu mục tiêu thực sự của bạn là tuần tự hóa và xác định ngày và giờ (ví dụ để chuyển dữ liệu hoặc lưu giữ lâu dài), định dạng chuẩn cho dữ liệu ngày và giờ.
- Bỏ qua lớp đã lỗi thời dài
Date
. Ngày và API thời gian Java hiện đại được gọi là java.time
có hiệu quả hơn rất nhiều. Lớp bạn cần từ nó có lẽ là Instant
(điều này phụ thuộc vào các yêu cầu chính xác hơn của bạn).
Hai điểm đi độc đáo tay trong tay: toString
phương pháp
Instant i = Instant.now();
String s = i.toString();
Instant theSameInstant = Instant.parse(s);
Các lớp hiện đại sản xuất theo tiêu chuẩn ISO 8601 (ví dụ, 2018-01-11T10:59:45.036Z
), và parse
phương pháp của họ đọc các định dạng tương tự trở lại. Vì vậy, đoạn mã này là tất cả những gì bạn cần, và bạn nhận được ngay lập tức bằng đoạn đầu tiên, với độ chính xác nano giây.
Nếu bạn không thể kiểm soát chuỗi bạn nhận được, và bạn nhận được kết quả từ Date.toString()
, chuỗi mô hình định dạng trong Sedalb’s answer làm việc với java.time
quá:
DateTimeFormatter dtf
= DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ROOT);
Date d = new Date();
String s = d.toString();
Instant nearlyTheSameInstant = ZonedDateTime.parse(s, dtf).toInstant();
Nó là điều cần thiết để cung cấp một miền địa phương. Nếu không, miền địa phương mặc định của JVM sẽ được sử dụng và nếu ngôn ngữ đó không phải là tiếng Anh, việc phân tích cú pháp sẽ không thành công. Trong trường hợp xấu nhất bạn sẽ thấy mã của bạn chạy tốt trong nhiều năm và đột nhiên nó sẽ phá vỡ khi một ngày ai đó chạy nó trên một máy tính hoặc thiết bị với một thiết lập miền địa phương khác nhau.
Điểm từ jambjo’s answer vẫn được áp dụng: Ba và bốn chữ cái viết tắt múi giờ được sử dụng trong Date.toString()
là rất thường không rõ ràng, vì vậy không có gì bảo đảm rằng các múi giờ được giải thích một cách chính xác, và một lần nữa, nó sẽ được hiểu khác nhau trên các JVM khác nhau.
Cuối cùng, Date.toString()
không hiển thị mili giây mà giữ Date
, dẫn đến độ không chính xác lên đến 999 mili giây. Nếu sử dụng chuỗi từ Date.toString()
, không có gì chúng tôi có thể làm về nó (đó là lý do tại sao tôi đặt tên biến là nearlyTheSameInstant
).
Nguồn
2018-01-11 10:57:00
Thử phân tích cú pháp bằng 'SimpleDateFormat'. – bdares
Không sử dụng String. Giữ đối tượng Date và chỉ chuyển thành String khi cần. – m0skit0
Có thể là một ý tưởng hay để cung cấp một số ngữ cảnh về những gì bạn đang thực sự cố gắng đạt được. – flesk