将 GregorianCalendar 与 SimpleDateFormat 一起使用

所以,我一直在这个(应该是)简单的练习上绞尽脑汁,让程序将日期字符串变成一个对象,格式化它,并在完成后再次将其作为字符串返回。GregorianCalendar

这是程序的最后一点,它从文件中接收一堆文本,将其分解为单独的记录,然后将记录分解为单独的数据片段并将其分配给一个人对象。

我已经在多个地方检查了代码,代码完全按照它应该做的事情做,直到我调用format函数,它抛出一个.为对象分配了它应该分配的值(尽管打印它又是一个完全不同的故事,如下所示...),但格式将不接受对象进行格式化。IllegalArgumentExceptionGergorianCalendar

不幸的是,讲师不太确定如何使用和(但分配我们与他们一起工作),并说:“只需谷歌它......”我试过了,我发现的一切都没有帮助。GregorianCalendarSimpleDateFormat

到目前为止,我的代码是:

public class DateUtil {

    public static GregorianCalendar convertFromDMY(String dd_mm_yy) throws ParseException{

        // this actually works, got rid of the original code idea
        String[] splitDate = dd_mm_yy.split("-");
        int days = Integer.parseInt(splitDate[0]);
        int month = Integer.parseInt(splitDate[1]);
        int year = Integer.parseInt(splitDate[2]);

        // Dates are going in right, checked in print statement,
        // but the object is not getting formatted…
        GregorianCalendar dateConverted = new GregorianCalendar(year, month, days);
        format(dateConverted);
        return dateConverted;
    }

    public static String format(GregorianCalendar date){

        SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM-yyyy");
        String dateFormatted = fmt.format(date);
        return dateFormatted;
    }
}

我得到的错误是:

Exception in thread "main" java.lang.IllegalArgumentException: Cannot format given Object >as a Date

    at java.text.DateFormat.format(DateFormat.java:281)
    at java.text.Format.format(Format.java:140)
    at lab2.DateUtil.format(DateUtil.java:26) 
    at lab2.DateUtil.convertFromDMY(DateUtil.java:19)
    at lab2.Lab2.createStudent(Lab2.java:75)
    at lab2.Lab2.main(Lab2.java:34)

还有一件事,我甚至使用正确的吗?当我打印出该对象的值时(应该获取日期,对吧?我得到这个:GregorianCalendar

java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=“America/Vancouver”,offset=-28800000,dstSavings=3600000,useDaylight=true,transitions=189,lastRule=java.util.SimpleTimeZone[id=America/Vancouver,offset=-28800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTimeTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=1985,MONTH=4,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=22,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]

年,月和day_of_month值都是正确的,因为它们是我传入创建它的数字。

想法,建议,我甚至接近吗?

编辑

原始问题已清除(谢谢 assylias!),但我仍然无法正确打印,因为这两个函数没有链接,并且要求从 person 对象中打印出日期值(因为出生日期是一个)。GregorianCalendarGregorianCalendar

更新代码:

public class DateUtil {

    static SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM-yyyy");

    public static GregorianCalendar convertFromDMY(String dd_mm_yy) throws ParseException{

        // this actually works, got rid of the original code idea
        String[] splitDate = dd_mm_yy.split("-");
        int days = Integer.parseInt(splitDate[0]);
        int month = (Integer.parseInt(splitDate[1]) - 1);
        int year = Integer.parseInt(splitDate[2]);

        // dates go in properly
        GregorianCalendar dateConverted = new GregorianCalendar(year, month, days);
        String finalDate = format(dateConverted);
        return ;
    }

    public static String format(GregorianCalendar date) throws ParseException{

       fmt.setCalendar(date);
        String dateFormatted = fmt.format(date.getTime());
        System.out.println(dateFormatted);
        return dateFormatted;
    }

}

上次编辑

好吧,看来我是个白痴,不需要将两个函数链接在一起,而是将它们串联使用。首先,将出生日期转换为 a 并将其存储在 person 对象中。然后,在 print 语句中,只需告诉程序在打印日期时设置其格式即可。问题已解决。现在,所有工作都按照规格进行,我觉得自己更愚蠢了,因为我在最后一天左右的时间里像鱼一样从水里挥舞着,试图让他们同时工作。DateUtilGregorianCalendarDateUtil

感谢您帮助所有正确进行约会!


答案 1

SimpleDateFormat.format()方法将 a 作为参数。您可以通过调用其方法从 中获取 a:DateDateCalendargetTime()

public static String format(GregorianCalendar calendar) {
    SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM-yyyy");
    fmt.setCalendar(calendar);
    String dateFormatted = fmt.format(calendar.getTime());

    return dateFormatted;
}

另请注意,月份从 0 开始,因此您的意思可能是:

int month = Integer.parseInt(splitDate[1]) - 1;

答案 2

为什么会出现这样的并发症?

public static GregorianCalendar convertFromDMY(String dd_mm_yy) throws ParseException 
{
    SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM-yyyy");
    Date date = fmt.parse(dd_mm_yy);
    GregorianCalendar cal = GregorianCalendar.getInstance();
    cal.setTime(date);
    return cal;
}

推荐