在java的简单日期格式中强制4位数字年份

2022-09-03 15:41:35

我想使用格式为“ymmdd”的简单DateFormat来验证和解析日期,这也允许100624,它被解析为10年(Julius Ceasar去世后54年)。日期也将类似于1970年,所以我不想用SimpleDateFornat(“yymmdd”)来解决。

我想知道有没有办法使用SimpleDateFormat强制使用四位数的年份格式?我即将提前进行正则表达式测试,但也许有一种聪明的方法来使用(简单)DateFormat()?

按照代码的要求,事情变得越来越复杂,我的研究只有一半。使用的格式是 yyyy-MM-dd(它来自一个变量,它有一个错误的 javadoc)。但是,正如yyMMdd下面的答案所示,确实强制使用四年数字。因此,我的问题更改为如何强制“y-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


答案 1

只需使用(注意:大写的M用于表示月份,否则您正在解析分钟!)然后检查年份是否大于某个截止日期(例如,在解析出生日期时,较大的1800是一个安全的赌注,当解析日期大于或等于当前年份时,将日期解析为大于或等于当前年份会很好)。yyyyMMdd


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

也许你可以展示设法解析它的代码