2010-06-24 93 views
12

我想验证并使用格式为“yyyymmdd”的simpleDateFormat解析日期。 这也允许解析为10年(在Julius Ceasar死后54年)的100624。日期也会像1970年一样,所以我不想与SimpleDateFornat(“yymmdd”)解决。在java的simpledateformat中强制使用4位数字

我想知道有没有办法强制使用SimpleDateFormat四位数年份格式?我接近做一个正则表达式测试,但也许有一个聪明的方法来使用(简单)DateFormat()?

根据要求的代码,事情变得越来越复杂,我的研究是一半。使用的格式是yyyy-MM-dd(它来自一个变量,它有一个错误的javadoc)。然而,正如下面的答案中所表明的,yyyyMMdd确实需要四年的数字。所以我的问题改为如何强制“yyyy-MM-dd”格式的四位数年份。为什么“yyyyMMdd”表现不同?

public void testMaturity() { 
    try { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
     sdf.setLenient(false); 
     System.out.println(" " + sdf.format(sdf.parse("40-12-14"))); 
     SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMdd"); 
     sdf.setLenient(false); 
     System.out.println(" " + sdf2.format(sdf2.parse("401214"))); 
     fail(); 
    } catch (ParseException pe) { 
     assertTrue(true); 
    } 

它打印0040-12-14

+0

如果日期需要YYYYMMDD那么10年将是0010。我没有看到任何问题,你不要让他们在第一天(01)或第一个月输入1,那么为什么允许它多年。 – Goibniu 2010-06-24 09:15:28

回答

3

只需使用yyyyMMdd(注:M!用来表示一个月大写,否则you're parsing minutes),然后检查是否今年是更大一些的截止日期(例如,在解析出生日期时,如果解析日期大于或等于当前年份,则更大的1800是安全的。

2

嗯。我怀疑你应该使用,而不是“MM”,“MM”下手......而是“100624”当我尝试它不反正解析 - 即使是在宽松模式:

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

public class Test 
{ 
    public static void main(String[] args) throws Exception 
    { 
     SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); 
     format.setLenient(true); 
     tryParse(format, "100624"); 
     format.setLenient(false); 
     tryParse(format, "100624"); 
    } 

    static void tryParse(DateFormat format, String text) 
    { 
     try 
     { 
      Date date = format.parse(text); 
      System.out.println("Parsed " + text + " to " + date); 
     } 
     catch (ParseException pe) 
     { 
      System.out.println("Failed to parse " + text); 
     } 
    } 
} 

(甚至使用而不是“MM”,“毫米”,它仍然无法解析)

打印:

Failed to parse 100624 
Failed to parse 100624 

也许你可以显示代码管理解析这个?

+0

谢谢!我添加了一些代码进行测试,发现formatString不像预期的那样,并且yyyyMMdd确实强制要求4位数的年份。仍然典型的yyyy-MM-dd行为不同。 – 2010-06-24 09:46:21

2

尝试在SimpleDateFormat对象上调用setLenient(false);对象 - 这将使它使用更严格的解析规则(否则,如果输入字符串与格式不完全匹配,它会尝试“智能”)。例如:

DateFormat df = new SimpleDateFormat("yyyyMMdd"); 
df.setLenient(false); 

而且ofcourse,月是MM,不mm

1

有没有简单的方法。如果你说日期可能像1970年,那么主要问题将是700624意味着什么 - 1970年或2070年?您应该实施一些像Joachim建议的截止日期,或者完全移至4位数年份。

1

好吧,它挺直挺挺。按照这些简单的步骤:

第1步:

try { 
    String dates = "40-12-14"; 
    String patterns = "yy-MM-dd"; 
    SimpleDateFormat format3 = new SimpleDateFormat(patterns);`` 
    java.util.Date dates1 = format3.parse(dates); 

    SimpleDateFormat sdfDates = new SimpleDateFormat("dd/MM/yyyy"); 

    String strDate1 = sdfDate.format(dates1); 
    System.out.println("Date1: " + strDate1); 

} 
catch(ParseException e){ 
    e.printStackTrace(); 
} 

这将输出:

Date1: 14/12/1940