2016-07-06 37 views
6

Tôi đã cố gắng tạo Thời lượng tối đa bằng Java 8 bằng cách sử dụng Duration.ofMillis (Long.MAX_VALUE) nhưng bị tràn quá lâu. Làm thế nào tôi có thể lập trình nhận được tương đương với một Duration.MAX_VALUE nếu nó tồn tại?Giá trị tối đa cho Java Thời lượng

Chỉnh sửa: Lỗi tràn dài có thể do cố gắng thêm vào giá trị thay vì trong quá trình xây dựng. Xin lỗi vì không có mã tái sản xuất.

Trả lời

3

Dường như Duration được lưu trữ trong vài giây (lên đến Long.MAX_VALUE) và nano giây (lên đến 999,999,999). Sau đó, trong suốt thời gian lớn nhất có thể là:

Duration d = Duration.ofSeconds(Long.MAX_VALUE, 999_999_999); 

Khi tôi in nó (System.out.print(d)) tôi nhận được như sau:

PT2562047788015215H30M7.999999999S 

có nghĩa là: 2562047788015215 giờ, 30 phút, và 7,999999999 giây.

+2

giây có thể là số âm nên nó phải là 'Long.MIN_VALUE..LONG.MAX_VALUE' – jhamon

+1

@jhamon, cảm ơn, tôi đã sửa bài đăng của mình. – Alexey

+0

Thời gian đó tương đương với khoảng 292 tỷ năm. – Tuupertunut

5

Theo Javadoc:

Thời gian sử dụng độ phân giải nano giây với một giá trị tối đa của giây mà có thể được tổ chức trong một thời gian dài.

Phạm vi thời lượng yêu cầu lưu trữ số lớn hơn một khoảng thời gian dài. Để đạt được điều này, lớp lưu trữ một giây dài đại diện và một int đại diện cho nano giây-giây, mà sẽ luôn luôn là giữa 0 và 999.999.999. Mô hình có thời lượng được chỉ định, có nghĩa là thời lượng có thể âm.

+0

Vậy tại sao Long.MAX_VALUE lại gây ra tình trạng tràn? Giá trị tối đa được phép cho phần Giây là bao nhiêu? – Novaterata

+3

tốt, tôi vừa thử đoạn mã này: 'Duration test = Duration.ofMillis (Long.MAX_VALUE);' và tôi không bị tràn. Bạn có thể hiển thị mã ném ngoại lệ không? – jhamon

+0

Tôi không còn phải hối tiếc nữa. Bạn biết đấy, nó phải đã được gây ra sau này khi một cái gì đó đã được thêm vào nó. – Novaterata

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