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

时间:2017-11-10 14:53:58

标签: java

我如何格式化接受任何输入的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处)”

3 个答案:

答案 0 :(得分:1)

删除date.replace("-", "");并将date.replace("/", "");更改为date = date.replace("/", "-");

答案 1 :(得分:1)

参考:SimpleDateFormat - parse()format()

你需要在这里做3件事。

  1. 了解您收到的字符串格式。
  2. 使用格式化程序解析输入字符串并获取有效的Date对象。
  3. 将其格式化为您期望的内容。
  4.      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)

当涉及到可以是任何格式的字符串的日期转换时,它变得复杂。

我建议你采取以下方法......

  • 使用最新的Java 8 Date Time API格式化日期
  • 使用模式匹配,通过仅接受某些日期格式(例如,不接受2位数年份)来限制日期输入格式
  • 分别处理无效日期(闰年等)和错误格式化日期并采取相应措施

注意:模式匹配可确保您的输入字符串正确放置/,以便我们可以从给定字符串中提取整数(月,日和年)

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