2014-01-30 2 views
3

Поскольку объект java.util.Date хранит дату 2014-01-24 17:33:47.214, но я хочу, чтобы формат даты был 2014-01-24 17:33:47. Я хочу удалить часть миллисекунды.Как удалить миллисекунды из формата Date Object в Java

Я проверил вопрос, связанный с моим вопросом ...

How to remove sub seconds part of Date object

Я попробовал данный ответ

long time = date.getTime(); 
date.setTime((time/1000) * 1000); 

, но я получил свой результат формат даты, как 2014-01-24 17:33:47.0 , Как я могу удалить это 0 из моего формата даты ???

+2

дата не имеет значения. Покажите нам ** код форматирования **. –

+1

Объект даты представляет длинные миллисекунды, вы не можете разделить его на 1000 и просто показать час .. Возможно, вам нужно пройти документацию – sanbhat

+0

Я считаю, что они хотели использовать 'date.setTime (Math.round (time/1000) * 1000); '(см. Ответ ниже) –

ответ

7

Базовый ответ: вы не можете. Значение, возвращаемое Date#toString, является представлением объекта Date и не содержит понятия формата, отличного от того, что оно использует внутренне для метода toString.

Как правило, это не должно использоваться для отображения цели

Вместо (за исключением редких случаев), вы должны использовать какой-то DateFormat

Например ...

Date date = new Date(); 
System.out.println(date); 
System.out.println(DateFormat.getDateTimeInstance().format(date)); 
System.out.println(DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(date)); 
System.out.println(DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(date)); 
System.out.println(DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(date)); 

Will вывести что-то вроде ...

Thu Jan 30 16:29:31 EST 2014 
30/01/2014 4:29:31 PM 
30/01/14 4:29 PM 
30/01/2014 4:29:31 PM 
30 January 2014 4:29:31 PM 

Если вы g e действительно застрял, вы можете настроить его дальше, используя SimpleDateFormat, но я бы избегал этого, если вы можете, поскольку не все используют одно и то же форматирование даты и времени;)

5

Вы можете использовать SimpleDateFormatter. См. Следующий код.

SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a"); 
Date now = date.getTime(); 
System.out.println(formatter.format(now)); 
0

Вы можете использовать SimpleDateFormat класс для форматирования даты по мере необходимости. В связи с разнообразием возможных комбинаций, я просто включить ссылку документацию здесь:

http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

Ваш код будет выглядеть что-то похожее на следующее:

System.out.println(new SimpleDateFormat("MM/dd/yyyy").format(date)); 
-1

Пожалуйста, попробуйте следующую дату форматировщик:

import java.text.*; 
SimpleDateFormat tmp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") 
System.out.println(tmp.format(date)); 
+0

Что вы ожидаете от использования вызова 'Math.round' с значением' long'? Это уже целое число .... –

+0

@JonSkeet, спасибо Джон, я обновил ответ с вашими отзывами! –

+0

Теперь у вас есть тот же код, что и у ОП в вопросе, который не делает то, что он хочет. Проблема действительно в форматировании - и если OP использует формат, который не включает часть миллисекунды, нет необходимости менять значение в первую очередь. –

2

TL; др

myJavaUtilDate.toInstant() 
       .atOffset(ZoneOffset.UTC) 
       .format(DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss")) 

Избегайте унаследованное даты и время занятия

Вы используете хлопотно старые классы даты и время, теперь наследство, вытесняли классы java.time.

Instant

Преобразования старого java.util.Date объекта в java.time.Instant, вызвав новый метод, добавленным к старому классу.

Instant instant = myJavaUtilDate.toInstant() ; 

Округление

Если вы хотите изменить значение самих данных уронить долю секунды, вы можете укоротить. Классы java.time используют immutable objects, поэтому мы генерируем новый объект, а не изменяем (мутируем) оригинал.

Instant instantTruncated = instant.truncatedTo(ChronoUnit.SECONDS); 

Генерация строки

Если вместо усечения вы просто хотите, чтобы подавить отображение дробных секунд при создании строки, представляющей значение даты и времени, определить форматчик в соответствии с вашими потребностями.

Например, «uuuu-MM-dd HH: mm: ss» не упоминает дробную секунду, поэтому любые миллисекунды, содержащиеся в данных, просто не отображаются в сгенерированной строке.

Преобразование Instant в OffsetDateTime для более гибкого форматирования.

DateTimeFormatter f = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss"); 
OffsetDateTime odt = instant.atOffset(ZoneOffset.UTC) 
String output = odt.format(f); 

Часовой пояс

Обратите внимание, что ваш вопрос игнорирует вопрос о временной зоне. Если вы намеревались использовать UTC, приведенный выше код работает как Date, так и Instant в UTC по определению. Если вместо этого вы хотите воспринимать данные с помощью линзы какого-либо региона wall-clock time, примените часовой пояс. Поиск переполнения стека для ZoneId и ZonedDateTime имена классов для получения дополнительной информации.

+0

Упрощенный. Еще короче: 'Date now = Date.from (Instant.now(). TruncatedTo (ChronoUnit.SECONDS));' и вообще перестает использовать Date, поскольку он устарел. – smirnoff

0

Просто для записи, принятого ответа, данного на post you linked работ:

public static void main(String[] args) { 
     SimpleDateFormat df = new SimpleDateFormat("S"); 
     Date d = new Date(); 
     System.out.println(df.format(d)); 
     Calendar c = Calendar.getInstance(); 
     c.set(Calendar.MILLISECOND, 0); 
     d.setTime(c.getTimeInMillis()); 
     System.out.println(df.format(d)); 

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