在Java中转换MySQL日期格式

4
我是一个有用的助手,可以为您翻译文本。以下是需要翻译的内容:

我第一次接触Java,所以请对我温柔点。我现在正在纠正别人的旧代码。这个Java程序从MySQL表中获取数据,并准备将其呈现在网页上。我发现他们的MySQL表出于某种原因使用INT字段存储所有日期。例如,今天的日期存储为INT 3222017。我首先必须向MySQL表添加正确的DATE列。接下来,我重新制作了另一个Java脚本,从较大的表格中提取数据,供此脚本使用的MySQL表。

现在,我需要更改当前格式化INT字段为MM/dd/yyyy的代码,以便使用DATE字段(存储为yyyy-MM-dd)并将它们转换为相同的MM/dd/yyyy。

这里是一段使用函数dateFormat处理INT字段的代码片段 -

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;
    }

我该如何将一个日期字段(yyyy-MM-dd)转换为格式化的日期 MM/dd/yyyy?


2
1112017是1-11-2017还是11-1-2017? - Gurwinder Singh
好问题!我甚至没有考虑过这个问题 - 但这也可能是为什么我被要求查看正在发生的事情,因为一些页面显示了不准确的数据。 - BigRedEO
1
如果您的数据库已经有一个正确的“DATE”列,请按照正常方式加载它作为“java.sql.Date”,然后使用“SimpleDateFormat”格式化它。此外,有些人不应该触碰数据库。 - Kayaman
@Kayaman - 所以跳过dateFormat函数,只需在第一段代码中使用SimpleDateFormat的formattedDate部分? - BigRedEO
1
好吧,dateFormat() 存在只是因为有人想出了将日期存储在如此愚蠢的方式中。当您读取普通日期时,Java 中包含所有格式化功能。而且,日期实际上并没有以 2010-01-01 格式存储。它是以该格式 显示 给您的。 - Kayaman
3个回答

6
您可以使用String to Date util将字符串转换为日期:
 DateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
 Date date = format.parse(your string);

然后将日期对象转换为您的字符串格式:
 DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
 String result = df.format(date);

FYI,老旧的日期时间类(如java.util.Datejava.util.Calendarjava.text.SimpleTextFormat)现在已经成为遗留系统,被Java.time类所取代。 - Basil Bourque
这个稍微有点变化的方法最终对我起了作用。谢谢! - BigRedEO

3

简而言之

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年3月22日

DATE列类型

这是一种非常糟糕的存储日期值的方式。

在存储日期数据时,应该使用日期数据类型来定义数据库列。

你不应该使用整数或字符串来移动这些数据进出数据库。让你的JDBC驱动程序完成它的工作,将java.time.LocalDate对象传输到/从作为日期数据类型定义的数据库列中。在MySQL中,这将是DATE类型

如果您的JDBC驱动程序符合JDBC 4.2或更高版本,请使用PreparedStatement :: setObjectResultSet :: getObject方法传递和获取java.time.LocalDate对象。 对于旧的驱动程序,请将java.time类型转换为旧的java.sql类型,例如{{link1: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" );

要从整数生成该字符串,您可以通过让Java使用前导零填充来缩短您现有的代码。

String input = String.format("%08d", 3222017) ;

03222017

使用 DateTimeFormatter 解析该输入,生成一个 LocalDate 对象。

LocalDate localDate = LocalDate.parse( input , f );

localDate.toString(): 2017-03-22

请参见在IdeOne.com上运行的代码


关于java.time

java.time框架内置于Java 8及以上版本。这些类取代了老旧且麻烦的遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

Joda-Time项目现处于维护模式,建议迁移到java.time类。

要了解更多,请查看Oracle教程。并在Stack Overflow上搜索许多示例和解释。规范为JSR 310
如何获取java.time类?

ThreeTen-Extra项目通过添加额外的类来扩展java.time。该项目是java.time可能未来添加内容的试验场。您可能会在这里找到一些有用的类,例如Interval, YearWeek, YearQuarter更多


我不会解析INT字段。这就是程序目前正在做的事情。我已经添加了与当前用于日期的三个INT列匹配的DATE列。现在我只需要知道如何将DATE列格式化为MM/dd/yyyy,而不是在MySQL中显示的yyyy-MM-dd格式。所以你是说在我确认JDBC是否符合4.2或更高版本之前,我应该能够使用java.sql.Date sqlDate = java.sql.Date.valueOf(myLocalDate);来获取我想要的日期格式吗? - BigRedEO
1
对于现代JDBC 4.2驱动程序,您根本不需要使用java.sql.Date。尽可能只使用java.time类。传统的日期时间类非常混乱,设计不良,具有令人尴尬的hack。如果您的驱动程序尚未更新,请退回到java.sql类型,但立即通过调用添加到旧类中的新转换方法将其转换为java.time对象。拥有java.time.LocalDate后,可以按所需格式生成字符串。请重新阅读我的答案;所有这些都已涵盖。在Stack Overflow上搜索更多示例。 - Basil Bourque

0
    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块。如果无法将String转换为SimpleDateFormat,则需要使用try-catch块。如果无法解析,则记录一个ParseException错误。

希望这可以帮到你。


谢谢uberdwang。如果您能批准我的答案,那将对我很有帮助。提前感谢。 - João Marcos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接