TL;博士
java.sql.Date.valueOf(
LocalDate.parse("12-Jan-23" , DateTimeFormatter.ofPattern("dd-MMM-uuuu" , Locale.US))
)
时区
你的代码忽略时区的关键问题。确定一个日期需要一个时区。对于任何特定的时刻,日期因地区而异。
您的代码使用始终使用UTC的Date
。因此,从错误名称Date
级别生成的日期值对于UTC准确,但对于其他时区(例如America/Montreal
或Asia/Kolkata
)无效。
使用java.time
现代的方式做到这一点的工作是与取代的麻烦旧的遗留日期时间类java.time类。
LocalDate
类代表没有时间和没有时区的仅有日期的值。
要解析传入的字符串,请使用DateTimeFormatter
定义格式模式。指定Locale
作为翻译月份名称时使用的人类语言。
DateTimeFormatter f = DateTimeFormatter.ofPattern("dd-MMM-uuuu" , Locale.US);
LocalDate localDate = LocalDate.parse("12-Jan-2017" , f);
使用JDBC 4.2及更高版本,可以用setObject
和getObject
方法直接通过LocalDate
到数据库。
对于尚未更新的JDBC驱动程序,请回退到java.sql类型。
java.sql.Date sqlDate = java.sql.Date.valueOf(localDate);
LocalDate localDate = sqlDate.toLocalDate();
关于java.time
的java.time框架是建立在Java 8和更高版本。这些类取代了日期时间类legacy,如java.util.Date
,Calendar
,& SimpleDateFormat
。
Joda-Time项目现在位于maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310。
从何处获取java.time类?
的ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval
,YearWeek
,YearQuarter
和more。
'String date'是怎么样的?注释:1)您应该使用'java.util.Date'而不是'java.sql.Date'。 2)你应该使用Joda时间而不是'java.util.Date'。 – BalusC 2010-02-02 12:46:19
“我的java日期有问题” - 没关系,每个人都有 – 2010-02-02 13:06:23