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
withDateTimeFormatter
更为严格,它规定年份必须至少为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);