2014-08-28 37 views
17

Więc jestem na tyle szczęście, aby korzystać z Java 8 i nowy czas APi ale nie widzę żadnych funkcji zaokrąglania ...zwijające minut do sufitu przy użyciu języka Java 8

Zasadniczo, jeśli czas jest ...

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 

To wydaje się być w porządku, ale czy to prawda?

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

Czy pierwsza linia nie powinna być "10: 01" po prawej? Funkcja sufitu nie zmieni wartości, jeśli część ułamkowa wynosi 0. –

+0

Zawsze chcę zaokrąglić w górę :) – user432024

+2

Liczba okrągła nie zmienia się, jeśli ją zaokrąglisz. To, o co prosisz, różni się nieco od funkcji sufitowej. –

Odpowiedz

30

java.time API nie obsługuje zaokrąglenie do sufitu, jednak obsługuje rounding to floor (obcinania), co pozwala na pożądane właściwości (który nie jest dokładnie zaokrąglania do sufitu)

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

Dodatkowo istnieje centrum uzyskanie zegara że kleszcze tylko raz na minutę, co może stanowić przedmiot zainteresowania:

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

zegar automatycznie obcina minut do podłogi (choć specified taki sposób, że może ona zwracać opóźniona wartość buforowana). Zauważ, że Clock może być przechowywany w zmiennej statycznej, jeśli jest to pożądane.

Na koniec, jeśli jest to typowa operacja, której chcesz użyć w wielu miejscach, można zapisać funkcję biblioteczną TemporalAdjuster, aby wykonać zaokrąglenie. (Dostrajacze można zapisać raz, przetestować i udostępnić jako zmienną statyczną lub metodę).

+0

Dzięki temu jest to, czego potrzebuję. Wiem, że moje zaokrąglenie jest trochę dziwne, ale w zasadzie muszę zapytać mój system db na podstawie bieżącego czasu.Jeśli mam wielu użytkowników, którzy wysyłają zapytanie w ciągu minuty z zaokrągleniem, mogę buforować filtr! :) – user432024

+0

Algorytm ten byłby niepoprawny dla dokładnych minut minut. Na przykład. powiedzmy, że aktualny czas to dokładnie 5 minut (np. 0 sekund, 0 nanogramów, itp.). W takim przypadku spodziewam się, że roundCeiling będzie wynosił 5 minut (tj. Podobnie jak pułap "1.00" liczba dziesiętna wynosi "1") - ale algorytm dałby 6 minut. Obliczenie roundCeiling powyżej powinno sprawdzić, czy wartość skrócona jest taka sama jak "teraz" - w takim przypadku zwracaj "teraz", w przeciwnym razie 1 minutę. –

+1

Chociaż teraz zauważyłem, że pierwotne pytanie prosi o zawsze zaokrąglić (nawet jeśli liczba jest już okrągła), więc przyjęta odpowiedź jest poprawna w tym przypadku. –

1

java.time (nowy czas API w Java 8) ma bez zaokrąglania wyposażony jak w niektórych innych bibliotek. Próbujesz użyć formatowania do zaokrąglenia na poziomie String. Jeśli chcesz zaokrąglić obiekty razem jednak, to można to zrobić ręcznie zaokrąglenia:

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

Nawiasem mówiąc, na pewno oznaczało podłóg, sufitu, prawda?

Aktualizacja:

znalazłem to nieco lepszy sposób ustawiania na podłodze (oczywiście funkcję jedynie zaokrąglania, sufit nie jest obsługiwany):

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

Mam na myśli sufit, dobrze chcę zaokrąglić w górę, niezależnie czy jest to 10 sekund, 25 sekund czy 49 sekund. – user432024

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

To będzie zaokrąglić w górę do najbliższej minuty, pełniąc funkcję sufitu z minutami jako część całkowita.

+0

Gdzie jest uproszczenie? Pisanie złożonych implementacji 'TemporalAdjuster' powinno w większości przypadków być ograniczone do frameworków lub autorów bibliotek, a nie do użytkowników końcowych. W tym przypadku obciążenie związane z zapisaniem kodu regulacyjnego nadal należy do użytkownika. Tylko moje 2 centy ... –

+0

@Meno Hochschild: Masz rację, kopałem przez java.time dla odpowiedniej funkcjonalności i skończyłem w trybie pisania w bibliotece. Zdecydowanie przesada dla tego problemu. –

Powiązane problemy