Как избавиться от миллисекунд объекта Date в Java формате

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

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

Как удалить sub секунд часть объекта даты

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

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

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

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));

выведет что-то как...

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

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


можно использовать SimpleDateFormatter. Пожалуйста, см. следующий код.

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

tl; dr

отрубить долю секунды.

myJavaUtilDate.toInstant()                         // Convert from legacy class to modern class. Returns a `Instant` object.
              .truncatedTo( ChronoUnit.SECONDS )   // Generate new `Instant` object based on the values of the original, but chopping off the fraction-of-second.

скрыть дробную секунду, при генерации String.

myJavaUtilDate.toInstant()                         // Convert from legacy class to modern class. Returns a `Instant` object.
              .atOffset( ZoneOffset.UTC )          // Return a `OffsetDateTime` object. 
              .format( DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" ) ). // Ask the `OffsetDateTime` object to generate a `String` with text representing its value, in a format defined in the `DateTimeFormatter` object.

избегайте устаревших классов даты и времени

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

Instant

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

Instant instant = myJavaUtilDate.toInstant() ;

усечь

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

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 по определению. Если вместо этого вы хотите воспринимать данные через объектив некоторого региона времени, применить часовой пояс. Поиск переполнения стека для ZoneId и ZonedDateTime имена классов для получения дополнительной информации.


о java.время

на java.время framework встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойных старых наследие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

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

чтобы узнать больше, см. В Oracle Учебник. И search Stack Overflow для многих примеров и объяснений. Спецификация JSR 310.

вы можете обменять java.время объекты непосредственно с вашей базой данных. Используйте драйвер JDBC соответствуют JDBC 4.2 или позже. Нет необходимости в строках, нет необходимости в java.sql.* классы.

где получить java.время занятий?

  • Java SE 8, Java SE 9, Java SE 10, и позже
    • встроенный.
    • часть стандартного API Java со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • большая часть java.функциональность времени обратно портирована на Java 6 & 7 в ThreeTen-Backport.
  • Android

на ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательной площадкой для возможных будущих дополнений к java.время. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и больше.


используйте DateUtils Apache:

import org.apache.commons.lang.time.DateUtils;
...
DateUtils.truncate(new Date(), Calendar.SECOND)

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

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

ваш код будет выглядеть примерно так:

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

просто для записи, принятый ответ, данный в сообщение, которое вы связали работает:

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));

}

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

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