我有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,但它仍会返回相同的完整日期,包括秒和所有内容。
知道我做错了什么?
答案 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)
我想以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
转换为Instant
。 Instant
类代表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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance 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的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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);
实际上你应该使用格式而不是解析