Java 如何格式化接受任何输入格式日期的字符串?

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

如何格式化接受任何输入的字符串

用户可以输入“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:不可解析的日期:“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