java中如何将模式dd MMM yy的字符串日期值转换为模式dd/MM/yyy的日期对象

java中如何将模式dd MMM yy的字符串日期值转换为模式dd/MM/yyy的日期对象,java,spring,date,Java,Spring,Date,我有 我想把它转换成 String dateAsString = "15-May-84"; 初试 Date date = 15/05/1984; 第二次尝试 new SimpleDateFormat("dd/MM/yyyy").format(new Date(dateAsString )), "dd/MM/yyyy") 我用SimpleDateFormat和LocalDate尝试了很多方法,但它总是返回0084年5月15日 这里有人能帮忙吗你可以使用SimpleDateFormat#par

我有

我想把它转换成

String dateAsString = "15-May-84";
初试

Date date = 15/05/1984;
第二次尝试

new SimpleDateFormat("dd/MM/yyyy").format(new Date(dateAsString )), "dd/MM/yyyy")
我用
SimpleDateFormat
LocalDate
尝试了很多方法,但它总是返回0084年5月15日


这里有人能帮忙吗

你可以使用
SimpleDateFormat#parse

LocalDate.parse(dateAsString , DateTimeFormatter.ofPattern("dd/MM/uuuu")));

首先,用两位数字作为字符串是不好的,为什么

解释 要解析日期,很容易,您可以使用:

Date date = new SimpleDateFormat("dd/MM/yyyy").parse("26/06/2020");
但是 这将返回
2084-05-15
,我想您并不是在看这个,而是在看
1984-05-15

快速修复 因此,要解决这个问题,可以使用
minusYears(100)

但是 这对其他年份来说可能是个问题,比如20年5月15日
1920-05-15

因此,我不建议你在一年中使用两位数作为一个数字 绳子

除非 除非您再次确认您的日期介于
1900
1999
之间,或者介于
2000
2999
之间。在这种情况下,您可以创建一个(安全的)自定义解析器


重要的
不要使用传统的日期库,而只使用现代的
java.time
API

您可以使用下面的代码处理不同的日期格式

LocalDate ld = LocalDate.parse("15-May-84", formatter).minusYears(100);
java.time 我向您展示了使用
LocalDate
DateTimeFormatter
beacasejava.time的现代方式,现代java日期和时间API非常适合使用。类
Date
SimpleDateFormat
不仅设计糟糕,而且早已过时,因此我不建议尝试这些

我假设你想要一个今天或过去的日期,而不是未来或不到100年前的日期

    String dateAsString = "15-May-84";
    SimpleDateFormat format = new SimpleDateFormat("dd-MMMM-yy");
    SimpleDateFormat newFormat = new SimpleDateFormat("dd/MM/yyyy");
    Date date = format.parse(dateAsString);
    String newDateString = newFormat.format(date);
    System.out.println(newDateString);
输出:

1984-05-15

如果您想要不同的基准年,只需提供不同的基准年即可。如果可以的话,做一个更严格的范围检查,这样你就可以非常确定你得到了一个正确的日期,接近有效范围的结束日期。例如,如果解析年龄在18到80岁之间的活人的出生日期,请将其设置为您的限制

你的代码出了什么问题?
  • 使用格式化程序解析字符串时,需要提供一个格式模式字符串,该字符串指定要解析的格式,而不是所需的结果格式。使用连字符分析字符串时,格式模式字符串中需要连字符,而不是斜杠。顺便说一句,您不能使用所需格式的
    LocalDate
    Date
    LocalDate
    Date
    都没有格式。只能在
    字符串中使用格式
  • yyyy
    SimpleDateFormat
    一起使用指定日期字符串包含一个完整的年份,因此84年被视为1936年前的84 CE年
    uuuu
    with
    DateTimeFormatter
    更为严格,它规定年份必须至少为4位数,因此根本无法解析
    84
  • 链接
    解释如何使用java.time.

    你能告诉我们你试过什么吗?试过以下代码:LocalDate.parse(“84年5月15日”,DateTimeFormatter.of模式(“dd/MM/uuuu”))和new-SimpleDateFormat(“dd/MM/yyyyy”)。格式(84年5月15日),dd/MM/yyyyy)编辑你的问题,并简而言之,使用一个LocalDate类和两个DateFormatter实例来解析旧日期并格式化新日期。此外,这是一个非常容易搜集的问题,可能有很多答案。下次,请加大搜索力度。我建议您不要使用
    SimpleDateFormat
    Date
    。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌
    LocalDate
    DateTimeFormatter
    是要使用的类。这并不能回答问题。它甚至不使用
    dateAsString
    值。与其使用minusYears,不如使用minusYears构建一个带有显式基准年的日期格式化程序。
        String dateAsString = "15-May-84";
        SimpleDateFormat format = new SimpleDateFormat("dd-MMMM-yy");
        SimpleDateFormat newFormat = new SimpleDateFormat("dd/MM/yyyy");
        Date date = format.parse(dateAsString);
        String newDateString = newFormat.format(date);
        System.out.println(newDateString);
    
        LocalDate today = LocalDate.now(ZoneId.of("Asia/Kolkata"));
        int thisYear = today.getYear();
    
        String dateAsString = "15-May-84";
    
        DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder()
                .appendPattern("d-MMM-")
                .appendValueReduced(ChronoField.YEAR_OF_ERA, 2, 2, thisYear - 99)
                .toFormatter(Locale.ENGLISH);
        LocalDate date = LocalDate.parse(dateAsString, dateFormatter);
        if (date.isAfter(today)) {
            // Go 100 years back
            dateFormatter = new DateTimeFormatterBuilder()
                    .appendPattern("d-MMM-")
                    .appendValueReduced(ChronoField.YEAR_OF_ERA, 2, 2, thisYear - 100)
                    .toFormatter(Locale.ENGLISH);
            date = LocalDate.parse(dateAsString, dateFormatter);
        }
    
        System.out.println(date);