在java的simpledateformat中强制使用4位数年份

时间:2010-06-24 09:13:08

标签: java date formatting

我想使用格式为“yyyymmdd”的simpleDateFormat验证和解析日期 这也允许100624,解析到10年(Julius Ceasar去世后54年)。日期也会像1970年一样,所以我不想和SimpleDateFornat(“yymmdd”)达成和解。

我想知道有没有办法使用SimpleDateFormat强制四位数年份格式?我已经接近做了一个regexp测试,但也许有一种聪明的方法可以使用(Simple)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

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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”代替“MM”,无法解析。)

打印:

Failed to parse 100624
Failed to parse 100624

也许您可以显示 管理解析此代码的代码?

答案 2 :(得分:2)

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

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

当然,月份是MM,而不是mm

答案 3 :(得分:1)

没有简单的方法。如果你说日期可以像1970年一样,主要问题是700624的意思 - 1970年或2070年?您应该实施一些像Joachim建议的截止日期,或者完全移动到4位数。

答案 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