java中GregorianCalendar类与Calendar类的关系与区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中GregorianCalendar类与Calendar类的关系与区别?相关的知识,希望对你有一定的参考价值。
问题如题。
类 Calendarjava.lang.Object
java.util.Calendar
所有已实现的接口:
Serializable, Cloneable, Comparable<Calendar>
直接已知子类:
GregorianCalendar
--------------------------------------------------------------------------------
public abstract class Calendarextends Objectimplements Serializable, Cloneable, Comparable<Calendar>Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
该类还为实现包范围外的具体日历系统提供了其他字段和方法。这些字段和方法被定义为 protected。
与其他语言环境敏感类一样,Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。Calendar 的 getInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化:
Calendar rightNow = Calendar.getInstance();
Calendar 对象能够生成为特定语言和日历风格实现日期-时间格式化所需的所有日历字段值,例如,日语-格里高里历,日语-传统日历。Calendar 定义了某些日历字段返回值的范围,以及这些值的含义。例如,对于所有日历,日历系统第一个月的值是 MONTH == JANUARY。其他值是由具体子类(例如 ERA)定义的。有关此内容的细节,请参阅每个字段的文档和子类文档。
我建议你下个jdk的帮助文档哦。这样的问题你以后要学着去查帮助文档解决。 参考技术A Calendar是父类
GregorianCalendar是子类
一般使用的时候可以使用
Calendar c=new GregorianCalendar();//直接创建
Calendar c=Calendar.getInstance();//工厂方法 参考技术B GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。
GregorianCalendar 是一种混合日历,在单一间断性的支持下同时支持儒略历和格里高利历系统,在默认情况下,它对应格里高利日历创立时的格里高利历日期(某些国家/地区是在 1582 年 10 月 15 日创立,在其他国家/地区要晚一些)。可由调用者通过调用 setGregorianChange() 来更改起始日期。
如何格式化 GregorianCalendar
【中文标题】如何格式化 GregorianCalendar【英文标题】:How can I format a GregorianCalendar 【发布时间】:2017-10-12 05:49:56 【问题描述】:我有一个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]
【问题讨论】:
你应该查看java.util.GregorianCalendar
的文档
本站必须有 50 个关于日期格式的 Q/A。但是例如检查DateFormat
。
@KevinO 实际上,我寻找了一个重复的问题,但找不到一个专门询问如何格式化GregorianCalendar
的问题。所以我写了一个答案。如果您能找到重复的问题,请将此问题标记为重复,我将与您一起投票结束。
Using GregorianCalendar with SimpleDateFormat的可能重复
@Matthias That Question 不是重复的。该问题主要是关于将字符串解析为GregorianCalendar
对象,而此问题以GregorianCalendar
对象开头。引用:“将日期字符串转换为 GregorianCalendar 对象”,“从文件中获取一小段文本,将其分解”,“convertFromDMY
”。
【参考方案1】:
强烈推荐@Basil Bourque 的回答。我只想用 Java 6 和 7 的答案来补充它(所以如果您使用的是 Java 8 或更高版本,请忽略)。此外,如果您可以完全避免 Calendar
类,这是最好的,您应该使用其他答案。在下文中,我假设您无法避免从某些遗留 API 获取 Calendar
对象,而您现在无法更改或不想更改。
java.time 和 ThreeTen 反向移植
我的示例来自一个重复的问题,如何将日历对象转换为如下所示的日期格式(链接在底部)。所需的格式为
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 Backport,这是现代类的后向端口(JSR 310 的 ThreeTen;请参阅底部的链接)。 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从org.threeten.bp
导入日期和时间类以及子包。
链接
Oracle tutorial: Date Time 解释如何使用 java.time。 Java Specification Request (JSR) 310,其中首次描述了java.time
。
ThreeTen Backport project,java.time
的向后移植到 Java 6 和 7(JSR-310 的 ThreeTen)。
ThreeTen Backport API documentation (Javadoc)
ThreeTenABP,Android 版 ThreeTen Backport
Question: How to use ThreeTenABP in Android Project,解释得很透彻。
重复的问题How to convert a Calendar object to date format that looks like this 是提供此答案的机会。
【讨论】:
【参考方案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[美国/洛杉矶]
仅用于您的约会,请使用DateTimeFormatter
。 Specify您的自定义格式模式。
endDate.toZonedDateTime()
.format( DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) )
23/01/2017
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date
、Calendar
和 SimpleDateFormat
。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?
Java SE 8、Java SE 9 及更高版本 内置。 标准 Java API 的一部分,带有捆绑实现。 Java 9 添加了一些小功能和修复。 Java SE 6 和 Java SE 7 大部分 java.time 功能都在ThreeTen-Backport 中向后移植到 Java 6 和 7。 Android ThreeTenABP 项目专门针对 Android 改编了 ThreeTen-Backport(如上所述)。 见How to use ThreeTenABP…。ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval
、YearWeek
、YearQuarter
和more。
【讨论】:
亲爱的投票者:请在投票的同时留下批评意见。 嘿,我玩java.time
很久了,还没发现GregorianCalendar
和ZonedDateTime
之间的转换。这是一件自然而美好的事情,因为这些类在预期用途上非常匹配。相反的转换以GregorianCalendar.from(ZonedDateTime)
存在。谢谢你的消息,不管它是不是旧消息。
@OleV.V.是的,这种转换途径并不明显,因为这些方法只存在于具体的GregorianCalendar
类上,而不 存在于常用的Calendar
抽象类上。如果你手头有一个Calendar
对象,你必须用instanceOf
进行测试,以验证它实际上是一个GregorianCalendar
,转换它,然后调用转换方法。以上是关于java中GregorianCalendar类与Calendar类的关系与区别?的主要内容,如果未能解决你的问题,请参考以下文章
java 中GregorianCalendar类跟Calendar类有啥本质的区别,以及都怎么用
java中GregorianCalendar类返回当前年月日怎么和现实差了1个月
java.lang.IllegalArgumentException:坏类:类 java.util.GregorianCalendar
请问这个java类(GregorianCalendar )的一个方法?