使用带有SimpleDateFormat的GregorianCalendar

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

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

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

不幸的是,教师并不太确定如何使用GregorianCalendar和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;
    }
}

我得到的错误是:

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中的[时间= ?, areFieldsSet =假,areAllFieldsSet =假,宽松= TRUE,区= sun.util.calendar.ZoneInfo [ID = “美洲/温哥华”,偏移量= -28800000,dstSavings = 3600000,useDaylight =真,过渡= 189,lastRule = java.util.SimpleTimeZone中[ID =美国/温哥华,偏移= -28800000,dstSavings = 3600000,useDaylight =真,startYear = 0,STARTMODE = 3,startMonth = 2,朝九特派= 8, startDayOfWeek = 1,开始时间= 7200000,startTimeMode = 0,endMode = 3,endMonth = 10,endday指定= 1,一个endDayOfWeek = 1,结束时间= 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,微差= ?, ZONE_OFFSET = ?, DST_OFFSET =?]

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

想法,建议,我什至关闭?

编辑

原始问题已清理完毕(谢谢assylias!),但我仍然无法正确打印,因为这两个函数未链接,并且需要从人物对象中打印出GregorianCalendar日期值(因为birthdate是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函数链接在一起,而是一起使用它们。 首先,将出生日期转换为GregorianCalendar并将其存储在人物对象中。 然后在打印声明中,只需告诉程序在打印时格式化该日期。 问题解决了。 现在所有的工作都按照规范进行,我觉得这很愚蠢,因为我在DateUtil课程的最后一天左右像鱼一样被鱼甩掉,试图让他们同时工作。

感谢所有帮助让日期顺利进行!


SimpleDateFormat#format方法将Date作为参数。 您可以通过调用其getTime方法从Calendar获取Date

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;

为什么会出现这种并发症

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

正如其名称所示,SimpleDateFormat格式化日期。 不是日历。 因此,如果您想使用SimpleDateFormat格式化GregorianCalendar,则必须先将日历转换为日期:

dateFormat.format(calendar.getTime());

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

最后,为了将字符串转换为日期,您还应该使用(Simple)DateFormat(它的parse()方法),而不是像你在做的那样分割字符串。 这会给你一个Date对象,并且你可以通过实例化它( Calendar.getInstance() )并设置它的时间( calendar.setTime() )从Date创建一个日历。

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

链接地址: http://www.djcxy.com/p/945.html

上一篇: Using GregorianCalendar with SimpleDateFormat

下一篇: Number of days between two dates in Joda