使用GregorianCalendar的使用的SimpleDateFormat(Using Greg

2019-06-25 00:25发布

所以我一直在货架我在这个大脑(应该成为)简单的练习,以使程序把日期字符串转换为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日期值(如生日是一个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类,试图让他们在同一时间工作。

感谢您的帮助所有在得到的日期去正确!

Answer 1:

SimpleDateFormat#format方法接受一个Date作为参数。 你可以得到一个DateCalendar通过调用它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;


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


Answer 3:

构造SimpleDateFormat,正如其名称所示,格式的日期。 不是日历。 所以,如果你想使用的SimpleDateFormat格式化的GregorianCalendar,你必须将日历日期第一:

dateFormat.format(calendar.getTime());

而你看到的是印刷日历的的toString()表示。 它的目的是使用调试。 它不打算用于显示GUI的日期。 为此,使用一个(简单)的DateFormat。

最后,从字符串转换为日期,你也应该使用一个(简单)的DateFormat(其parse()方法),而不是分裂String作为你在干什么。 这会给你一个Date对象,你可以通过它instanciating(创建日期日历Calendar.getInstance()并设置其时间( calendar.setTime()

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



Answer 4:

  1. 你是把有两位数字的一年。 公元一世纪。 而公历始于16世纪。 我想,你应该添加到2000年。

  2. 本月功能新的GregorianCalendar(年,月,日)是从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(Date date) 

并做出相应的改变。 fmt.format()将Date对象乐意。

  1. 总是一个意外的异常发生后,自己抓住它,不要让渣机做到这一点。 这样,你就会明白这个问题。


Answer 5:

TL;博士

LocalDate.parse(
    "23-Mar-2017" ,
    DateTimeFormatter.ofPattern( "dd-MMM-uuuu" , Locale.US ) 
)

避免传统的日期时间类

这个问题和其他答案现在已经过时,使用现在遗留麻烦旧日期时间类,由java.time类取代。

使用java.time

你似乎在处理日期仅值。 所以,不要使用日期时类。 而是使用LocalDate 。 该LocalDate类表示没有时间一天和不同时区的日期,唯一的价值。

指定Locale来确定(一)一天的名称翻译的人类语言,一个月的名称,这样,和(b)文化规范决定的缩写,大小写,标点符号,分离器,和这样的问题。

解析字符串。

String input = "23-Mar-2017" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MMM-uuuu" , Locale.US ) ;
LocalDate ld = LocalDate.parse( input , f );

生成的字符串。

String output = ld.format( f );

如果给你的数字,而不是文本的年,月,日,月,使用LocalDate.of

LocalDate ld = LocalDate.of( 2017 , 3 , 23 );  // ( year , month 1-12 , day-of-month )

看到这个代码在现场运行IdeOne.com 。

输入:23-MAR-2017

ld.toString():2017年3月23日

输出:23-MAR-2017


关于java.time

java.time框架是建立在Java 8和更高版本。 这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar ,和SimpleDateFormat

乔达-时间的项目,现在在维护模式 ,建议迁移到java.time类。

要了解更多信息,请参阅甲骨文教程 。 和搜索堆栈溢出了很多例子和解释。 规范是JSR 310 。

使用JDBC驱动程序与兼容JDBC 4.2或更高版本,您可以直接与数据库交换java.time对象。 无需字符串,也不是的java.sql。*类。

从哪里获取java.time类?

  • 的Java SE 8Java SE的9 ,后来
    • 内置。
    • 具有捆绑实现标准Java API的一部分。
    • Java的9增加了一些小的功能和修复。
  • Java SE 6中Java SE 7中
    • 多的java.time功能后移植到Java 6和7在ThreeTen-反向移植
  • Android的
    • 后来版本的java.time类的Android束实现的。
    • 对于早期的Android,在ThreeTenABP项目适应ThreeTen -反向移植 (如上所述)。 请参阅如何使用ThreeTenABP ...

ThreeTen-额外项目与其他类扩展java.time。 该项目是为将来可能增加的java.time试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多 。



文章来源: Using GregorianCalendar with SimpleDateFormat