当前位置: 首页 > 知识库问答 >
问题:

将日期从DD-MMM-YYYY重新格式化为YYYYDDMM或yyyymdd

公良骁
2023-03-14

我试图使用Java8重新格式化今天的日期,但我得到了以下错误:

java.time.format.DateTimeParseException:无法解析文本'09-Oct-2017':无法从TemporalAccessor获取LocalDate:{WeekBasedYear[WeekFields[SUNDAY,1]]=2017,MonthOfYear=10,DayOfYear=9},类型为java.time.Format.Parsed 的ISO

代码:

public static String formatDate(String inputDate, String inputDateFormat, String returnDateFormat){
    try {
        DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder().parseCaseInsensitive().appendPattern(inputDateFormat).toFormatter(Locale.ENGLISH);            
        LocalDate localDate = LocalDate.parse(inputDate, inputFormatter);

        DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern(returnDateFormat);
        String formattedString = localDate.format(outputFormatter);
        return formattedString;
    } catch (DateTimeParseException dtpe) {
        log.error("A DateTimeParseException exception occured parsing the inputDate : " + inputDate + " and converting it to a " + returnDateFormat + " format. Exception is : " + dtpe);           
    }
    return null;
}

我以前尝试使用SimpleDateFormat,但问题是我的InputDateFormat格式总是大写DD-MMM-YYY,这会给出不正确的结果,所以我尝试使用ParsecaseInsensition()忽略大小写敏感性。

共有1个答案

贺元明
2023-03-14

在注释中,您告诉输入格式为dd-Mmm-yyyy。根据javadoc,大写的dd是年份的日期字段,而yyyy是基于星期的年份字段(可能与年份字段不同)。

您需要将它们更改为小写dd(月份的日子)和yyyy(纪元的年份)。parsecaseinsensity()只负责文本字段--在本例中是月份名称(数字不受大小写敏感性的影响--只是因为月份是大写的,并不意味着数字模式也应该是大写的)。

其余的代码是正确的。示例(将格式更改为yyyymmdd):

String inputDate = "09-OCT-2017";
DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder()
    .parseCaseInsensitive()
    // use "dd" for day of month and "yyyy" for year
    .appendPattern("dd-MMM-yyyy")
    .toFormatter(Locale.ENGLISH);
LocalDate localDate = LocalDate.parse(inputDate, inputFormatter);

// use "dd" for day of month and "yyyy" for year
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
String formattedString = localDate.format(outputFormatter);
System.out.println(formattedString); // 20171009
String pattern = "DD-MMM-YYYY";
DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder()
    .parseCaseInsensitive()
    // replace DD and YYYY with the lowercase versions
    .appendPattern(pattern.replace("DD", "dd").replaceAll("YYYY", "yyyy"))
    .toFormatter(Locale.ENGLISH);
// do the same for output format if needed

我不认为它需要一个复杂的、一步替换所有东西的regex。只需多次调用replace方法就可以做到这一点(除非您有非常复杂的模式,需要对replace进行大量不同和复杂的调用,但仅使用您提供的案例,这就足够了)。

 类似资料:
  • 我在MVC5 asp上使用dd/MMM/YYYY格式的日期时遇到问题。net项目。主要是在Chrome上,因为它似乎只接受yyyy/mm/dd格式的日期。 为了规范跨浏览器的行为,我使用了jQuery datetimepicker组件。 我尝试了很多方法,但Chrome仍然表示日期无效。即使在将输入定义为文本而不是日期之后。 此外,即使我关闭了特定组件的验证(data val=“false”),C

  • 问题内容: 当我在下面的代码下运行时,出现Unparseable错误。如何将dd MMM yyyy格式转换为dd / MM / yyyy格式? 问题答案: 假设您修复了明显的语法错误,则: 您要做的就是为您需要解析的格式创建一个解析器,并为您想要的格式创建一个格式化器:

  • 问题内容: 我想将日期格式从“ MMM dd,yyyy HH:mm:ss a”更改为“ MM.dd”。我有以下代码 但是我在 请帮忙 问题答案: 三种可能的解释: 您的默认语言环境与输入日期不兼容-例如,它不能理解为月份名称 输入字符串有问题,或者 是错误的类型(例如而不是,或完全是其他类型),或者未声明。 您应该在问题中包括异常的详细信息以弄清是什么,但这是一个工作示例,基本上使用您自己的代码,

  • 我得到的日期是“2010年1月19日星期二18:25:08 0000”。我必须将上述日期转换为mm dd yyyy-HH:mm:ss或mm dd yyyy-HH:mm:ss格式。 我试过了,同样创建了一个Plunker作为参考。下面是相同的链接 日期格式正确,但时间格式不正确。 https://embed.plnkr.co/2YouE4gQLAuPCOOnvAJF/

  • 问题内容: 可能重复: 扩展JavaScript的Date.parse以允许DD /MM/YYYY(非美国格式的日期)吗?将dd-mm-yyyy字符串转换为日期 在文本框中输入日期,例如: 05/09/1985,我想将其转换为1985年9月5日(dd-MMM-yyyy)格式。我将如何实现?请注意,源格式可以是或或格式。 代码段: 此代码返回 1985年 5月9 日, 但我希望 1985年9月5日

  • 在一个数据集中,我有一些日期时间,格式为EEE MMM dd hh:mm:ss zzz yyyyy,比如“mon 5月18日20:25:32 GMT+02:00202”。我如何在Python中以ISO格式和机器本地时间转换这个字符串?