34

因此,我一直在为这个(应该)简单的练习绞尽脑汁,让程序将日期字符串转换为GregorianCalendar对象,对其进行格式化,并在完成后再次将其作为字符串返回。

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

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

不幸的是,讲师不太确定如何使用GregorianCalendarand SimpleDateFormat(但已分配我们与他们一起工作)并说:“只需谷歌一下……”我试过了,但我发现没有任何帮助。

我到目前为止的代码是:

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;
    }
}

我得到的错误是:

线程“主”java.lang.IllegalArgumentException 中的异常:无法将给定对象格式化为日期

    在 java.text.DateFormat.format(DateFormat.java:281)
    在 java.text.Format.format(Format.java:140)
    在 lab2.DateUtil.format(DateUtil.java:26)
    在 lab2.DateUtil.convertFromDMY(DateUtil.java:19)
    在 lab2.Lab2.createStudent(Lab2.java:75)
    在 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,startTime=7200000,startTimeMode=0,endMode=3,endMonth=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=?]

year、month 和 day_of_month 值都是正确的,因为它们是我在创建它时传递的数字。

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

编辑

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

更新代码:

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;
    }

}

上次编辑

好的,看来我是个白痴,不需要将这两个DateUtil功能链接在一起,而是串联使用它们。首先,将生日转换为 aGregorianCalendar并将其存储在 person 对象中。然后,在打印语句中,只需告诉程序在打印日期时格式化该日期。问题解决了。现在所有的工作都按照规范进行,我觉得自己更愚蠢了,因为我在课堂的最后一天左右像一条出水的鱼一样挥舞着DateUtil,试图让他们同时工作。

感谢大家在正确安排日期方面的帮助!

4

5 回答 5

57

SimpleDateFormat.format()方法以 aDate作为参数。您可以通过调用 a 的方法Date从 a中获取 a :CalendargetTime()

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;
于 2012-05-31T08:33:10.537 回答
5

为什么会有这样的并发症?

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;
}
于 2012-05-31T08:34:18.283 回答
3

A SimpleDateFormat,顾名思义,格式化Dates。不是一个Calendar。因此,如果要GregorianCalendar使用 a格式化 a SimpleDateFormat,则必须先将Calendara转换为Date

dateFormat.format(calendar.getTime());

你看到打印的是toString()日历的表示。它的预期用途是调试。它不打算用于在 GUI 中显示日期。为此,请使用 ( Simple) DateFormat

最后,要将 a 转换String为 a Date,您还应该使用 a ( Simple) DateFormat(它的parse()方法),而不是String像您正在做的那样拆分 a 。这将为您提供一个Date对象,您可以通过实例化它 ( ) 并设置它的时间 ( )Calendar从中创建一个。DateCalendar.getInstance()calendar.setTime()

我的建议是:谷歌搜索不是这里的解决方案。阅读API 文档是您需要做的。

于 2012-05-31T08:38:57.463 回答
2
  1. 你把一个两位数的年份放在那里。第一世纪。而公历始于 16 世纪。我认为您应该在一年中增加2000。

  2. 函数中的月份new GregorianCalendar(year, month, days)是从 0 开始的。从那里的月份减去 1。

  3. 更改第二个函数的主体如下:

        String dateFormatted = null;
        SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM-yyyy");
        try {
            dateFormatted = fmt.format(date);
        }
        catch ( IllegalArgumentException e){
            System.out.println(e.getMessage());
        }
        return dateFormatted;
    

调试后,您会发现根本GregorianCalendar不能作为fmt.format();.

真的,没有人需要GregorianCalendar作为输出,即使你被告知要返回“一个字符串”。

将格式函数的标题更改为

public static String format(final Date date) 

并进行适当的更改。fmt.format()Date很高兴地接受这个对象。

  1. 总是在出现意外异常之后,自己去捕捉它,不要让 Java 机器去做。这样,你就会明白问题所在。
于 2012-05-31T09:21:04.837 回答
2
于 2017-05-13T02:53:56.820 回答