【问题标题】:Parse Oracle date to Java将 Oracle 日期解析为 Java
【发布时间】:2021-03-17 02:05:24
【问题描述】:

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

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

【问题讨论】:

  • 您似乎正在从数据库中获取日期作为字符串。不要那样做。 Retrieve a LocalDate object. 然后它的toString() 方法会给你你要求的格式。
  • 请了解您应该在 Stack Overflow 上提问之前进行搜索,当您发布问题时,请告诉我们您的搜索结果并说明它如何未能解决您的问题。这是为您自己着想,因为 (1) 您通常可以更快地找到更好的答案 (2) 它使我们能够提供更准确、更有针对性的答案。
  • 在这种情况下,22 是指 1922 年还是 2022 年?
  • 您标记了您的问题 simpledateformat。我建议你不要使用SimpleDateFormat。这个类是出了名的麻烦和过时。而是使用来自java.time, the modern Java date and time APIDateTimeFormatter
  • @OleV.V.这个问题不是that one 的重复。这个问题的月份全部大写,而另一个问题的月份名称只有一个初始上限。而那个问题在这一年中缺少一个世纪。

标签: java date simpledateformat


【解决方案1】:

java.time

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

为了解析全部大写的月份缩写(如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 格式化为所需格式的字符串。

链接

【讨论】:

    【解决方案2】:

    你可以简单地使用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"));
    }
    

    【讨论】:

    • 我绝对建议您按照您的建议使用DateTimeFormatter。可以说服它不区分大小写,请参阅我的答案,因此不需要您的大写和小写技巧。顺便说一句,您的方法不能抛出ParseException,所以我建议您删除throws 子句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2013-06-05
    • 1970-01-01
    • 2023-04-10
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多