Как удалить миллисекунды из 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
в вашем примере нет наносекунд, и даже если бы была показана такая точность: в большинстве операционных систем точность времени ниже 1 мс не имеет смысла / буквально невозможна, все, что вы получаете, - это несколько случайный шум, выраженный в числах. Вы можете СЧИТАТЬ ПРОЦЕССОР-ТИКИ, хотя ...   -  person specializt    schedule 28.08.2014


Ответы (6)


Изменить: я должен добавить, что это наносекунды, а не миллисекунды.

Я чувствую, что эти ответы на самом деле не отвечают на вопрос, используя Java 8 SE Date and Time API, как предполагалось. Я считаю, что метод 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