2014-08-27 5 views
9

Используя фреймворк java.time, я хочу напечатать время в формате hh:mm:ss, но LocalTime.now() дает время в формате hh:mm:ss,nnn. Я пытался использовать DateTimeFormatter:Как удалить миллисекунды из LocalTime в java 8

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

Результат:

22:53:51.894 

Как я могу удалить миллисекунды от времени?

+0

использовать другой форматер? – markspace

+1

в вашем примере нет наносекунд, и даже если бы была такая точность: в большинстве операционных систем временные ограничения ниже 1 мс не имеют смысла/буквально невозможны, все, что вы получаете, - это случайный шум, выраженный в цифрах. Вы можете COUNT PROCESSOR-TICKS, хотя ... – specializt

ответ

9

Просто создать DateTimeFormatter явно:

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

(я предпочитаю явно использовать американскую локаль, чтобы дайте понять, что я не хочу что-нибудь из языкового стандарта по умолчанию.)

1

Попробуйте использовать шаблоны, определенные здесь: 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); 
+0

Хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. –

+0

Ах, хорошо, в следующий раз я сделаю лучше :) – dpassy

+0

Ничего не мешает вам делать лучше прямо сейчас ;-) –

4

Используйте это в первой строке

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss"); 
-1

Вы можете так просто с помощью регулярных выражений на строку:

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

Это удаляет (путем замены с пустым) последней точки и все после.

+0

Я думаю, что это больше похоже на хак –

+0

@Shervin почему это «взломать»? Это проблема форматирования, с решением для форматирования. В некотором роде он превосходит возможность написания собственного шаблона формата, потому что вам не нужно ничего знать о шаблоне или как писать его для работы. – Bohemian

26

Редактировать: Я должен добавить, что это наносекунды, а не миллисекунды.

Я чувствую, что эти ответы на самом деле не отвечают на вопрос, используя 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  
+0

Это правильный ответ и в моей книге. – JayD3e

7

сократить до нескольких минут:

localTime.truncatedTo(ChronoUnit.MINUTES); 

сократить до нескольких секунд:

localTime.truncatedTo(ChronoUnit.SECONDS); 

Пример:

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

Выходы 15:07:25

+0

Спасибо! Я добавил пример, чтобы показать, что форматтер будет соблюдать усечение, это здорово, и он работает одинаково с 'ZonedDateTime'. –

+0

Это должен быть принятый ответ! Не нужно определять собственный форматтер. – membersound

Смежные вопросы