2015-07-25 14 views
8

Về phía khách hàng, tôi sử dụng MM/định dạng ngày dd/yyyy. Các lĩnh vực sử dụng một twitter bootstrap chọn 3 datetime (https://eonasdan.github.io/bootstrap-datetimepicker/)mất một ngày cho một ngày

tôi nhập qua twitter bootstrap chọn 3 datetime 24/07/2015
trong json của tôi gửi đi, tôi thấy: ngày sinh: "24/07/2015"

trong dto của tôi, tôi làm

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy") 
private Date birthdate; 

Khi tôi nhận được ngày trên máy chủ, trong see dto tôi: 23/07/2015 19:00

Một ngày nọ bị mất.

Bất kỳ giải thích?

+0

bạn đã kiểm tra cài đặt thời gian địa phương trên hệ thống của mình chưa? – Sam

+0

client/server là trên cùng một máy: cả hai là edt -4 giờ (thời gian mtl) ... –

+1

Nó chắc chắn là một thời gian vấn đề khu vực dịch. Một bên đang coi thời gian là UTC, và bên kia đang chuyển đổi thành giờ địa phương. Chúng tôi đã gặp sự cố này trong một số tích hợp máy khách/máy chủ với hệ thống của bên thứ ba. Giveaway chết là "19:00" đã được thêm vào thời gian khác, nó là chính xác 5 giờ của sự khác biệt (không thực sự là một ngày đầy đủ). – mellamokb

Trả lời

7

Theo JacksonFAQDateHandling page:

Tất cả các đối tượng thời điểm đó đã gắn liền TimeZone (java.util.Calendar vv) mà Jackson xây dựng sử dụng múi giờ chuẩn (GMT), không các địa phương múi giờ (bất kỳ thứ gì có thể). Đó là: Jackson mặc định để sử dụng giờ cho tất cả các xử lý trừ đặc biệt nói ngược lại.

Trong trường hợp của bạn, có vẻ như ngày sẽ tự động được chuyển đổi thành GMT/UTC. Cố gắng cung cấp múi giờ địa phương của bạn một cách rõ ràng để tránh chuyển đổi UTC [như đã đề cập trong câu hỏi Làm thế nào đến thời gian này được tắt trước 9 giờ? (5 giờ, 3 giờ vv) trên cùng một trang]:

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd/MM/yyyy", timezone="EST") 

Thứ hai, tôi nghĩ rằng bạn đang sử dụng Date.toString() đến nay in. Note rằng Java Date lớp là múi giờ độc lập nhưng phương pháp toString() của nó sử dụng múi giờ mặc định của hệ thống trước khi in.

Ở đây có vẻ như 24/07/2015 00:00 UTC đang được chuyển đổi thành 23/07/2015 19:00 EST theo toString(). Cả hai số này đại diện cho cùng một thời điểm thời gian nhưng theo múi giờ khác nhau.

+0

tôi không sử dụng toString(), nhưng chắc chắn khi @JsonFormat (shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy"), toString có thể được gọi. Có một giải pháp tiêu chuẩn để quản lý điều này? chỉ giữ ngày gmt ... nhưng cần phải biết múi giờ của người dùng ở đâu đó để hiển thị ngày chính xác. Có lẽ một cái gì đó có thể được sử dụng với ngày mới của java 8 hoặc joda? –

+0

Thực hành tốt nhất là lưu trữ thông tin ngày/giờ trong UTC trong cơ sở dữ liệu và cũng lưu trữ múi giờ của người dùng. Sau đó, sử dụng múi giờ đó khi hiển thị ngày cho người dùng hoặc xóa bù trừ múi giờ trước khi lưu trữ.Có rất nhiều bài viết liệt kê các lợi ích của phương pháp này, tức là ứng dụng có thể hỗ trợ các múi giờ khác nhau. Java8 Date API đã cung cấp một bộ các lớp mới để làm việc với ngày/giờ. Đây là một bài viết hay về API Ngày Java8 https://dzone.com/articles/deeper-look-java-8-date-and. Java8 hoặc Joda _simplifies_ xử lý ngày/múi giờ. – AimZ

+0

Điều này phù hợp với tôi. Cảm ơn. – Elvermg

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