2011-01-07 44 views
13

Tôi có hai dấu thời gian mô tả cùng một khoảng thời gian trong hai định dạng khác nhau.Ngày phân tích cú pháp với Joda với múi giờ

2010-10-03 18:58:072010-10-03T16:58:07.000+02:00.

Tôi phân tích cú pháp dấu thời gian với hai trình định dạng ngày khác nhau với Joda. Cuối cùng tôi muốn có hai đối tượng DateTime bằng nhau về mặt tức thời.

DateFormatter cung cấp một số phương pháp để kiểm soát múi giờ và miền địa phương nhưng tôi không thể làm cho nó hoạt động.

Đây là mã mà tôi muốn làm việc:

final String date1 = "2010-10-03 18:58:07"; // Europe/Berlin local time 
    final DateTimeFormatter formatter1 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); 
    final DateTime dateTime1 = formatter1.parseDateTime(date1); 

    final String date2 = "2010-10-03T16:58:07.000+02:00"; // Europe/Berlin local time with time zone 
    final DateTimeFormatter formatter2 = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
    final DateTime dateTime2 = formatter2.parseDateTime(date2); 

    Assert.assertTrue(dateTime1.isEqual(dateTime2)); 

Cảm ơn trước nếu ai đó có thể giúp tôi!

Trả lời

6

Nếu zome thời gian mặc định của bạn là Châu Âu/Berlin, 2010-10-03 18:58:07 tương ứng với 2010-10-03T16: 58: 07.000 + 00: 00.

Bạn có thể hiểu sai trường thời gian trong biểu diễn chuỗi. Dấu thời gian của bạn 2010-10-03T16: 58: 07.000 + 02: 00 có nghĩa là "đó là 16:58:07 trong một múi giờ với chênh lệch +2 giờ GMT), hoặc trong một từ ngữ khác" bây giờ là 16 : 58: 07 ở Berlin "Tôi giả định rằng bạn mong đợi nó có nghĩa là nó là 16:58:07 GMT?

+0

Bạn có loại trong "2010-10-03T16: 58: 07.000 + 02: 00 có nghĩa là không phải lúc 16:58:07 trong múi giờ có chênh lệch +2 giờ từ GMT)". Nó phải đọc: "2010-10-03T16: 58: 07.000 + 02: 00 có nghĩa là nó là 16:58:07 trong một múi giờ với một +2 giờ bù đắp từ UTC)" – MicSim

+0

Vâng, tôi mong đợi nó sẽ là 16 : 58: 07 GMT. Sau đó, có vẻ như các dấu thời gian chỉ bị hỏng. Đây là các dấu thời gian từ hai tệp nhật ký khác nhau của các máy chủ khác nhau. Và tôi chắc rằng họ chỉ định cùng một sự kiện. Vì vậy, đây là sự nhầm lẫn của tôi đến từ. – wilfried

+0

@MacSim: Chắc chắn, tôi đã viết một chút quá nhanh ở đó. – jarnbjo

4

Hai dấu thời gian của bạn không đại diện cho cùng một tức thời trong thời gian (như jambjo đã được nhận xét). Nếu bạn không cung cấp bất kỳ múi giờ nào thì múi giờ mặc định sẽ được áp dụng (đó là múi giờ Berlin UTC + 2 nếu bạn đang ở đó). Vì vậy:

  • 2010-10-03 18:58:07 trở thành 2010-10-03T18:58:07.000+02:00 (18:58 ở Berlin với bù đắp 2 giờ đến UTC, có nghĩa là 16:58 trong UTC) như mong đợi.
  • 2010-10-03T16:58:07.000+02:00 ở lại như nó có, bởi vì có một múi giờ cung cấp (tức là 16:58 tại Berlin với bù 2 giờ UTC, có nghĩa là 14:58 tại UTC)

Hy vọng bạn có ý tưởng . Bạn sẽ cần điều chỉnh thời gian bằng phương pháp withZone để nhận kết quả mong muốn.

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