Как отформатировать java.sql.Timestamp(гггг-ММ-дд ЧЧ: мм: сс.с) к дате (гггг-ММ-дд ЧЧ: мм: сс)

Ну, у меня есть детали, используя Dateпотому что я получаю объект из моей базы данных и в переменной "fecha" (дата) из того же объекта, я получаю java.sql.Timestamp, так что форматирование с миллисекундами, но я не хочу, чтобы миллисекунды появлялись. Поэтому мне нужно отформатировать дату, которую я получаю из моей БД, в новую дату без миллисекунд.

Это объект Factura:

public class Factura  implements java.io.Serializable {

 private FacturaId id;
 ...
 private boolean activo;
 private Date fecha;
}

В XML, который сопоставлен с БД, у меня есть этот код для этой переменной "fecha":

<property name="fecha" type="timestamp">
  <column length="19" name="fecha" not-null="true"/>
</property>

В базе данных этот столбец fecha DATETIME,

И когда я получаю объект Factura из моей БД я получаю такую ​​дату 2013-10-10 10:49:29.0 но я хочу это без .0 (миллисекунды).

Я пробовал это (factura это Factura объект):

try {
   SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
   Date fechaNueva = null;
   String fechaStr = factura.getFecha().toString();
   int tamaño = fechaStr.length()-2;
   fechaStr = fechaStr.substring(0, tamaño); //I get a string without the miliseconds
   fechaNueva = format.parse(fechaStr);
} catch(ParseException ex) {
   ...
}

Но fechaNueva дает мне Thu Oct 10 10:49:29 CDT 2013 и я хочу только 2013-10-10 10:49:29, не могли бы вы мне помочь, пожалуйста?

Заранее большое спасибо.

2 ответа

Решение

Вам не нужно использовать подстроку вообще, так как ваш format не держит эту информацию.

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String fechaStr = "2013-10-10 10:49:29.10000";  
Date fechaNueva = format.parse(fechaStr);

System.out.println(format.format(fechaNueva)); // Prints 2013-10-10 10:49:29

Объект даты и времени не является строкой

Класс java.sql.Timestamp не имеет формата. Его метод toString генерирует строку в формате.

Не связывайте объект даты и времени со строкой, которая может представлять его значение. Объект даты и времени может анализировать строки и генерировать строки, но сам по себе не является строкой.

java.time

Сначала преобразуйте проблемные старые унаследованные классы даты и времени в классы java.time. Используйте новые методы, добавленные к старым классам.

Instant instant = mySqlDate.toInstant() ;

Потерять долю секунды, которую вы не хотите.

instant = instant.truncatedTo( ChronoUnit.Seconds );

Присвойте часовой пояс для настройки по UTC, используемому Instant.

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z );

Создайте строку, близкую к желаемому результату. Заменить его T в середине с пробелом.

DateTimeFormatter f = DateTimeFormatter.ISO_LOCAL_DATE_TIME ;
String output = zdt.format( f ).replace( "T" , " " );
Другие вопросы по тегам