问题描述
我正在尝试创建一种将Java中的DAY,MONTH,YEAR转换为Date对象的方法
我有
String DAY = "31"
String YEAR = "2012"
String MONTH = "11"
我需要一种可配置的格式作为输出。
String format = "MM/dd/yyy";
我将始终仅将DAY字符串从“ 01”更改为“ 31”
我将始终只将YEAR字符串从“ 1000”更改为“ 9999”
我将始终只将MONTH字符串从“ 01”更改为“ 12”(从不获取Jan,Feb等)
我了解SimpleDateFormat(format)可以在某种程度上发挥作用。
新的SimpleDateFormat(“ MM / dd / yyyy”)会将“ 02/01/2010”解析为2010年2月1日,但
新的SimpleDateFormat(“ mm / dd / yyyy”)会将“ 02/01/2010”解析为2010年1月1日
是否可以在Java中编写一个通用方法,该方法基于可配置的模式将给定的字符串(DAY,MONTH,YEAR)转换为Date对象?可能抛出异常的原因是我提供了DAY,MONTH,YEAR的错误组合(例如DAY =“ 31”,MONTH =“ 02”,YEAR =“ 2010”)
类似的东西:
Date dateParser(String format){
String DAY = "01";
String YEAR = "1922";
String MONTH = "02";
return date;
}
解决方法
基本上有两种方法:
- 将每个字符串解析为一个数字,然后将数字加在一起作为一个日期。
- 将字符串组合成一个字符串,并将其解析为一个日期。
一些中间形式是可以考虑的,但是我建议您采取纯粹的立场,并仅使用其中一种方式。 Arvind Kumar Avinash的答案显示了选项1。我的口味更像是选项2,所以让我演示一下。
我建议您将java.time(现代Java日期和时间API)用于日期工作。
vm.$options.created.forEach(hook => {
hook.call(vm);
});
由于11月(第11个月)只有30天,因此该代码非常明智地引发了异常:
线程“ main”中的异常java.time.format.DateTimeParseException: 无法解析文字“ 2012-11-31”:无效的日期“ NOVEMBER 31”
也就是说,我们有免费的输入验证。对于有效日期,代码将按要求解析日期和格式。
链接
Oracle tutorial: Date Time解释了如何使用java.time。
,我建议您从过时且容易出错的java.util
日期时间API和SimpleDateFormat
切换到modern java.time
日期时间API和相应的格式化API (软件包java.time.format
)。从 Trail: Date Time 了解有关现代日期时间API的更多信息。
请注意,mm
用于minute
;不适用于month
。对于month
,请使用MM
。检查this了解更多信息。
使用现代的日期时间API:
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
// Test
System.out.println(getLocalDate("2010","02","28"));
System.out.println(getLocalDate("2010","31"));
}
static LocalDate getLocalDate(String year,String month,String dayOfMonth) {
return LocalDate.of(Integer.parseInt(year),Integer.parseInt(month),Integer.parseInt(dayOfMonth));
}
}
输出:
2010-02-28
Exception in thread "main" java.time.DateTimeException: Invalid date 'FEBRUARY 31'
at java.base/java.time.LocalDate.create(LocalDate.java:459)
at java.base/java.time.LocalDate.of(LocalDate.java:271)
at Main.getLocalDate(Main.java:11)
at Main.main(Main.java:7)
请注意,日期时间对象应该存储有关日期,时间,时区等的信息,但不存储格式信息。当您打印日期时间类型的对象时,该对象应打印其toString
方法返回的内容。如果您需要以其他格式打印日期时间,则需要一个格式设置类(例如DateTimeFormatter
),该类可以按您想要的模式返回字符串,例如
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
// Test
System.out.println(getFormattedLocalDate("2010/02/28","yyyy/MM/dd","EEEE dd MMMM yyyy"));
System.out.println(getFormattedLocalDate("28/02/2010","dd/MM/yyyy","yyyy MMM EEE dd"));
}
static String getFormattedLocalDate(String date,String inputPattern,String outputPattern) {
return LocalDate.parse(date,DateTimeFormatter.ofPattern(inputPattern))
.format(DateTimeFormatter.ofPattern(outputPattern));
}
}
输出:
Sunday 28 February 2010
2010 Feb Sun 28