2012-12-06 40 views
21

Làm cách nào để định dạng một javax.time.Instant dưới dạng chuỗi trong múi giờ địa phương? Sau đây dịch một số địa phương Instant thành UTC, không phải múi giờ địa phương như tôi mong đợi. Việc xóa cuộc gọi đến toLocalDateTime() sẽ thực hiện tương tự. Làm thế nào tôi có thể có được thời gian địa phương để thay thế?Làm cách nào để định dạng javax.time.Instant dưới dạng chuỗi trong múi giờ địa phương?

public String getDateTimeString(final Instant instant) 
{ 
    checkNotNull(instant); 
    DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); 
    DateTimeFormatter formatter = builder.appendPattern("yyyyMMddHHmmss").toFormatter(); 
    return formatter.print(ZonedDateTime.ofInstant(instant, TimeZone.UTC).toLocalDateTime()); 
} 

Lưu ý: Chúng tôi đang sử dụng phiên bản cũ hơn 0.6.3 của việc thực hiện JSR-310 tham khảo.

Trả lời

0

Trước khi xuống bỏ phiếu trả lời của tôi, xin lưu ý rằng các câu hỏi một cách rõ ràng (và trong kiểu chữ đậm) đề cập đến phiên bản cũ 0.6.3 việc triển khai tham chiếu JSR-310! Tôi đã hỏi câu hỏi này vào tháng 12 năm 2012, rất lâu trước khi sự xuất hiện của Java 8 và thư viện ngày mới!


tôi đã lên trên JSR-310 lớp DateTimeFormatterZonedDateTime và thay vào đó viện đến cũ lỗi thời java.util.Datejava.text.SimpleDateFormat:

public String getDateTimeString(final Instant instant) 
{ 
    checkNotNull(instant); 
    DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); 
    Date date = new Date(instant.toEpochMillisLong()); 
    return format.format(date); 
} 
+0

Tôi thực sự không thấy cần phải sử dụng phương pháp cũ này. –

+0

@ SimonAndréForsberg: Thật không may tôi phải vì chúng tôi đang sử dụng 0.6.3 của việc thực hiện tham khảo JSR-310. May mắn thay, mặc dù sản phẩm của chúng tôi vẫn sử dụng Java 7, chúng tôi đã chuyển sang JSR-310 mới nhất xuất hiện trong Java 8. –

+0

Ngày cũng có phương thức cho điều này là Date.from (tức thì). Nwm, Xem phiên bản lạ của bạn ngay bây giờ – softarn

6

Tại sao bạn mong đợi nó sử dụng múi giờ địa phương? Bạn đang dứt khoát yêu cầu UTC:

ZonedDateTime.ofInstant(instant, TimeZone.UTC) 

Chỉ cần xác định múi giờ địa phương của bạn thay vì:

ZonedDateTime.ofInstant(instant, TimeZone.getDefault()) 
+0

Tôi đã mong đợi 'toLocalDateTime()' để chuyển đổi nó thành múi giờ địa phương hoặc mặc định. Rõ ràng, tôi hiểu lầm 'toLocatlDateTime()' nào. Tôi nghĩ tôi có thể tạo một 'LocalDateTime', nhưng lớp này không có phương thức nào chuyển đổi một' Instant' thành 'LocalDateTime'. –

+2

@DerekMahar: Về cơ bản, điều này không có nghĩa là bạn nghĩ điều đó. Nó chỉ có nghĩa là ngày tháng và thời gian không liên quan đến bất kỳ múi giờ cụ thể nào.Vì vậy, ví dụ, tất cả vòng quanh thế giới, năm mới bắt đầu lúc nửa đêm vào ngày 1 tháng 1. Đối với bất kỳ năm cụ thể nào, đó là LocalDateTime - một phiên bản xuất hiện tại các * instants * khác nhau cho các múi giờ khác nhau. –

+0

Thật không may, JSR-310 không sử dụng 'java.util.TimeZone' và lớp' javax.time.calendar.TimeZone' trong phiên bản 0.6.3 của JSR-310 dường như không có phương thức 'getDefault()' hoặc bất kỳ phương pháp tương tự nào. –

34

Trả lời câu hỏi này wrt phiên bản JDK1.8 gần thành

DateTimeFormatter formatter = 
    DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.systemDefault()); 
return formatter.format(instant); 

Điều quan trọng là Instant không có bất kỳ thông tin múi giờ nào ion. Vì vậy, nó không thể được định dạng bằng cách sử dụng bất kỳ pattens dựa trên ngày/thời gian lĩnh vực, chẳng hạn như "yyyyMMddHHmmss". Bằng cách chỉ định vùng trong DateTimeFormatter, tức thời được chuyển đổi thành múi giờ được chỉ định trong khi định dạng, cho phép nó được xuất chính xác.

Một phương pháp khác là chuyển đổi sang ZonedDateTime:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); 
return formatter.format(ZonedDateTime.ofInstant(instant, ZoneId.systemDefault())); 

Cả hai phương pháp là tương đương, tuy nhiên tôi thường sẽ chọn đầu tiên nếu đối tượng dữ liệu của tôi là một Instant.

+0

Cảm ơn bạn đã trả lời. Tôi có chút nghi ngờ rằng đó là chính xác, nhưng tôi sẽ phải chờ cơ hội tiếp theo để áp dụng giải pháp này thay cho giải pháp mà tôi đã triển khai. Tôi cũng phải đợi cho đến khi nhóm của chúng tôi thay thế phiên bản 0.6.3 của JSR-310 bằng một phiên bản mới hơn hoặc thay thế JDK 6 bằng JDK 8. –

1

Hãy thử điều này:

String dateTime = DateTimeFormatter.ISO_ZONED_DATE_TIME.format(
    ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()) 
); 

Điều này cho phép:

2014-08-25T21:52:07-07:00[America/Los_Angeles] 

Bạn có thể thay đổi định dạng bằng cách sử dụng một cái gì đó khác hơn DateTimeFormatter.ISO_ZONED_DATE_TIME như định dạng. DateTimeFormatter có một loạt các trình định dạng được xác định trước hoặc bạn có thể tự định nghĩa.

+0

Tôi không thể tìm thấy lớp 'ZoneId' trong phiên bản 0.6.3 của JSR -310 thực hiện tham chiếu. –

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