Как да премахнете милисекунди от LocalTime в java 8

Използвайки рамката java.time, искам да отпечатам времето във формат hh:mm:ss, но LocalTime.now() дава времето във формат hh:mm:ss,nnn. Опитах се да използвам DateTimeFormatter:

DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_TIME;
LocalTime time = LocalTime.now();
String f = formatter.format(time);
System.out.println(f);

Резултатът:

22:53:51.894

Как мога да премахна милисекунди от времето?


person Nikolas    schedule 27.08.2014    source източник
comment
Използване на различен формататор?   -  person markspace    schedule 28.08.2014
comment
във вашия пример няма наносекунди и дори АКО имаше показана такава прецизност: в рамките на повечето операционни системи точността на времето под 1ms няма смисъл / са буквално невъзможни, всичко, което получавате, е донякъде случаен шум, изразен в числа. Можете обаче да БРОИТЕ ПРОЦЕСОРНИ ТИКОВЕ...   -  person specializt    schedule 28.08.2014


Отговори (6)


Редактиране: Трябва да добавя, че това са наносекунди, а не милисекунди.

Чувствам, че тези отговори всъщност не отговарят на въпроса, използвайки API за дата и час на Java 8 SE по предназначение. Вярвам, че методът truncatedTo е решението тук.

LocalDateTime now = LocalDateTime.now();
System.out.println("Pre-Truncate:  " + now);
DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE_TIME;
System.out.println("Post-Truncate: " + now.truncatedTo(ChronoUnit.SECONDS).format(dtf));

Изход:

Pre-Truncate:  2015-10-07T16:40:58.349
Post-Truncate: 2015-10-07T16:40:58

Като алтернатива, ако използвате часови зони:

LocalDateTime now = LocalDateTime.now();
ZonedDateTime zoned = now.atZone(ZoneId.of("America/Denver"));
System.out.println("Pre-Truncate:  " + zoned);
DateTimeFormatter dtf = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
System.out.println("Post-Truncate: " + zoned.truncatedTo(ChronoUnit.SECONDS).format(dtf));

Изход:

Pre-Truncate:  2015-10-07T16:38:53.900-06:00[America/Denver]
Post-Truncate: 2015-10-07T16:38:53-06:00    
person demos74dx    schedule 07.10.2015
comment
Това ме обърка, защото съм свикнал да извиквам разбор на обект на форматиране, вместо статичен метод за разбор на типа обект, който искам. Благодаря! - person Sam Barnum; 29.04.2021

нарязани на минути:

 localTime.truncatedTo(ChronoUnit.MINUTES);

нарязани на секунди:

localTime.truncatedTo(ChronoUnit.SECONDS);

Пример:

LocalTime.now().truncatedTo(ChronoUnit.SECONDS).format(DateTimeFormatter.ISO_LOCAL_TIME)

Изходи 15:07:25

person Mike_vin    schedule 16.06.2017
comment
Благодаря! Добавих пример, за да покажа, че форматиращият ще уважи отрязването, това е страхотно и работи по същия начин с ZonedDateTime. - person Hugues M.; 25.08.2017

Просто създайте DateTimeFormatter изрично:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss", Locale.US);
LocalTime time = LocalTime.now();
String f = formatter.format(time);
System.out.println(f);

(Предпочитам изрично да използвам локала за САЩ, за да стане ясно, че не искам нищо от локала на формата по подразбиране.)

person Jon Skeet    schedule 27.08.2014

Използвайте това в първия си ред

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
person Justin    schedule 27.08.2014

Опитайте се да използвате модели, дефинирани тук: http://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

Например:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd HH. mm. ss");
String text = date.toString(formatter);
person dpassy    schedule 27.08.2014

Можете да го направите просто като използвате регулярен израз в низа:

String f = formatter.format(time).replaceAll("\\.[^.]*", "");

Това изтрива (чрез заместване с празно) последната точка и всичко след нея.

person Bohemian♦    schedule 27.08.2014
comment
Мисля, че това е по-скоро хакване - person Shervin Asgari; 28.08.2014
comment
@Shervin защо е хак? Това е проблем с форматирането, с решение за форматиране. В известен смисъл това е по-добро от писането на собствен модел на формат, защото не е необходимо да знаете нищо за шаблона или как да го напишете, за да работи това. - person Bohemian♦; 28.08.2014