2012-08-05 17 views
8

Định dạng chuỗi ngày của tôi giống như sau: Ngày 2 tháng 1 năm 2012 Sau phương thức Instant.parse() ngày 1 tháng 1 năm 2012, sớm hơn 1 ngày, tại sao? Nếu chuỗi ngày đầu tiên là ngày 01 tháng 1 2012, Instant sẽ là ngày 31 tháng mười hai, 2011.ngày trong MongoDB: khi chèn đối tượng Ngày vào cơ sở dữ liệu Mongo, ngày trở thành 1 ngày sớm hơn chính nó

String dateString="Jan 1, 2012"; 
Instant instant = Instant.parse(dateString, new DateTimeFormatterBuilder() 
.appendMonthOfYearShortText() 
.appendLiteral(" ") 
.appendDayOfMonth(1) 
.appendLiteral(", ") 
.appendYear(4, 4) 
.toFormatter()); 

DateTime dateTime = new DateTime(instant); 
Date date = new Date(dateTime.getMillis()); 

document.append("time", new Date(dateTime.getMillis())); 
tagsDbCollection.insert(document); 

Tôi đang sử dụng MongoDB để lưu trữ những ngày này. Tôi đã thử nghiệm và nó cho thấy khi định dạng chuỗi ngày-> tức thì không có lỗi. Nhưng khi tôi chèn đối tượng Kiểu ngày tháng này vào MongoDB, chuỗi ngày trong MongoDB sẽ trở thành 1 ngày trước đó, tại sao?

Trong MongoDB:

/* 0 */ 
    { 
     "_id" : ObjectId("50221a40da74d74053abb445"), 
     "time" : ISODate("2011-12-31T14:00:00Z") 
    } 
+1

Bạn đã thử thêm thành phần múi giờ chưa? Nó có thể là một cái gì đó với địa phương của bạn và ngày nhận được bù đắp bởi múi giờ của bạn. –

Trả lời

1
final String dateString = "Jan 2, 2012"; 
final DateTimeFormatter dtf = new DateTimeFormatterBuilder().appendMonthOfYearShortText().appendLiteral(" ").appendDayOfMonth(1).appendLiteral(", ").appendYear(4, 4).toFormatter(); 
final DateTime jodaDate = dtf.parseDateTime(dateString); 
System.out.println(jodaDate); 
final Date javaDate = new Date(jodaDate.getMillis()); 
System.out.println(javaDate); 

Output là

2012-01-02T00:00:00.000+02:00 
Mon Jan 02 00:00:00 EET 2012 

Tiếp theo cho:

final String dateString = "Jan 1, 2012"; 

đầu ra là:

2012-01-01T00:00:00.000+02:00 
Sun Jan 01 00:00:00 EET 2012 
+0

Cảm ơn bạn đã trả lời. Có, chuỗi ngày-> Instant không sai. Đó là khi tôi chèn những ngày này vào MongoDB, vấn đề này xuất hiện. Vẫn không biết tại sao ... Tôi đã cập nhật câu hỏi. –

+0

Có thể bạn có TimeZone -10. Vì vậy, tiết kiệm thời gian si 14:00 ngày trước đó. Khi tôi làm việc với MongoDB, tôi lưu ngày giống như giá trị dài trong millis – Ilya

+0

Có vấn đề múi giờ. Tôi đang ở Brisbane, Úc. Đó là UTC + 10. [Trang này] (https: //jira.mongodb.org/browse/CSHARP-185) nói "MongoDB lưu trữ tất cả DateTimes trong UTC. Bất kỳ thời gian cục bộ nào bạn cung cấp được chuyển đổi sang UTC khi được lưu trữ trong cơ sở dữ liệu". Và tôi tìm thấy sau khi chèn khi tôi truy vấn ngày từ MongoDB thông qua API Java của nó, ngày được chuyển đổi thành giờ địa phương một lần nữa. Vì vậy, nó là OK ngay bây giờ. Cảm ơn bạn. –

1

Mongo lưu trữ Ngày của nó theo mili giây kể từ thời đại Unix.

Xem: http://www.mongodb.org/display/DOCS/Dates

Vì vậy, bạn không có múi giờ. Tuy nhiên, nếu bạn sử dụng giao diện điều khiển, trình phân tích cú pháp .js đang chuyển đổi UTC ngày thành cài đặt múi giờ hệ thống hiện tại của bạn.

Bạn có thể kiểm tra rằng:

  • Tạo một Entity với một số dữ liệu ngày.
  • rồi truy vấn thông qua bảng điều khiển. (sử dụng String())
  • rồi thoát khỏi bảng điều khiển và cấu hình lại múi giờ của hệ thống (debian/ubuntu: sudo dpkg-reconfigure tzdata)
  • rồi nhập lại bảng điều khiển và truy vấn dữ liệu cũ của bạn => bạn nhận được cùng một UTC nhưng toString khác nhau() kết quả đầu ra
0

Bạn có thể kiểm tra các múi giờ UTC, về cơ bản Mongo máy chủ chạy tùy thuộc vào múi giờ UTC

định dạng SimpleDateFormat = new SimpleDateFormat ("dd/MM/yyyy"); format.setTimeZone (TimeZone.getTimeZone ("UTC"));