Java 如何格式化GregorianCalendar
我有一个目标。如何获取格式化字符串 行Java 如何格式化GregorianCalendar,java,date,format,date-formatting,gregorian-calendar,Java,Date,Format,Date Formatting,Gregorian Calendar,我有一个目标。如何获取格式化字符串 行System.out.print(“租赁结束:+endDate”)生成以下非常长的日历。如何将其格式设置为dd/mm/yyyy 租赁结束:java.util.GregorianCalendar[time=14950562200,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id=“Europe/London”,offset=0,dstSa
System.out.print(“租赁结束:+endDate”)代码>生成以下非常长的日历。如何将其格式设置为dd/mm/yyyy
租赁结束:java.util.GregorianCalendar[time=14950562200,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,dstSaves=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=1,startDayOfWeek=1,startDayOfWeek=1,startDayOfWeek=3600000,startTimeMode=2,endMode=2,endMonth=9,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],周的第一天=2,周的第一天=4,纪元=1,年=2017,月=4,年的周=20,月的周=3,月的日=17,年的日=137,周的日=4,月的周的日=3,上午下午=1,小时=8,日的小时=20,分钟=50,秒=25,毫秒=200,分区偏移=0,DST偏移=3600000]
tl;dr
2017年1月23日
细节
从麻烦的遗留类gregoriacalendar
转换为现代java.time类.Call,以标准格式生成文本
得到这样的结果:
2017-01-23T12:34:56.789-07:00[美国/洛杉矶]
对于您的日期,请使用自定义格式模式
endDate.toZonedDateTime()
.format( DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) )
2017年1月23日
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,&
该项目现已启动,建议迁移到类
要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为
从哪里获得java.time类
- ,及以后
- 内置的
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 该项目专门为Android采用了ThreeTen Backport(如上所述)
- 看
该项目使用其他类扩展了java.time。该项目是将来可能添加到java.time的一个试验场。您可以在这里找到一些有用的类,如、、。@Basil Bourque的答案是极力推荐的。我只想用java 6和7的答案来补充它(因此,如果您使用的是Java 8或更高版本,请忽略)。此外,如果您可以完全避免使用Calendar
类,这是最好的,您应该使用另一个答案。在下文中,我假设您无法避免从某些旧API获得一个Calendar
对象,您现在无法更改或不想更改该对象
java.time和三百一十个后端口
我举了一个重复问题的例子,如何将日历对象转换为如下所示的日期格式(底部的链接)
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
问题:我可以在Java7上使用java.time吗?
是的,java.time在Java7中运行得很好。它至少需要Java6
- 在Java8和更高版本以及更新的Android设备上(API级别26),现代API是内置的
- 在Java6和Java7中,获取三个后端口,即现代类的后端口(三个十用于JSR310;参见底部的链接)
- 在(较旧的)Android上,使用Android版的ThreeTen Backport。它被称为ThreeTenABP。并确保您使用子包从
org.ThreeTen.bp
导入日期和时间类
链接
- 解释如何使用java.time
- ,其中首先描述了
java.time
- ,java.time的后端口
到Java6和Java7(JSR-310为三十)
你应该检查
java.util.GregorianCalendar
的文档,这个网站上必须有50个Q/A的日期格式。但是,例如,检查一下。@KevinO实际上,我找了一个重复的问题,但找不到一个专门询问如何格式化GregorianCalendar
。所以我写了一个答案。如果你能找到一个重复的问题cate,请将此问题标记为重复问题,我将投票与您一起结束。可能重复的@Matthias不是重复问题。该问题主要是关于将字符串解析为GregorianCalendar
对象,而此问题以手中的GregorianCalendar
对象开始。引用:“将日期字符串转换为GregorianCalendar对象”、“从文件中提取文本并将其分解”、“convertFromDMY”亲爱的Down投票者:请在投票时留下批评意见。嘿,我一直在玩java.time
很久了,还没有发现这种转换,介于GregoriaCalendar
和ZoneDateTime
之间。这是一件很自然的好事,因为这些类在预期用途上很匹配。相反的转换是sion作为GregorianCalendar.from(ZoneDateTime)存在
。感谢这个消息,不管它是旧消息。@OleV.V.是的,这种转换途径并不明显,因为这些方法只存在于具体的GregorianCalendar
类中,而不存在于常用的Calendar
抽象类中。如果手头有Calendar
对象,则必须使用instanceOf进行测试
要验证它实际上是一个gregoriacalendar
,请强制转换它,然后调用转换方法。
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);