当前位置: 首页 > 面试题库 >

将GregorianCalendar与SimpleDateFormat一起使用

陈寒
2023-03-14
问题内容

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

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

我已经在多个位置检查了该代码,并且该代码完全执行了应该执行的操作,直到调用了format函数(该函数抛出)为止IllegalArgumentException。为GergorianCalendar对象分配了应该分配的值(尽管再次打印,如下所示),但是格式不会接受该对象进行格式化。

不幸的是,讲师不太确定如何使用GregorianCalendarand
SimpleDateFormat(但还是指派我们与他们合作),并说:“只是Google……”,我尝试了一下,但发现没有任何帮助。

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

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功能链接在一起,而是串联使用它们。首先,将出生日期转换为a
GregorianCalendar并将其存储在person对象中。然后,在print语句中,只需简单地告诉程序在打印时格式化该日期即可。问题解决了。现在所有的作品都按照规范工作,我感到非常愚蠢,因为在DateUtil上课的最后一天左右,我像鱼一样从水里飞起来,试图让它们同时工作。

感谢您对日期正确输入的所有帮助!


问题答案:

SimpleDateFormat.format()方法采用a Date作为参数。您可以通过调用其方法Date从a
获取:Calendar``getTime()

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;


 类似资料:
  • 问题内容: 我想在目录中获取具有特定扩展名的文件列表。在中,我看到了可以做到这一点的方法。 由于我需要特定的扩展名,因此我创建了一个。但是,当我与此一起使用时,出现编译错误。我以为自以来,我应该能够做到这一点。代码如下: 最后一行显示编译错误: 类型的方法不适用于类型的参数 我正在尝试使用,不是。为何编译器无法识别这一点? 如果我编写自己的扩展筛选器,则此方法有效。我宁愿使用而不愿自己写。我究竟做

  • 问题内容: 我正在尝试在我的watchKit应用中使用firebase数据库。我已经在我的iPhone应用程序上开发了此功能,但是发现在我的Watch应用程序上很难做到这一点。当我尝试将firebase导入watch应用程序的VC类中时,它正在创建error 。 可以在Watch app中使用Firebase吗? 问题答案: 可悲的是,没有支持,并由于这样的事实,有没有支持在这些版本中,并高度依赖

  • 问题内容: 当请求来自Ajax.ActionLink(使用Http方法发布)时,是否可以在控制器操作上使用ValidateAntiForgeryToken属性。替代方法似乎是手动滚动JQuery Ajax请求,但我很好奇MVC Ajax框架中是否有办法。 问题答案: 我还没看过。您必须将令牌放入POST中记录的数据中。每次都使用相同的防伪令牌ID(或名称,我不记得了),但是您必须非常小心,并确保您

  • 问题内容: 最近,我开始与路由器一起使用来构建应用程序。 我通常将use 用于依赖项和代码管理。但是,当我尝试包含包含语法的文件时会出现问题。 这就是我目前所拥有的: 如何将IndexComponent放在其自己的文件中并在此文件中调用它?我尝试了通常的方法(与骨干和反应相同),但是由于语法错误。 问题答案: 所以我自己弄清楚了。 我从此仓库获得了必要的文件和说明:jsx- requirejs-p

  • 所以我一定是错过了什么,我希望执行一个语句块,如果可选的存在,否则抛出异常。 如果不是null,则打印hellow world。如果是,则抛出运行时异常。

  • 我刚开始使用iText,我不知道XMLWorkerHelper类是如何工作的。我正在尝试创建一个方法,该方法接受包含html文档的字符串,将html转换为pdf文档,并将pdf作为字节数组返回。如果有人能指出下面代码中的错误,我将不胜感激。 我使用的代码如上所述。html代码位于变量articleString中。重要的部分是介于这两个系统之间。出来println语句。这是web应用程序和系统的一部