Java验证日期条目

时间:2013-06-04 15:05:01

标签: java date format error-checking

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

由于

3 个答案:

答案 0 :(得分:4)

使用setLenient验证输入Date String

SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
format.setLenient(false);
Date date = format.parse(myDateString);

答案 1 :(得分:1)

你还没有说过你当前是如何解析这个值的 - 我认为它与SimpleDateFormat有关。只需致电setLenient(false)即可验证输入。

例如:

import java.util.*;
import java.text.*;

public class Test {
    public static void main(String[] args) throws Exception {
        SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
        // Prints a value in 2014
        System.out.println(format.parse("16-16-2013"));
        format.setLenient(false);
        // Throws an exception
        System.out.println(format.parse("16-16-2013"));        
    }
}

如果您正在做大量工作,我还强烈建议您使用Joda Time而不是内置类。

答案 2 :(得分:1)

java.time

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

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

<块引用>

请注意,从 Java SE 8 开始,要求用户迁移到 java.time (JSR-310) - JDK 的核心部分,取代了该项目。

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

这可以通过使用适当的 ResolverStyle 来控制,该 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(); } } 提供了严格、智能和宽松三种不同的方法。 smart选项是默认的,只要是1-31的范围就可以解析月份的日期,只要是1-12的范围就可以解析月份。

演示:

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

输出:

require(tidyverse)
df %>% 
  arrange(patientPersonalNumber, admission.date) %>% 
  group_by(patientPersonalNumber) %>% 
  mutate(re.admin = (lag(discharge.date) + 30) >= admission.date) %>% 
  mutate(re.admin = ifelse(is.na(re.admin), FALSE, re.admin ))



# A tibble: 14 x 4
# Groups:   patientPersonalNumber [10]
   patientPersonalNumber admission.date discharge.date re.admin
   <chr>                 <date>         <date>         <lgl>   
 1 001                   2013-06-23     2013-06-25     FALSE   
 2 002                   2013-06-30     2014-07-03     FALSE   
 3 004                   2013-07-22     2014-08-01     FALSE   
 4 004                   2014-07-12     2014-07-17     TRUE    
 5 005                   2013-06-24     2013-06-30     FALSE   
 6 005                   2013-07-02     2013-07-05     TRUE    
 7 005                   2013-07-09     2013-07-12     TRUE    
 8 005                   2013-09-08     2013-10-12     FALSE   
 9 006                   2013-06-28     2013-06-30     FALSE   
10 007                   2013-06-29     2013-07-02     FALSE   
11 008                   2013-06-23     2013-06-29     FALSE   
12 009                   2013-06-24     2013-06-29     FALSE   
13 010                   2013-06-24     2013-06-27     FALSE   
14 011                   2013-06-24     2013-06-28     FALSE   

ONLINE DEMO

Trail: Date Time 了解有关现代 Date-Time API 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project