如何在不转换为java的String的情况下将Date类型的格式更改为其他格式

时间:2015-12-11 12:31:06

标签: java date datetime

我想更改日期类型对象的格式而不转换为字符串类型。

目前我正在获取日期对象,然后再次将格式转换为日期对象后更改格式,但格式会更改。

这是我的代码

Date dateOld = issuebean.getCusDtl().getDob();
System.out.println(dateOld);

输出1:1955-01-24 00:00:00.0

之后我改变了格式

SimpleDateFormat formatter=  new SimpleDateFormat("dd-MM-yyyy");
String format1 = formatter.format(dateOld);
System.out.println(format1);

output2:24-01-1955

之后我将其解析为日期对象

Date format2 = formatter.parse(format1);
System.out.println(format2);

但现在输出输出3:Mon 1月24日00:00:00 IST 1955

我想在日期对象format2中使用output2,因为我需要在我的类中设置日期对象。

2 个答案:

答案 0 :(得分:1)

DateFormat工具,可将Date转换为String(方法format StringDate(方法parse)。阅读javadoc以获取更多信息

使用Date打印System.out.println时,使用toString() Date方法进行转换Date> String,如果您不想这样,您必须自己进行转换,使用DateFormat#format()调用(例如)

答案 1 :(得分:0)

滥用java.util.Date继承

output1的格式表明您未正确使用java.sql.Timestamp作为java.util.Date。

以下是一些示例代码作为证据。

java.sql.Timestamp sqlTimestamp = java.sql.Timestamp.valueOf ( "2015-01-23 00:00:00" );
java.util.Date improperUtilDate = sqlTimestamp;  // Do NOT do this. Docs warn against using this inheritance relationship.
java.util.Date properUtilDate = new java.util.Date ();

System.out.println ( "sqlTimestamp: " + sqlTimestamp + " | improperUtilDate: " + improperUtilDate + " | properUtilDate: " + properUtilDate );
  

sqlTimestamp:2015-01-23 00:00:00.0 | improperUtilDate:2015-01-23 00:00:00.0 | properUtilDate:Sun Dec 13 12:27:22 PST 2015

虽然技术上java.sql.Timestamp是java.util.Date的子类,但文档告诉您忽略该事实并将它们视为独立的。这个类设计是一个黑客,是在早年将Java推向市场的过程中做出的一个不幸的选择。

Date-Time!= String

RC的Answer。是正确的。日期时间对象没有“格式”。您似乎将日期时间对象与该值的生成的String表示形式混淆。

您可以解析String以获取日期时间对象。并且日期时间对象可用于生成表示日期时间值的String。日期时间对象和字符串始终是单独的不相关对象。

java.time

Java 8及更高版本中内置的java.time框架取代了棘手的旧java.util.Date/.Calendar类。新课程的灵感来自非常成功的Joda-Time框架,旨在作为其继承者,在概念上类似但重新设计。由JSR 310定义。由ThreeTen-Extra项目扩展。请参阅Tutorial

从java.sql转换为java.time

仅使用java.sql。*类(java.sql.Timestamp,java.sql.Date等)来获取数据库的日期。然后尽快转换为java.time。最终JDBC驱动程序将更新为直接使用java.time类型。但直到那天我们必须转换。

java.sql.Timestamp sqlTimestamp = java.sql.Timestamp.valueOf ( "2015-01-23 00:00:00" );
Instant instant = sqlTimestamp.toInstant ();

时区

从那里你只想要日期,没有时间。要确定日期,我们需要应用时区。日期仅在特定时区内具有意义。例如,新的一天在巴黎早些时候比在蒙特利尔,甚至更早在加尔各答开始。

ZoneId zoneId = ZoneId.of ( "Asia/Kolkata" );  // For UTC, use the constant ZoneOffset.UTC.

应用该时区以获得ZonedDateTime。从那里我们可以提取一个仅限日期的对象,LocalDate

ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate ();

格式化

现在找到或定义一个格式化程序来指导生成LocalDate对象值的String表示。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "dd-MM-yyyy" ); // Or better yet, let java.time determine a localized format.
String output = localDate.format ( formatter );

转储到控制台。

System.out.println ( "sqlTimestamp: " + sqlTimestamp + " = instant: " + instant + " in zoneId: " + zoneId + " is zdt: " + zdt + " with localDate: " + localDate + " as output: " + output );
  

sqlTimestamp:2015-01-23 00:00:00.0 =即时:2015-01-23T08:00:00Z在zoneId:Asia / Kolkata是zdt:2015-01-23T13:30 + 05:30 [亚洲/加尔各答]与localDate:2015-01-23作为输出:23-01-2015