如何将 java.sql.Timestamp 格式化为日期(yyyy-MM-dd HH:mm:ss)?

9

嗯,我在使用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

我尝试了以下操作(facturaFactura 对象):

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个回答

19

你根本不需要使用substring,因为你的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

谢谢,但我忘记说我想把新的日期fechaNueva放到同一个对象上...就像这样:SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String fechaStr = "2013-10-10 10:49:29.10000"; Date fechaNueva = format.parse(fechaStr); factura.setFecha(fechaNueva);但是仅有Date fechaNueva = format.parse(fechaStr);,我得到了错误的格式Thu Oct 10 10:49:29 CDT 2013,而我不想要这个... - user2284257
@user2284257 Locale 是用于时区而不是格式化的。如我之前所述,在 SimpleDateFormat 的 format 方法中就有你需要的内容。如果你尝试了我提供的代码,你应该会看到正确的输出,就像你在问题中所述的那样:2013-10-10 10:49:29。 - Sajal Dutta
是的,String是正确的,但是如何将格式正确的2013-10-10 10:49:29放入我的对象Factura中作为Date类型呢?这就是问题所在:factura.setFecha(fechaNueva);,我该怎么做才能使fechaNueva按照2013-10-10 10:49:29格式进行格式化呢? - user2284257
这是因为我在TableModel中使用了Factura对象,所以它在列“fecha”上打印出了这个:Thu Oct 10 10:49:29 CDT 2013 - user2284257
我认为你在理解这个概念上有问题。当你执行setFecha时,你保存了正确的值。当你在TableModel中打印它时,使用你想要的格式进行打印。你可以为你的打印需求创建其他简单的日期格式。只是不要执行System.out.print(fechaNueva)或fechaNueva.toString()。在打印之前你需要格式化它。 - Sajal Dutta
显示剩余2条评论

3

日期时间对象不是字符串

java.sql.Timestamp类没有格式。它的toString方法生成一个带有格式的字符串。

不要混淆日期时间对象和可能表示其值的字符串。日期时间对象可以解析字符串和生成字符串,但它本身不是字符串。

java.time

首先将受困于旧的遗留日期时间类转换为java.time类。使用添加到旧类中的新方法。

Instant instant = mySqlDate.toInstant() ;

抛弃你不需要的零点几秒。

instant = instant.truncatedTo( ChronoUnit.SECONDS );

将时区指定为Instant所使用的UTC偏移量。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接