2014-08-28 20 views
17

Vì vậy, tôi đủ may mắn để sử dụng Java 8 và API thời gian mới nhưng tôi không thấy bất kỳ chức năng làm tròn ...Vòng phút để trần sử dụng Java 8

Về cơ bản nếu thời gian là ...

2014-08-28T10:01.00.000 ----> 2014-08-28T10:02.00.000 
2014-08-28T10:01.10.123 ----> 2014-08-28T10:02.00.000 
2014-08-28T10:01.25.123 ----> 2014-08-28T10:02.00.000 
2014-08-28T10:01.49.123 ----> 2014-08-28T10:02.00.000 
2014-08-28T10:01.59.999 ----> 2014-08-28T10:02.00.000 

Điều này có vẻ ổn, nhưng có đúng không?

LocalDateTime now = LocalDateTime.now(Clock.systemUTC()); 
LocalDateTime newTime = now.plusMinutes(1); 

System.out.println(newTime.toString()); 
System.out.println(newTime.format(DateTimeFormatter.ofPattern("yyyy-dd-MM'T'HH:mm:00.000"))); 
+4

Dòng đầu tiên có phải là '10: 01' ở bên phải không? Chức năng trần sẽ không thay đổi giá trị nếu phần phân số là 0. –

+0

Tôi luôn muốn làm tròn lên :) – user432024

+2

Số vòng không thay đổi nếu bạn làm tròn nó. Những gì bạn đang yêu cầu hơi khác so với chức năng trần. –

Trả lời

30

Các java.time API không hỗ trợ làm tròn trần, tuy nhiên nó không hỗ trợ rounding to floor (cắt ngắn) cho phép hành vi mong muốn (mà là không chính xác làm tròn trần):

LocalDateTime now = LocalDateTime.now(); 
LocalDateTime roundFloor = now.truncatedTo(ChronoUnit.MINUTES); 
LocalDateTime roundCeiling = now.truncatedTo(ChronoUnit.MINUTES).plusMinutes(1); 

Bên cạnh đó, có một cơ sở để có được một chiếc đồng hồ mà chỉ ve một lần một phút, có thể quan tâm:

Clock minuteTickingClock = Clock.tickMinutes(ZoneId.systemDefault()); 
LocalDateTime now = LocalDateTime.now(minuteTickingClock); 
LocalDateTime roundCeiling = now.plusMinutes(1); 

đồng hồ này sẽ tự động cắt xén phút để sàn (mặc dù nó là specified như vậy mà nó có thể trở lại một giá trị được lưu trữ trễ). Lưu ý rằng Clock có thể được lưu trữ trong một biến tĩnh nếu muốn.

Cuối cùng, nếu đây là thao tác chung mà bạn muốn sử dụng ở nhiều nơi, bạn có thể viết hàm TemporalAdjuster của thư viện để thực hiện làm tròn. (Các điều chỉnh có thể được viết một lần, được kiểm tra và có sẵn dưới dạng biến hoặc phương thức tĩnh).

+0

Cảm ơn đó là những gì tôi cần. Tôi biết làm tròn của tôi là một chút lạ, nhưng về cơ bản tôi cần phải truy vấn hệ thống db của tôi dựa trên thời gian hiện tại.Nếu tôi có nhiều người dùng thực hiện truy vấn trong phút hiện tại bằng cách làm tròn, tôi có thể lưu bộ nhớ cache! :) – user432024

+0

Thuật toán này sẽ không chính xác cho thời gian chính xác-phút. Ví dụ. giả sử thời gian hiện tại chính xác là 5 phút (tức là 0 giây, 0 nanos, v.v.). Trong trường hợp đó tôi mong đợi roundCeiling là 5 phút (ví dụ như trần của số thập phân "1,00" là "1") - nhưng thuật toán sẽ cho 6 phút. roundCeiling tính toán ở trên nên kiểm tra nếu giá trị cắt ngắn là giống như 'bây giờ' - trong trường hợp đó trở lại 'bây giờ', nếu không +1 phút. –

+1

Mặc dù bây giờ tôi nhận thấy rằng câu hỏi ban đầu yêu cầu luôn luôn làm tròn lên (ngay cả khi số đã tròn), vì vậy câu trả lời được chấp nhận là chính xác trong trường hợp đó. –

1

java.time (thời API mới trong Java 8) có không làm tròn tính năng như một số thư viện khác. Bạn cố gắng sử dụng định dạng để làm tròn trên cấp độ Chuỗi. Tuy nhiên, nếu bạn muốn làm tròn các đối tượng thời gian, thì bạn có thể làm việc làm tròn theo cách thủ công:

LocalDateTime now = LocalDateTime.now(Clock.systemUTC()); 
LocalDateTime newTime = now.plusMinutes(1).withSecond(0).withNano(0); 

Bằng cách này, bạn chắc chắn có nghĩa là sàn, không phải trần nhà?

Cập nhật:

Tôi đã tìm thấy cách tốt hơn một chút này để thiết lập sàn (rõ ràng là tính năng chỉ làm tròn, trần không được hỗ trợ):

LocalDateTime now = LocalDateTime.now(Clock.systemUTC()); 
LocalDateTime newTime = now.plusMinutes(1).truncatedTo(ChronoUnit.MINUTES); 
+0

Tôi có nghĩa là trần, tôi cũng muốn tròn lên bất kể nếu nó là 10 giây, 25 giây hoặc 49 giây. – user432024

2
LocalDateTime newTime = now.plusMinutes(1).minusNanos(1).withSecond(0).withNano(0); 

này sẽ tròn đến phút gần nhất, hoạt động như một chức năng trần với phút là phần nguyên.

+0

Đơn giản hóa ở đâu? Viết phức tạp 'TemporalAdjuster'-triển khai nên trong hầu hết các trường hợp được giới hạn trong khuôn khổ hoặc nhà văn thư viện, không phải người dùng cuối. Ở đây gánh nặng để viết mã điều chỉnh vẫn còn với người dùng. Chỉ 2 xu của tôi ... –

+0

@Meno Hochschild: Bạn nói đúng, tôi đã đào qua java.time cho các chức năng liên quan và bị thương trong chế độ viết thư viện. Chắc chắn quá mức cần thiết cho vấn đề này. –

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