有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java验证日期条目

我想知道是否有办法检查Java日期格式,以确保用户不会输入格式为dd-MM-yyyy的日期,比如56-13-2013。 目前,当我输入一个13个月的日期时,它将结转为一年,然后显示1个月。 例如,2013年16月16日将是2014年4月16日


共 (2) 个答案

  1. # 1 楼答案

    使用^{}验证输入Date{}

    SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
    format.setLenient(false);
    Date date = format.parse(myDateString);
    
  2. # 2 楼答案

    爪哇。时间

    java.util日期时间API及其格式化API SimpleDateFormat已经过时且容易出错。建议完全停止使用它们,并切换到modern Date-Time API*

    此外,下面引用的是来自home page of Joda-Time的通知:

    Note that from Java SE 8 onwards, users are asked to migrate to java.time (JSR-310) - a core part of the JDK which replaces this project.

    使用java.time现代日期时间API的解决方案:

    这可以通过使用适当的ResolverStyle来控制,它提供了三种不同的方法:严格、聪明和宽容。智能选项是默认选项,只要在1-31范围内,它就可以解析月日,只要在1-12范围内,它就可以解析月

    演示:

    import java.time.LocalDate;
    import java.time.format.DateTimeFormatter;
    import java.time.format.DateTimeParseException;
    import java.time.format.ResolverStyle;
    import java.util.Locale;
    
    public class Main {
        public static void main(String[] args) {
            demonstrateResolverStyles("56-13-2013");
            demonstrateResolverStyles("29-02-2013");
            demonstrateResolverStyles("32-02-2013");
            demonstrateResolverStyles("28-13-2013");
        }
    
        static void demonstrateResolverStyles(String input) {
            System.out.println("Input string: " + input);
            try {
                System.out.println("Parsed using ResolverStyle.LENIENT => " + LocalDate.parse(input,
                        DateTimeFormatter.ofPattern("d-M-u", Locale.ENGLISH).withResolverStyle(ResolverStyle.LENIENT)));
            } catch (DateTimeParseException e) {
                System.out.println(e.getMessage());
            }
    
            try {
                // Default is ResolverStyle.SMART
                System.out.println("Parsed using ResolverStyle.SMART => "
                        + LocalDate.parse(input, DateTimeFormatter.ofPattern("d-M-u", Locale.ENGLISH)));
            } catch (DateTimeParseException e) {
                System.out.println(e.getMessage());
            }
    
            try {
                System.out.println("Parsed using ResolverStyle.STRICT => " + LocalDate.parse(input,
                        DateTimeFormatter.ofPattern("d-M-u", Locale.ENGLISH).withResolverStyle(ResolverStyle.STRICT)));
            } catch (DateTimeParseException e) {
                System.out.println(e.getMessage());
            }
            System.out.println();
        }
    }
    

    输出:

    Input string: 56-13-2013
    Parsed using ResolverStyle.LENIENT => 2014-02-25
    Text '56-13-2013' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 13
    Text '56-13-2013' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 13
    
    Input string: 29-02-2013
    Parsed using ResolverStyle.LENIENT => 2013-03-01
    Parsed using ResolverStyle.SMART => 2013-02-28
    Text '29-02-2013' could not be parsed: Invalid date 'February 29' as '2013' is not a leap year
    
    Input string: 32-02-2013
    Parsed using ResolverStyle.LENIENT => 2013-03-04
    Text '32-02-2013' could not be parsed: Invalid value for DayOfMonth (valid values 1 - 28/31): 32
    Text '32-02-2013' could not be parsed: Invalid value for DayOfMonth (valid values 1 - 28/31): 32
    
    Input string: 28-13-2013
    Parsed using ResolverStyle.LENIENT => 2014-01-28
    Text '28-13-2013' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 13
    Text '28-13-2013' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 13
    

    ONLINE DEMO

    Trail: Date Time了解有关现代日期时间API的更多信息


    *无论出于何种原因,如果您必须坚持使用Java 6或Java 7,您可以使用ThreeTen-Backport来支持大部分Java。Java 6&;的时间功能;7.如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请选中Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project