我有一个方法来格式化我的特定数据字符串。
public static String dateFormatter(String dateToFormat){
SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd", Locale.UK);
// All the fields in dateFormatter must be in dateParser
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy, MMM d, EEE", Locale.UK);
Date date = new Date();
try {
date = dateParser.parse(dateToFormat);
} catch (ParseException e) {
e.printStackTrace();
}
assert date != null;
return dateFormatter.format(date);
}问题是字符串日期解析为dateToFormat,可以采用以下日期格式模式
我希望为dateParser分配一个if语句,而不是每次返回代码,以便dateParser根据解析的日期使用特定的格式。
SimpleDateFormat dateParser;
if ("yyyy-MM-dd"){
dateParser = new SimpleDateFormat("yyyy-MM-dd", Locale.UK);
}else if ("yyyy-MM-dd HH:mm") {
dateParser = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.UK);
}else if ("yyyy-MM-dd HH:mm:ss") {
dateParser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.UK);
}其中,“yyyy”和“yyyy:mm”是解析的字符串dateToFormat的格式模式。
发布于 2021-03-05 15:22:35
为yyyy dd,yyyy:mm,yyyy:mm:ss分别创建3种不同的格式化程序formatter1,formatter2,formatter3
private String dateFormatter(String dateToFormat) {
Date date = null;
SimpleDateFormat formatter1=new SimpleDateFormat("yyyy-MM-dd", Locale.UK);
SimpleDateFormat formatter2=new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.UK);
SimpleDateFormat formatter3=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.UK);
try {
try {
date = formatter1.parse(dateToFormat);
} catch (
Exception exp) {
try {
date = formatter2.parse(dateToFormat);
} catch (Exception exp2) {
try {
date = formatter3.parse(dateToFormat);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy, MMM d, EEE", Locale.UK);
return dateFormatter.format(date);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}发布于 2021-03-05 19:47:20
java.time和格式模式的可选部分
考虑使用java.time,现代java.time和time,用于您的日期工作。下面的方法执行此操作。由于在java.time中没有理由为每个调用重新创建格式化程序,所以我将它们放置在方法之外。
private static final DateTimeFormatter inputParser
= DateTimeFormatter.ofPattern("uuuu-MM-dd[ HH:mm[:ss]]");
private static final DateTimeFormatter outputFormatter
= DateTimeFormatter.ofPattern("uuuu, MMM d, EEE", Locale.UK);
public static String dateFormatter(String dateToFormat){
LocalDate date = LocalDate.parse(dateToFormat, inputParser);
return date.format(outputFormatter);
}试试看:
System.out.println("2021-03-02 -> " + dateFormatter("2021-03-02"));
System.out.println("2021-03-02 20:16 -> " + dateFormatter("2021-03-02 20:16"));
System.out.println("2021-03-02 20:16:28 -> " + dateFormatter("2021-03-02 20:16:28"));产出如下:
2021-03-02 -> 2021,Mar 2,Tue 2021-03-02 20:16 -> 2021,Mar 2,Tue 2021-03-02 20:16:28 -> 2021,Tue 2021,Tue
输入解析器格式模式字符串中的方括号表示可选部分。所以一天中的时间是允许的或不允许的。如果它在那里,那么秒就会被允许出现或缺席。
这就是说,您不应该将您的日期和时间作为字符串处理在您的应用程序中。处理LocalDate,或者如果您可能需要一天中的时间,例如ZonedDateTime。当您得到字符串输入时,首先解析它。并且只有在必须给出字符串输出时才将格式格式化为字符串。
用if语句
你能找到我可以使用SimpleDateFormat的方法吗?
我不想那样做。SimpleDateFormat类是类中臭名昭著的麻烦制造者,幸运的是它早已过时。
我有一种只能使用if语句的方法,这样我就不用使用太多的SimpleDateFormats了
它不会减少格式化程序,但您可以使用if语句。只要按字符串的长度来选择;
public static String dateFormatter(String dateToFormat){
LocalDate date;
if (dateToFormat.length() == 10) { // uuuu-MM-dd
date = LocalDate.parse(dateToFormat, dateParser);
} else if (dateToFormat.length() == 16) { // uuuu-MM-dd HH:mm
date = LocalDate.parse(dateToFormat, dateTimeNoSecsParser);
} else if (dateToFormat.length() == 19) { // uuuu-MM-dd HH:mm:ss
date = LocalDate.parse(dateToFormat, dateTimeWithSecsParser);
} else {
throw new IllegalArgumentException("Unsupported length " + dateToFormat.length());
}
return date.format(outputFormatter);
}现在我们需要声明四个格式化程序,三个用于解析,一个用于格式化。我要把构建解析器留给你自己。
我想,同样的if-否则结构也适用于SimpleDateFormat。您甚至可以从输入字符串的长度中选择格式模式字符串,并且在方法的每个调用中只构造一个SimpleDateFormat实例。重复一遍:我自己不会使用SimpleDateformat。
问: java.time不需要Android级别26吗?
调用需要API级别26 (当前最小值为16):java.time.format.DateTimeFormatter#ofPattern
编辑:与您从这条错误信息中可能想到的相反,java.time在较旧的和较新的安卓设备上都能很好地工作。它只需要至少Java 6。
org.threeten.bp导入日期和时间类。链接
java.time的地方。java.time到Java6和7的后端端口(ThreeTen for JSR-310)。https://stackoverflow.com/questions/66494883
复制相似问题