2013-09-22 44 views
5

Điều gì là sai? Tôi giả sử rằng nếu tôi trừ 1ms từ 1 tháng 1 năm 1980 0: 0: 0 thì tôi đã có 1979. Nhưng tôi phải trừ khoảng 500+ ms cho điều này. Xin vui lòng, cho tôi một gợi ý.Phép trừ 1ms dẫn đến hành vi không mong muốn

val cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")) 
cal.set(1980, 0, 1, 0, 0, 0) 
val date = new Date 
date.setTime(cal.getTimeInMillis()) // <- 1980 Jan 01 0:0:0 
date.setTime(cal.getTimeInMillis() - 1) // <- 1980 Jan 01 0:0:0 too !!! 

Đã cập nhật.

Giải pháp là

val cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")) 
cal.setTimeInMillis(0) 
cal.set(1980, 0, 1, 0, 0, 0) 
+0

Chỉ cần đoán, nhưng có thể nội bộ Lịch làm tròn lên giây? – Aaron

+0

Cố gắng in nội dung 'ngày' sau lệnh gọi' setTime() 'đầu tiên. Có thể năm, tháng, ngày, giờ, phút và giây là giá trị bạn đặt, nhưng không phải là mili giây. –

+0

Đó là một chút bối rối. Tôi không muốn sử dụng Yoda Time hoặc thư viện phần thứ ba khác. Tôi cần phải chuyển đổi năm, tháng, ngày thành mili giây và sau đó nhận được mili giây cuối cùng trong ngày. Tôi muốn tìm giải pháp chính xác cho việc này. Thật không may, javadoc là im lặng về tình hình như vậy. – Ezhik

Trả lời

5

Với Calendar.set(year, month, day, hourOfDay, minute, second) không mili giây được thiết lập. Do đó, việc triển khai Lịch đặt mili giây thành "không xác định", điều này thực sự được coi là điểm giữa trong giây.

Trừ 500ms nghĩa là bạn chỉ cần bước qua điểm giữa. Điều tương tự cũng xảy ra nếu bạn thêm 500 mili giây, điều này sẽ đưa bạn đến vị trí thứ hai. Trên thực tế trừ 500ms hoạt động và bạn phải thêm 620ms để xem thứ hai tiếp theo.

+0

Và làm thế nào để chính xác nhận được mili giây cuối cùng của năm 1979? – Ezhik

+0

trừ 500ms sẽ không nhất thiết phải cung cấp cho mili giây cuối cùng của năm 1979. –

+0

@Ezhik, đặt rõ ràng mili giây bằng 'calendar.set (Calendar.MILLISECOND, 0);'. Khi bạn trừ đi một phần nghìn giây mà bạn lấy trực tiếp mili giây cuối cùng vào năm 1979. – jboi

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