在java上转换日期

时间:2015-04-06 18:19:44

标签: java date simpledateformat

我有jCalendar方法jCalendar.getDate()以下列形式返回日期: Mon Apr 06 11:10:00 PDT 2015 但我希望它以yyyy-MM-dd格式插入到MySQL数据库中 我尝试了以下代码,但它抛出了ParseException

Date fecha = jFecha.getDate(); //this returns Mon Apr 06 11:10:00 PDT 2015
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            fecha = format.parse(fecha.toString());

此代码返回Unparseable date: "Mon Apr 06 11:10:00 PDT 2015"错误。我已经尝试将dateFormatString的{​​{1}}属性设置为yyyy-MM-dd,但它仍会返回相同的完整日期,包括秒和所有内容。

知道我做错了什么?

3 个答案:

答案 0 :(得分:1)

首先,Date对象本身没有格式。你不能拥有格式为yyyy-MM-dd"的Date对象。 - 没有某种格式的Date对象。

如何在数据库中插入Date - 您使用的是JDBC吗?如果是,则使用PreparedStatement并传递java.sql.Date对象作为参数。像这样:

PreparedStatement ps = connection.prepareStatement(
        "insert into mytable (name, date) values (?, ?)");

ps.setParameter(1, "somename");
ps.setParameter(2, new java.sql.Date(fecha.getTime()));

ps.executeUpdate();

答案 1 :(得分:0)

TL;博士

  

我想以yyyy-MM-dd格式插入MySQL数据库

无需生成或解析字符串。使用Date对象,转换为java.time.Instant,应用时区ZoneId生成ZonedDateTime,并提取LocalDate。通过JDBC 4.2及更高版本传递LocalDate

myPreparedStatement.setObject( 
    … ,
    myJavaUtilDate.toInstant()
                  .atZone( ZoneId.of( "Pacific/Auckland" ) )
                  .toLocalDate() ,
    LocalDate.class
)

详细

  

jCalendar.getDate()以下列形式返回日期:Mon Apr 06 11:10:00 PDT 2015

Date& Calendar类有许多缺陷。其中一个缺陷是,在生成字符串的过程中,Date::toString方法应用时区的设计决策很差。当实际Date值始终为UTC时,这会产生指定时区的错觉。

避免使用麻烦的旧日期时间类。它们现在已经遗留下来,取而代之的是java.time类。

Date转换为InstantInstant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

Instant instant = myUtilDate.toInstant() ;

对于仅限日期的值,您必须确定时区。例如,法国巴黎午夜过后几分钟是新的一天,而蒙特利尔魁北克仍然是“昨天”。因此,您必须指定区域的上下文以确定预期日期。

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

对于仅限日期的值,如果没有时间且没有时区,请提取LocalDate

LocalDate ld = zdt.toLocalDate() ;

要与数据库交换日期时间值,请使用日期时间对象而不仅仅是字符串。您无需生成或解析有问题的字符串。

如果JDBC驱动程序符合JDBC 4.2及更高版本,则可以直接使用java.time类型而不是旧版java.sql类型。

myPreparedStatement.setObject ( 1 , ld ); // Automatic detection and conversion of data type.

...和...

LocalDate ld = myResultSet.getObject ( "my_date_column_" , LocalDate.class ); 

有关详细讨论,请参阅Insert & fetch java.time.LocalDate objects to/from an SQL database such as H2

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:-1)

请改为:

Date fecha = jFecha.getDate(); //this returns Mon Apr 06 11:10:00 PDT 2015
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        fecha = format.format(fecha);

实际上你应该使用格式而不是解析