2012-02-24 36 views
5

Tôi có một chuỗi thu được bằng cách gọi phương thức toString của lớp Date.
Làm cách nào để có được đối tượng Ngày từ chuỗi này?Làm thế nào để chuyển đổi Date.toString trở lại ngày?

Date d = new Date(); 
String s = d.toString; 
Date theSameDate = ... 

CẬP NHẬT
Tôi đã cố gắng sử dụng SimpleDateFormat, nhưng tôi nhận java.text.ParseException: Unparseable date Bạn có thể cho tôi biết định dạng ngày tháng sản xuất bởi Date.toString()?

+0

Thử phân tích cú pháp bằng 'SimpleDateFormat'. – bdares

+1

Không sử dụng String. Giữ đối tượng Date và chỉ chuyển thành String khi cần. – m0skit0

+1

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

Trả lời

12

Nếu mục tiêu thực sự của bạn là để serialize một đối tượng Date đối với một số loại tùy chỉnh thực hiện kiên trì hoặc truyền dữ liệu, một giải pháp đơn giản sẽ là:

Date d = new Date(); 
long l = d.getTime(); 
Date theSameDate = new Date(l); 
+1

FYI: Lớp phiền hà' Date' đã được thừa kế, được thay thế bằng các lớp 'Instant' và các lớp * java.time * khác. Xem cách tiếp cận hiện đại trong [Câu trả lời này] (https://en.m.wikipedia.org/wiki/ISO_8601) bởi Ole V.V. –

2

Hãy xem SimpleDateFormat#parse(). Nó sẽ cung cấp chức năng bạn đang tìm kiếm.

+0

Lớp đó bây giờ đã bị lỗi thời bởi 'DateTimeFormatter'. –

-1

Date theSameDate = new Date(Date.parse(s));

Đối với một số lý do không rõ ràng, đây không phải là một ý tưởng đặc biệt tốt. Bạn có thể tìm thấy chi tiết về điều đó trong tài liệu API cho phương thức phân tích cú pháp. Một vấn đề là ví dụ rằng các từ viết tắt múi giờ không rõ ràng, sao cho trình phân tích cú pháp có thể thất bại trong việc diễn giải múi giờ chính xác.

+0

Ngoài ra 'Date.parse()' đã bị phản đối từ lâu. –

8

Bạn có thể làm điều đó như thế này

Date d = new Date(); 
String s = d.toString; 
Date theSameDate = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy").parse(s); 
+0

Phương thức này cũng làm việc với thư viện org.json khi chuyển đổi các đối tượng Date Java đến và từ JSONObjects bằng cách sử dụng hàm tạo bean, vì nó sử dụng Date.toString() khi xây dựng JSONObjects. Cảm ơn bạn vì điều này, nó chính xác định dạng cho SimpleDateFormat mà tôi đang tìm kiếm. –

+0

FYI, các lớp học cũ rắc rối được sử dụng ở đây hiện là di sản, được thay thế bởi các lớp * java.time *. –

2
  1. 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ờ.
  2. 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()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).

+1

tl; dr 'Instant.parse (Instant.now(). ToString())' –

Các vấn đề liên quan