Java日期处理格式不正确
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java日期处理格式不正确相关的知识,希望对你有一定的参考价值。
首先,我是一名学习Java的C#开发人员。我正在转换使用C#编写的程序作为练习,并且在解析从html表单提交的日期时遇到问题。表单以电子邮件形式发送,并且Java程序读取电子邮件并解析正文。我有一个下拉日历,供我偷窥者从中选择日期,但总会有一些混蛋要输入日期并将所有内容弄乱。目前,我正在我的代码中执行此操作:
public void SetDatePlayed(String datePlayed)
this.datePlayed = LocalDate.parse(datePlayed);
datePlayed是传入的字符串,通常格式为yyyy-MM-dd,但当然有人输入3/7而不是使用表单上的日历下拉列表。 this.datePlayed是一个LocalDate。在C#中,我最终得到的日期假定是2020年-没问题。 LocalDate确实希望使用yyyy-MM-dd格式,而我不知道Java的最佳实践是什么。我整个上午一直在搜索它,并且没有遇到任何其他问题。我不在乎是否正在使用LocalDate,但是我确实需要将其作为日期数据类型,以便稍后可以进行日期检查,排序,搜索等。
您需要使用SimpleDateFormat
。
首先,您可以使用正则表达式确定日期的格式,然后执行以下操作:
public void SetDatePlayed(String datePlayed)
final SimpleDateFormat needFormat = new SimpleDateFormat("yyyy-MM-dd");
final SimpleDateFormat currentFormat = new SimpleDateFormat("dd/MM");
LocalDate ld = null;
try
ld = LocalDate.parse(needFormat.format(currentFormat.parse(datePlayed)));
ld = ld.plusYears(LocalDate.now().getYear() - ld.getYear());
catch (ParseException e)
e.printStackTrace();
this.datePlayed = ld;
我看到您问题的两种可能解释。我不确定是哪一个,所以我都会回答。
如何将没有年份的日期字符串(例如
M/d
(3/7
)解析为LocalDate
?
你不知道。根据定义,LocalDate
必须具有年,月和日。如果您只有一个月零一天,那就是MonthDay
:
MonthDay md = MonthDay.parse("3/7", DateTimeFormatter.ofPattern("M/d"));
如果要添加当前年份,可以稍后再做:
LocalDate ld = md.atYear(Year.now(/*optionally insert time zone*/).getValue());
如何处理
yyyy-MM-dd
和M/d
模式?
这里是一种方法:创建一个识别两种模式的DateTimeFormatter
,将字符串解析为TemporalAccessor
,检查TemporalAccessor
是否支持“年份”字段:
TemporalAccessor ta = DateTimeFormatter.ofPattern("[M/d][yyyy-MM-dd]").parse("3/7");
if (ta.isSupported(ChronoField.YEAR_OF_ERA)) // yyyy-MM-dd
LocalDate ld = LocalDate.from(ta);
else if (ta.isSupported(ChronoField.MONTH_OF_YEAR)) // M/d
MonthDay md = MonthDay.from(ta);
else
// user has entered an empty string, handle error...
以上是关于Java日期处理格式不正确的主要内容,如果未能解决你的问题,请参考以下文章