在 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.Datejava.util.Calendarjava.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::setObjectResultSet::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.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。

从哪里获得 java.time 类?

Java SE 8SE 9 及更高版本 内置。 标准 Java API 的一部分,带有捆绑实现。 Java 9 添加了一些小功能和修复。 Java SE 6SE 7 ThreeTen-Backport 中的大部分 java.time 功能都向后移植到 Java 6 和 7。 Android ThreeTenABP 项目专门针对 android 改编了 ThreeTen-Backport(如上所述)。 见How to use ThreeTenABP…

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuarter 和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类型数据?

MySQL中的日期格式转换

php将日期格式转换为mysql格式以进行插入[重复]

将格式 MM/DD/YYYY 的日期转换为 MySQL 日期 [重复]

如何将欧洲格式的字符串日期转换为有效的 mysql 日期格式?