使用带有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