Có hai vấn đề với những gì bạn hiện đang cố gắng thực hiện:
- Bạn mắc lỗi đánh máy trong dòng mã thứ hai, điều này có nghĩa là số tháng của bạn đang được phân tích cú pháp thành phút
- Như đã đề cập, bạn đang không tính đến múi giờ.
Để giải quyết vấn đề đầu tiên, bạn cần thay đổi
Date d2 = new SimpleDateFormat("dd/mm/yyyy").parse(arr[10]);
đến
Date d2 = new SimpleDateFormat("dd/MM/yyyy").parse(arr[10]);
Định dạng ngày phân biệt chữ hoa chữ thường, những gì bạn đang cố gắng làm là phân tích cú pháp tháng dưới dạng ** m ** inute thay vì ** M ** onth. Trong bài kiểm tra tôi đã chạy, điều đó có nghĩa là các tháng đều sắp ra mắt vào tháng 1, điều mà tôi có thể thấy cũng đang xảy ra trong ví dụ của bạn. Ngoài ra, tôi nhận thấy rằng dòng mã đầu tiên của bạn, trình định dạng (được IS thiết lập chính xác) không được sử dụng.
Vấn đề thứ hai là có, Java Date
s không cư xử theo cách bạn mong đợi. Họ PHẢI có một thành phần thời gian, mặc dù bạn không quan tâm đến nó chỉ đơn giản là ngày. Ngoài ra, họ phải có múi giờ kể từ khi họ có thời gian.
Bạn có thể không có lựa chọn chuyển sang thư viện Joda cao cấp, trong trường hợp này, có nhiều cách để giải quyết vấn đề này. Tôi đã viết một bài kiểm tra chứng minh điều này:
@Test
public void shouldParseDateCorrectly() throws Exception {
// Given
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
format.setTimeZone(TimeZone.getTimeZone("UTC"));
// When
Date parsedDate = format.parse("21/08/2012");
// Then
Assert.assertThat(parsedDate.toString(), is("Tue Aug 21 02:00:00 CEST 2012"));
Assert.assertThat(parsedDate.toGMTString(), is("21 Aug 2012 00:00:00 GMT"));
}
Vì vậy, bạn có thể thấy rằng tôi đã sử dụng đúng định dạng, nhưng cũng đặt múi giờ của nó thành UTC (vì vậy nó có độ lệch bằng 0 và không có tiết kiệm ánh sáng ban ngày). Sau đó, khi bạn phân tích cú pháp ngày bằng trình định dạng này, ngày sẽ hiển thị với thời gian là nửa đêm trong múi giờ UTC. Vì máy tính của tôi ở Châu Âu nên khi tôi in ngày này, nó hiển thị thời gian là 2 giờ sáng, vì múi giờ này trước UTC 2 giờ. Nhưng khi tôi sử dụng toGMTString
không dùng nữa phương pháp, thời gian xuất hiện bằng không.
Khi bạn lưu ngày này vào MongoDB bằng trình điều khiển Java, nó sẽ lưu ngày, giờ và múi giờ với nó, ngay cả khi tất cả những gì bạn quan tâm là ngày. Điều bạn cần làm khi đọc lại các ngày tháng cũ là nhớ chúng đang ở UTC và đặt múi giờ thích hợp.
Ngoài ra, bạn có thể lưu trữ chúng trong MongoDB mà không cần thay đổi múi giờ, miễn là bạn sẽ luôn đọc và viết chúng ra trong cùng một múi giờ. Nhưng điều này chứa đầy những lỗi không mong muốn khi a) xử lý thời gian quá nửa đêm và b) thời gian tiết kiệm ánh sáng ban ngày bắt đầu (hoặc dừng lại).
Hoặc chỉ sử dụng Joda-Time .