将 Oracle 日期解析为 Java

问题描述

我正在查询数据库并以“01-SEP-22”这种格式获取日期

我想在 Java 中将此日期转换为“yyyy-MM-dd”格式。有什么办法可以做到这一点。

解决方法

java.time

我建议您使用 java.time,现代 Java 日期和时间 API,用于您的日期工作。

为了解析所有大写的月份缩写(如 SEP),我们需要指示它应用不区分大小写的解析。

我们可以使用 DateTimeFormatterBuilder 用这样的指令构建一个 DateTimeFormatter

private static final DateTimeFormatter oracleFormatter
        = new DateTimeFormatterBuilder()
                .parseCaseInsensitive()
                .appendPattern("dd-MMM-uu")
                .toFormatter(Locale.ROOT);

其余的都很顺利:

    String stringFromOracle = "01-SEP-22";
    
    LocalDate date = LocalDate.parse(stringFromOracle,oracleFormatter);
    String formattedString = date.toString();
    
    System.out.println(formattedString);

输出为:

2022-09-01

为了生成字符串,我正在利用 LocalDate.toString() 提供您要求的格式这一事实,因此我没有明确使用任何格式化程序。该格式称为 ISO 8601,顾名思义,是一种国际标准。

改进建议

  1. 不要从 Oracle 检索您的日期作为 String。直接检索 LocalDate 并保存解析。
  2. 不要将日期从一种字符串格式转换为另一种格式。在您的程序中,将日期保留为 LocalDate。如果您需要接受字符串输入(这里不是这种情况),请立即将字符串解析为 LocalDate。仅当您需要将字符串输出(例如给用户或与其他系统进行数据交换)时,将 LocalDate 格式化为所需格式的字符串。

链接

,

您可以简单地使用 DateTimeFormatter

public String convertDate(String dateStr) throws ParseException {
    String[] split = dateStr.split("-");
    split[1] = split[1].substring(0,1).toUpperCase() + split[1].substring(1).toLowerCase();
    dateStr = String.join("-",split);
    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MMM-yy",Locale.ENGLISH);
    LocalDate date = LocalDate.parse(dateStr,dateFormatter);
    return date.toString();
}

@Test
public void test_convertDate() throws ParseException {
    assertEquals("2022-09-01",convertDate("01-SEP-22"));
}