如何格式化GregorianCalendar

时间:2017-05-12 20:05:39

标签: java date format date-formatting gregorian-calendar

我有一个GregorianCalendar个对象。如何获取格式化字符串?

System.out.print("End of rental: " + endDate);生成以下非常长的日历。如何将其格式化为dd / mm / yyyy?

End of rental: java.util.GregorianCalendar[time=1495050625200,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/London",offset=0,dstSavings=3600000,useDaylight=true,transitions=242,lastRule=java.util.SimpleTimeZone[id=Europe/London,offset=0,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2017,MONTH=4,WEEK_OF_YEAR=20,WEEK_OF_MONTH=3,DAY_OF_MONTH=17,DAY_OF_YEAR=137,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=8,HOUR_OF_DAY=20,MINUTE=50,SECOND=25,MILLISECOND=200,ZONE_OFFSET=0,DST_OFFSET=3600000]

2 个答案:

答案 0 :(得分:2)

TL;博士

endDate.toZonedDateTime()
       .format( DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) )
  

23/01/2017

详细

从麻烦的遗留类GregorianCalendar转换为现代java.time类ZonedDateTime。致电toString以生成标准ISO 8601格式的文字。

endDate.toZonedDateTime().toString()

得到这样的东西:

  

2017-01-23T12:34:56.789-07:00 [美国/洛杉矶]

仅限日期,请使用DateTimeFormatterSpecify您的自定义格式设置模式。

endDate.toZonedDateTime()
       .format( DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) )
  

23/01/2017

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:2)

强烈建议使用

@Basil Bourque的答案。我想补充一下Java 6和7的答案(因此,如果您使用的是Java 8或更高版本,请忽略。)另外,如果可以完全避免使用Calendar类,那最好,您应该使用其他答案。在下文中,我假设您无法避免从某些无法更改或不想立即更改的旧版API获取Calendar对象。

java.time和ThreeTen Backport

我以一个重复的问题为例,该问题是如何将Calendar对象转换为如下所示的日期格式(底部的链接)。所需的格式为

7/23/2019 11:02:11 AM

我们可以通过以下方式获得。首先,我们实例化一个格式化程序:

private static final DateTimeFormatter formatter
        = DateTimeFormatter.ofPattern("M/d/u h:mm:ss a", Locale.ENGLISH);

然后我们像这样使用它

    Calendar cal = getCalendarFromLegacyApi();

    ZonedDateTime zdt = DateTimeUtils.toZonedDateTime(cal);
    String howItShouldLook = zdt.format(formatter);
    System.out.println(howItShouldLook);

在此示例中的输出是所需的:

  

2019/7/23上午11:02:11

问题:我可以在Java 7上使用java.time吗?

是的,java.time在Java 7上运行良好。它至少需要 Java 6

  • 在Java 8和更高版本以及更新的Android设备(API级别26以上)中,内置了现代API。
  • 在Java 6和7中,获得了ThreeTen反向端口,这是现代类的反向端口(JSR 310的ThreeTen;请参见底部的链接)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保您使用子包从org.threeten.bp导入日期和时间类。

链接