Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将字符串转换为“中的java.sql.Date对象”;YYYY“;格式_Java_Date Formatting_Date - Fatal编程技术网

将字符串转换为“中的java.sql.Date对象”;YYYY“;格式

将字符串转换为“中的java.sql.Date对象”;YYYY“;格式,java,date-formatting,date,Java,Date Formatting,Date,我想创建一个格式为“YYYY”的java.sql.Date对象。它应该只有一年的时间。我做了很多研究,但找不到一种方法。您需要创建一个java.util.Date,然后使用接受长的构造函数将其转换为java.sql.Date 例如: String year = "2018"; DateFormat format = new SimpleDateFormat("yyyy"); java.util.Date utilDate = format.parse(year); java.sql.Date

我想创建一个格式为“YYYY”的java.sql.Date对象。它应该只有一年的时间。我做了很多研究,但找不到一种方法。

您需要创建一个
java.util.Date
,然后使用接受
的构造函数将其转换为
java.sql.Date

例如:

String year = "2018";

DateFormat format = new SimpleDateFormat("yyyy");
java.util.Date utilDate = format.parse(year);
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
然而,这并不是“仅仅一年”。Java中的日期总是有一个时间组件,所以这是不可能的——在我的示例中是“2018年1月1日00:00:00 GMT”。这是否足够接近你想要的,或者你能改进你的问题吗

此外,
java.sql.Date
扩展了
java.util.Date
,因此理想情况下,只要有可能,您就可以使用前者来满足Liskov替换原则。

tl;博士 永远不要使用糟糕的
java.sql.Date
类,它的设计很糟糕,存在多个缺陷

使用
java.time.Year
对象或整数

myPreparedStatement.setObject( … , Year.of( 2018 ) ) ;
…或者,在代码的其他部分使用
Year
时:

myPreparedStatement.setInt( … , Year.of( 2018 ).getValue() ) ;
java.time 现代解决方案使用多年前的java.time类取代了
SimpleDateFormat
java.util.date
java.sql.date
等可怕的旧日期时间类

该类巧妙地表示年份值。在代码中使用此类可以确保类型安全,并使代码更加自我记录

解析字符串输入

Year y = Year.parse( "2018" ) ;
解析整数输入

Year y = Year.of( 2018 ) ;  // Integer literal.
JDBC 从JDBC4.2开始,我们可以直接交换java.time类型

交换
年份
对象 我不知道这是否包括MySQL中的
Year
类和
Year
数据类型。但是试一试。如果没有,请向JDBC驱动程序供应商发出功能请求以扩展支持。考虑到MySQL有一个明确的
YEAR
类型,这似乎是一个合理的期望

myPreparedStatement.setObject( … , y ) ;
检索

Year y = myResultSet.getObject( … , Year.class ) ;
Year y = Year.of( myResultSet.getInt( … ) ) ;  // Retrieve integer, convert to `Year` object.
交换整数 如果您的JDBC驱动程序不能直接使用
java.time.Year
,请使用整数

myPreparedStatement.setInt( … , y.getValue() ) ;  // Pass year as an integer number.
检索

Year y = myResultSet.getObject( … , Year.class ) ;
Year y = Year.of( myResultSet.getInt( … ) ) ;  // Retrieve integer, convert to `Year` object.

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

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

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(可能是重复的。虽然
      java.sql.Date
      假装只有一个日期,但它至少有一个日期,而不仅仅是一年。在幕后,它有一个毫秒预测的时间点。也就是说,该类有设计问题,而且已经过时很久了。不过,你绝对需要一个吗?我建议
      year
      和/或来自java.time的
      LocalDate
      ,这是现代java日期和时间API。它们确实符合它们的名称,并且只保存名称所说的内容。上述两个类中都不能包含格式(但
      Year.toString
      生成您似乎想要的格式)。实际上,我正在尝试将数据插入到“Year”类型的列中在使用JBOSS TEID的MySQL数据库中的一个表中。为了实现此TEID,需要sql date格式的数据。仅供参考,非常麻烦的旧日期时间类,例如,和
      java.text.simpleDataFormat
      ,现在被内置于java 8和更高版本中的类所取代。请参阅。类JavaDoc告诉您忽略继承
      java.util.Date
      java.sql.Date
      之间的关系,这是由于糟糕的设计中的一个可怕的黑客攻击造成的。请注意,JDBC 4.2只定义了对
      LocalDate
      LocalTime
      LocalDateTime
      OffsetTime
      的支持,所有其他java.time类型都是驱动程序指定的c扩展。