Java 如何格式化接受任何输入格式日期的字符串?
如何格式化接受任何输入的字符串 用户可以输入“11/9/2017”、“11/09/17”或“11/09/2017” 我试图强制输出包含破折号,如“11-10-2017” 我所尝试的:Java 如何格式化接受任何输入格式日期的字符串?,java,Java,如何格式化接受任何输入的字符串 用户可以输入“11/9/2017”、“11/09/17”或“11/09/2017” 我试图强制输出包含破折号,如“11-10-2017” 我所尝试的: public static String dateFormatter(String date){ date.replace("-", ""); date.replace("/", ""); Date _date = null; SimpleDateFormat df = new S
public static String dateFormatter(String date){
date.replace("-", "");
date.replace("/", "");
Date _date = null;
SimpleDateFormat df = new SimpleDateFormat("MM-dd-yyyy");
try {
_date = df.parse(date);
return _date.toString();
} catch (Exception ex){
ex.printStackTrace();
}
return null;
}
发生的情况:我得到一个解析异常:
java.text.ParseException:不可解析的日期:“11232017”(偏移量8处)
删除日期。替换(“-”,“”)代码>和更改日期。替换(“/”,“”)代码>至<代码>日期=日期。替换(“/”,“-”代码>Ref:'s-和
你需要在这里做三件事
当从任何格式的字符串转换为日期时,它会变得复杂 我建议你采取以下方法
- 使用最新的Java8日期时间API格式化日期
- 使用模式匹配,通过仅接受某些日期格式来限制日期输入格式(例如,不接受2位数年份)
- 分别处理无效日期(闰年等)和格式错误的日期,并采取适当的措施
一件事,它应该是
date=date.replace(“-”,”)代码>输入错误?当您使用此日期格式进行解析时,解析器希望解析字符串中包含破折号,您不应该删除它们。您根本无法以任何格式读取它-Android没有人类智能。所以你必须先定义一个受支持的格式列表。@VladMatvienko可以是-我觉得人类心里也有某种受支持的(可以理解的)格式列表;)<代码>所以我必须强制某些输入?
没错。但是为什么不使用日期选择器之类的工具,而不是强制用户输入日期呢?使用DatePicker将消除所有问题。
public static String dateFormatter(String dateString) {
Date _date = null;
SimpleDateFormat inputDateFormat = new SimpleDateFormat("MM/dd/yy");
SimpleDateFormat outputDateFormat = new SimpleDateFormat("MM-dd-yyyy");
try {
_date = inputDateFormat.parse(dateString);
return outputDateFormat.format(_date);
} catch (Exception ex) {
ex.printStackTrace();
}
return _date;
}
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
public class DateFormat {
public static void main(String[] args) {
List<String> dates = Arrays.asList("11/9/2017","11/09/17", "11/09/2017", "02/29/2017");
// accepts 1-9 or 01-09 or 10-12 as month
String month = "([1-9]|0[1-9]|1[0-2])";
// accepts 1-9 or 01-09 or 10-19 or 20-29 or 30-31 as day
String day = "([1-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1])";
// accepts 1900-1999 or 2000-2099 as year
String year = "(19[0-9][0-9]|20[0-9][0-9])";
// switch the regex as you like depending on your input format
// e.g. day + "\\/" + month + "\\/" + year etc.
Pattern pattern = Pattern.compile(month + "\\/" + day + "\\/" + year);
for (String dateValue : dates) {
if (pattern.matcher(dateValue).matches()) {
try {
// pattern matching ensures you don't get StringIndexOutOfBoundsException
// LocalDate.of(year, month, dayOfMonth)
LocalDate date = LocalDate.of(Integer.parseInt(dateValue.substring(dateValue.lastIndexOf('/') + 1)),
Integer.parseInt(dateValue.substring(0, dateValue.indexOf('/'))),
Integer.parseInt(dateValue.substring(dateValue.indexOf('/') + 1, dateValue.lastIndexOf('/'))));
System.out.println(String.format("Correct Format : %-10s ==> %s", dateValue, date.format(DateTimeFormatter.ofPattern("MM-dd-yyyy"))));
// DateTimeException and DateTimeParseException will be covered here for invalid dates
} catch (Exception e) {
System.out.println(String.format("Invalid Date : %s", dateValue));
}
} else {
System.out.println(String.format("Bad Format : %s", dateValue));
}
}
}
}
Correct Format : 11/9/2017 ==> 11-09-2017
Bad Format : 11/09/17
Correct Format : 11/09/2017 ==> 11-09-2017
Invalid Date : 02/29/2017