繁体   English   中英

在Java中转换MySQL日期格式

[英]Converting MySQL date format in Java

我在这里第一次接触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?

您可以将String转换为Date util:

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

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

DATE列类型

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

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

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

如果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" );

要从整数生成该字符串,您可以通过让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的试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

    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记录错误。

我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM