在Java中将日期转换为字符串并返回日期

在我的程序中,我试图将日期转换为字符串到指定的格式,然后再回到日期。 我需要日期为dd-MMM-yy格式。 所以,我正在使用SimpleDateFormat将日期转换为dd-MMM-yy格式,

SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yy"); String bookingDate = sdf.format(myDate); 

结果是我的预期,即23-May-12,但是当我使用parse()将字符串转换回日期时,它将更改为2012年5月23日13:16:14 IST 2012。

有没有办法在不改变格式的情况下将字符串转换回日期? 我严格地需要将指定格式的日期对象传递给查询。

当我使用parse()将字符串转换回日期时,它将更改为2012年5月23日星期三13:16:14。

这不是真的,它正确地转换回Date ,当你尝试打印Date实例时,它调用toString()方法并且它具有固定的格式化输出,所以如果你想要格式化的日期,你需要使用format()方法

简而言之,解析方法将String解析为Date ,没有Date属性,它保存格式,因此无论如何都需要使用format()方法

如果只是在查询字符串中附加日期,为什么需要将字符串日期转换回日期对象,如何在查询中传递日期对象? 如果您使用预备语句,那么您不必担心格式。 并且如上所述,Date对象不包含任何格式信息

如果您严格需要传递日期对象,那么不必担心其格式,因为Date对象可以理解其格式为Java,任何Java框架或SQL。

如果您直接在sql查询(连接)中传递日期,那么您可以使用在DB中看到的相同格式传递Date String,它将正确处理相同的格式。

您可以使用DateFormat.getDateInstance(DateFormat.SHORT, ).parse(myDate);

但是,您将使用标准格式的日期,如dd / MM / yy,而不是自定义。 模板取决于您使用的区域设置 。

您可以尝试使用标准Java库或ThreeTen / JSR-310构建自己的Pattern

我们现在有一种更现代的方式来完成这项工作。

java.time

java.time框架与Java 8及更高版本捆绑在一起。 请参阅教程 。 这些新类的灵感来自Joda-Time ,由JSR 310定义,并由ThreeTen-Extra项目扩展。 它们比麻烦的令人困惑的旧类java(util.Date / .Calendar等)有了很大的改进。

仅限日期的课程

新框架提供了一个类LocalDate ,用于表示仅限日期,没有任何时间或时区。

顺便说一句,年份使用两位数就是在寻找麻烦。 我强烈建议尽可能使用四位数年份。 java.time框架假定任何两位数年份都在20xx世纪,即2000年到2099年(包括两年)。

要解析字符串,请指定预期的格式。 您没有使用任何标准ISO 8601格式,因此我们必须定义格式模式。 指定包含我们希望为每月名称查找的语言的区域设置。

 // Parse String representation. String input = "23-May-12"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "d-MMMM-yy" , Locale.ENGLISH ); // Using four "M" characters means we expect the full name of the month. LocalDate localDate = formatter.parse ( input , LocalDate :: from ); 

要转向另一个方向,要生成日期值的字符串表示,我们可以回收相同的格式化程序。

  // Generate String representation. String output = localDate.format ( formatter ); 

转储到控制台。

  System.out.println ( "input: " + input + " → localDate : " + localDate ); System.out.println ( "localDate : " + localDate + " → output: " + output ); 

跑步的时候。

输入:23-May-12→localDate:2012-05-23

localDate:2012-05-23→输出:23-May-12