我如何格式化接受任何输入的String?
用户可以输入“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 SimpleDateFormat("MM-dd-yyyy");
try {
_date = df.parse(date);
return _date.toString();
} catch (Exception ex){
ex.printStackTrace();
}
return null;
}
会发生什么:我得到一个解析异常:
“java.text.ParseException:Unparseable date:”11232017“(偏移8处)”
答案 0 :(得分:1)
删除date.replace("-", "");
并将date.replace("/", "");
更改为date = date.replace("/", "-");
。
答案 1 :(得分:1)
参考:SimpleDateFormat - parse()和format()
你需要在这里做3件事。
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;
}
答案 2 :(得分:0)
当涉及到可以是任何格式的字符串的日期转换时,它变得复杂。
我建议你采取以下方法......
注意:模式匹配可确保您的输入字符串正确放置/
,以便我们可以从给定字符串中提取整数(月,日和年)
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