在 Java 中转换 MySQL 日期格式
Posted
技术标签:
【中文标题】在 Java 中转换 MySQL 日期格式【英文标题】:Converting MySQL date format in Java 【发布时间】:2017-08-15 00:07:55 【问题描述】:我是第一次在这里接触 Java,所以请放轻松。我不得不更正别人的旧代码。这个 java 程序从 mysql 表中获取数据并准备好在网页上展示。我发现他们的 MySQL 表出于某种原因对所有日期都使用了 INT 字段。因此,例如,今天的日期存储为 INT 3222017。我首先必须将正确的 DATE 列添加到 MySQL 表中。接下来,我重新编写了另一个 Java 脚本,以从更大的表中提取该脚本将使用的 MySQL 表的数据。
现在我需要将当前将 INT 字段格式化为 MM/dd/yyyy 的代码更改为采用 DATE 字段(存储为 yyyy-MM-dd)并将它们转换为相同的 MM/dd/yyyy。
这是一段在 INT 字段上使用函数 dateFormat 的代码 -
String formattedDate = "";
formattedDate = dateFormat(oneSpectro.getSpectroLastDate());
result.setSpectroLastDate(formattedDate);
formattedDate = dateFormat(oneSpectro.getSpectroOrigDate());
result.setSpectroOrigDate(formattedDate);
formattedDate = dateFormat(oneSpectro.getSpectroCalDate());
result.setSpectroCalDate(formattedDate);
return result;
这里是 dateFormat 函数 -
public String dateFormat(int theDate)
String dateString = "";
Integer dateInt = 0;
if (theDate < 10000000)
dateInt = new Integer(theDate);
dateString = dateInt.toString();
// Add preceding 0 to make the date 8 digits in length.
dateString = "0" + dateString;
else
// Process an 8 digit date.
dateInt = new Integer(theDate);
dateString = dateInt.toString();
// Install date slashes in the date string.
if (dateString.length() == 8)
dateString = dateString.substring(0, 2) + "/" + dateString.substring(2, 4) + "/"
+ dateString.substring(4);
return dateString;
如何将 DATE 字段 (yyyy-MM-dd) 转换为 MM/dd/yyyy 的格式化日期?
【问题讨论】:
1112017呢?是 2017 年 1 月 11 日还是 2017 年 11 月 1 日? 好问题!我什至没有想到这一点 - 但这也可能是我被要求查看发生了什么的原因,因为某些页面显示的数据不准确。 如果您使用正确的DATE
列修复了数据库,请将其正常加载为java.sql.Date
,然后使用SimpleDateFormat
对其进行格式化。另外,有些人不应该被允许接触数据库。
@Kayaman - 所以跳过 dateFormat 函数,只在第一段代码中使用 SimpleDateFormat formattedDate 部分?
嗯,dateFormat()
的存在只是因为有人有以这种愚蠢的方式存储日期的天才想法。当您阅读普通日期时,您已经拥有了 Java 中包含的所有格式化功能。此外,日期实际上并未以2010-01-01
格式存储。它以该格式显示给您。
【参考方案1】:
您可以将字符串转换为日期实用程序:
DateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
Date date = format.parse(your string);
然后将 Date 对象转换为您的 String 格式:
DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
String result = df.format(date);
【讨论】:
仅供参考,麻烦的旧日期时间类,如java.util.Date
、java.util.Calendar
和 java.text.SimpleTextFormat
现在是 legacy,被 java.time 类取代。
这方面的细微变化最终对我有用。谢谢!【参考方案2】:
tl;博士
LocalDate.parse( // Use modern java.time classes rather than troublesome legacy date-time classes
String.format("%08d", 3222017) , // Let Java pad with leading zero.
DateTimeFormatter.ofPattern( "MMdduuuu" ) // Parse string as a `LocalDate`.
)
2017-03-22
DATE
列类型
这是一种非常糟糕的存储日期值的方法。
存储日期数据时,应在定义数据库列时使用日期数据类型。
您不应该使用整数或字符串将这些数据移入和移出数据库。 让您的 JDBC 驱动程序完成它的工作,将 java.time.LocalDate
对象传输到/从定义为日期数据类型的数据库列中。在MySQL that would be the DATE
type.
如果您的 JDBC 驱动程序符合 JDBC 4.2 或更高版本,请使用 PreparedStatement::setObject
和 ResultSet::getObject
方法来传递和获取 java.time.LocalDate
对象。对于较旧的驱动程序,请将 java.time 类型转换为旧的 java.sql 类型,例如 java.sql.Date
。寻找添加到旧类的新方法进行转换。
java.sql.Date sqlDate = java.sql.Date.valueOf( myLocalDate );
往另一个方向发展。
LocalDate localDate = myJavaSqlDate.toLocalDate();
java.time
其他答案使用麻烦的旧旧日期时间类。这些现在是遗留的,被 java.time 类所取代。
LocalDate
类表示没有时间和时区的仅日期值。
日期的格式 YYYY-MM-DD 在 ISO 8601 标准中定义。 java.time 类默认使用标准格式。所以不需要指定格式模式。
LocalDate localDate = LocalDate.parse( "2017-03-22" );
要解析你的时髦伪整数字符串,请定义一个格式化模式来匹配。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MMdduuuu" );
要从整数生成该字符串,您可以将现有代码缩短为letting Java pad with leading zero。
String input = String.format("%08d", 3222017) ;
03222017
使用DateTimeFormatter
解析输入以生成LocalDate
对象。
LocalDate localDate = LocalDate.parse( input , f );
localDate.toString(): 2017-03-22
看到这个code run live at IdeOne.com。
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date
、Calendar
和 SimpleDateFormat
。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?
Java SE 8 和 SE 9 及更高版本 内置。 标准 Java API 的一部分,带有捆绑实现。 Java 9 添加了一些小功能和修复。 Java SE 6 和 SE 7 ThreeTen-Backport 中的大部分 java.time 功能都向后移植到 Java 6 和 7。 Android ThreeTenABP 项目专门针对 android 改编了 ThreeTen-Backport(如上所述)。 见How to use ThreeTenABP…。ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval
、YearWeek
、YearQuarter
和more。
【讨论】:
我不会解析 INT 字段。这就是该程序目前正在做的事情。我添加了与当前用于日期的三个 INT 列匹配的 DATE 列。现在我只需要知道如何将 DATE 列格式化为 MM/dd/yyyy,而不是在 MySQL 中显示为 yyyy-MM-dd。那么你是说在我确认 JDBC 是否符合 4.2 或更高版本之前,我应该能够使用java.sql.Date sqlDate = java.sql.Date.valueOf( myLocalDate );
来获取以我想要的格式显示的日期吗?
@BigRedEO 对于现代 JDBC 4.2 驱动程序,您根本不需要java.sql.Date
。 尽可能只使用 java.time 类。遗留的日期时间类是一团糟,设计糟糕,有笨拙的黑客。如果您的驱动程序尚未更新,则回退到 java.sql 类型,但通过调用添加到旧类的新转换方法立即转换为 java.time 对象。使用java.time.LocalDate
,生成所需格式的字符串。重读我的答案;这一切都涵盖了。搜索 Stack Overflow 以获取更多示例。【参考方案3】:
try
String dateString = "2017-03-22";
// convert string to date
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
Date date = f.parse(dateString);
// change the date format
SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
String result = df.format(date);
catch(ParseException e)
throw new RuntimeException(e);
Joao 的解决方案有效。一些陷阱:
在我的编译器中,我无法将 DateFormat 转换为 SimpleDateFormat。我坚持使用 SimpleDateFormat 对象。 我的编译器强制使用 try-catch 块。需要一个 try catch 块,以防它无法从 String 转换为 SimpleDateFormat。如果无法解析,请使用 ParseException 记录错误。我希望这会有所帮助。
【讨论】:
感谢 uberdwang。如果可以,请同意我的回答。它帮助到我。提前谢谢。以上是关于在 Java 中转换 MySQL 日期格式的主要内容,如果未能解决你的问题,请参考以下文章
mysql中怎么把日期的格式转换为YYYYMMDD的数字形式,谢谢
如何将JAVA DATE类型的日期 转换成指定格式类型的 (如:YYYY-MM-DD) 的 DATE类型数据?