【发布时间】:2011-03-11 20:35:27
【问题描述】:
有没有直接的方法将 Java SQL 日期从格式 yyyy-MM-dd 转换为 dd MMMM yyyy 格式?
我可以将日期转换为字符串,然后对其进行操作,但我宁愿将其保留为 Java SQL 日期。在我需要这样做的时候,数据已经从 MySQL 数据库中读取,所以我不能在那里进行更改。
【问题讨论】:
有没有直接的方法将 Java SQL 日期从格式 yyyy-MM-dd 转换为 dd MMMM yyyy 格式?
我可以将日期转换为字符串,然后对其进行操作,但我宁愿将其保留为 Java SQL 日期。在我需要这样做的时候,数据已经从 MySQL 数据库中读取,所以我不能在那里进行更改。
【问题讨论】:
java.sql.Date 和java.util.Date(其中java.sql.Date 是一个子类)等对象本身没有格式。您使用java.text.DateFormat 对象以特定格式显示这些对象,而确定格式的是DateFormat(而不是Date 本身)。
例如:
Date date = ...; // wherever you get this
DateFormat df = new SimpleDateFormat("dd MMMM yyyy");
String text = df.format(date);
System.out.println(text);
注意:当您打印 Date 对象而不使用 DateFormat 对象时,如下所示:
Date date = ...;
System.out.println(date);
然后它将使用一些默认格式进行格式化。但是,该默认格式不是您可以更改的 Date 对象的属性。
【讨论】:
如果是用于演示,您可以立即使用 SimpleDateFormat:
package org.experiment;
import java.sql.Date;
import java.text.SimpleDateFormat;
public class Dates {
private static SimpleDateFormat df = new SimpleDateFormat("MMMM yyyy");
public static void main(String[] args){
Date oneDate = new Date(new java.util.Date().getTime());
System.out.println(df.format(oneDate));
}
}
【讨论】:
不清楚您所说的“Java SQL 日期”是什么意思。如果您的意思是java.sql.Date,那么它实际上并没有 字符串格式……它只是一个数字。要以特定方式在中对其进行格式化,请使用java.text.SimpleDateFormat 之类的内容。
或者,将其转换为 Joda Time DateTime; Joda Time 是一种比内置 API 更好的日期和时间 API。例如,SimpleDateFormat 不是线程安全的。
(请注意,java.sql.Date 比普通的 java.util.Date 具有更高的精度,但看起来您在这里不需要。)
【讨论】:
myJavaSqlDate.toLocalDate()
.format(
DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG )
.withLocale ( Locale.UK )
)
2017 年 5 月 11 日
正如其他人所说,日期时间对象具有无格式。只有从对象生成或由对象解析的字符串才有格式。但是这样的字符串总是与日期时间对象分开和不同的。
避免使用字符串将日期时间值与数据库进行通信。对于日期时间值,使用日期时间类来实例化日期时间对象。
JDBC 的真正目的是调解您的数据库和 Java 之间的类型差异。
其他答案已过时,因为它们使用麻烦的旧旧日期时间类或古老的 Joda-Time 库。两者都已被 java.time 类所取代。
如果您手头有一个java.sql.Date 对象,请通过调用添加到旧类的新方法toLocalDate 转换为java.time.LocalDate。
LocalDate ld = myJavaSqlDate.toLocalDate() ;
对于符合JDBC 4.2 及更高版本的JDBC drivers,您可以直接使用java.time 类型。
您似乎对仅日期值感兴趣。所以使用LocalDate。 LocalDate 类表示没有时间和时区的仅日期值。
PreparedStatement::setObjectResultSet::getObject要生成所需格式的字符串,您可以指定自定义格式模式。但我建议让 java.time 自动本地化。
要本地化,请指定:
FormatStyle 确定字符串的长度或缩写。Locale 确定 (a) 用于翻译日期名称、月份名称等的人类语言,以及 (b) 决定缩写、大写、标点符号、分隔符等问题的文化规范。例子……
LocalDate ld = LocalDate.now ( ZoneId.of ( "America/Montreal" ) ); // Today's date at this moment in that zone.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.UK );
String output = ld.format ( f );
输出:2017 年 5 月 11 日
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。
【讨论】: