DateFormat.parse()
KHÔNG phải là một truy vấn (cái gì mà trả về giá trị và không thay đổi trạng thái của hệ thống). Nó là một lệnh có tác dụng phụ khi cập nhật đối tượng Calendar
bên trong. Sau khi gọi số parse()
, bạn phải truy cập múi giờ bằng cách truy cập vào số Calendar
của DateFormat
hoặc gọi DateFormat.getTimeZone()
. Trừ khi bạn muốn vứt bỏ múi giờ ban đầu và sử dụng giờ địa phương, không sử dụng giá trị Date
trả lại từ parse()
. Thay vào đó hãy sử dụng đối tượng lịch sau khi phân tích cú pháp. Và điều này cũng đúng cho phương pháp định dạng. Nếu bạn định định dạng ngày, hãy chuyển lịch với thông tin múi giờ vào đối tượng DateFormat
trước khi gọi format()
. Đây là cách bạn có thể chuyển đổi một định dạng sang định dạng khác giữ gìn múi giờ gốc:
DateFormat originalDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy");
DateFormat targetDateFormat = new SimpleDateFormat("EEE., MMM. dd, yyyy");
originalDateFormat.parse(origDateString);
targetDateFormat.setCalendar(originalDateFormat.getCalendar());
return targetDateFormat.format(targetDateFormat.getCalendar().getTime());
Đó là lộn xộn nhưng cần thiết vì parse()
không trả lại một giá trị bảo tồn múi giờ và format()
không chấp nhận một giá trị xác định một múi giờ (lớp Date
).
Nguồn
2012-09-27 20:24:02
Đúng vậy ... thử in 'System.out.println (df.format (df.parse (df.format (cal.getTime())))); 'và nó hoạt động như mong đợi :-) –
Ok vì vậy dường như vấn đề xuất phát từ toString()? Cảm ơn vì lời khuyên. –
@MaximeLaval: Từ 'Date.toString' nói riêng, có - và bạn cần phải biết rằng' Date' chỉ là một khoảnh khắc, không nằm trong bất kỳ múi giờ hoặc lịch cụ thể nào. –