大家好,欢迎来到IT知识分享网。
Java中Calendar基本使用
Calendar中的常用日历字段
日历字段 | Value |
---|---|
YEAR | 当前年份 |
MONTH | 当前月份( 注:初始值是从0开始,所以得到的比实际月份小1月) |
DATE | 一个月中的某天 |
WEEK_OF_YEAR | 当前年中的第几个星期 |
WEEK_OF_MONTH | 当前月中的第几个星期 |
DAY_OF_MONTH | 一个月中的第几天 |
DAY_OF_YEAR | 一年中的第几天 |
DAY_OF_WEEK | 一个星期中的第几天 |
DAY_OF_WEEK_IN_MONTH | 当前月中的第几个星期(注:当前月第1-7天是第一个星期,8-14是第二个星期,以此类推) |
HOUR_OF_DAY | 一天中的第几个小时 |
MINUTE | 一小时中的第几分钟 |
SECOND | 一分钟中的第几秒 |
MILLISECOND | 一秒中的第几毫秒 |
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
System.out.println("当前时间是:" + sdf.format(new Date()));
Calendar ca = Calendar.getInstance();
System.out.println("当前年份:" + ca.get(Calendar.YEAR));
System.out.println("当前月:" + ca.get(Calendar.MONTH));// 初始月份是从0开始,所以输出值比是几月份小1
System.out.println("当前日期:" + ca.get(Calendar.DATE));
System.out.println("当前年份第几个星期:" + ca.get(Calendar.WEEK_OF_YEAR));
System.out.println("当前月份第几个星期:" + ca.get(Calendar.WEEK_OF_MONTH));
System.out.println("当前年份第几天:" + ca.get(Calendar.DAY_OF_YEAR));
System.out.println("当前月份第几天:" + ca.get(Calendar.DAY_OF_MONTH));
System.out.println("当前星期第几天:" + ca.get(Calendar.DAY_OF_WEEK));
System.out.println("当前月份第几个星期:" + ca.get(Calendar.DAY_OF_WEEK_IN_MONTH));
System.out.println("当天第几个小时:" + ca.get(Calendar.HOUR_OF_DAY));
System.out.println("当前小时第几分钟:" + ca.get(Calendar.MINUTE));
System.out.println("当前分钟第几秒:" + ca.get(Calendar.SECOND));
System.out.println("当前秒数第几毫秒:" + ca.get(Calendar.MILLISECOND));
}
当前时间是:2021-09-20 15:48:17:702
当前年份:2021
当前月:8
当前日期:20
当前年份第几个星期:39
当前月份第几个星期:4
当前年份第几天:263
当前月份第几天:20
当前星期第几天:2
当前月份第几个星期:3
当天第几个小时:15
当前小时第几分钟:48
当前分钟第几秒:17
当前秒数第几毫秒:703
更改日历字段方法: set()、 add() 和 roll()
set(oldValue, newValue)
set(oldValue, newValue) 将日历字段oldValue 更改为 newValue。此外,它设置了一个内部成员变量,以表示日历字段oldValue 已经被更改。即使日历字段oldValue 是立即被更改的,但是直到下次调用 get()、getTime()、getTimeInMillis()、add() 或 roll() 时才会重新计算日历的时间值(以毫秒为单位)。因此,多次调用 set() 不会触发多次不必要的计算。使用 set() 更改日历字段的结果是,其他日历字段也可能发生更改,这取决于日历字段、日历字段值和日历系统。此外,在重新计算日历字段之后,get(f) 没必要通过调用 set 方法返回 value 集合。具体细节是通过具体的日历类确定的。
public static void main(String[] args) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
System.out.println("当前时间是:" + sdf.format(new Date()));
Calendar ca = Calendar.getInstance();
//修改日历的指定时间
ca.setTime(sdf.parse("2021-09-20 16:01:01:100"));
System.out.println("修改日期后的日历时间是:" + sdf.format(ca.getTime()));
ca.set(Calendar.MONTH,Calendar.JANUARY);
System.out.println("修改月份后的日历时间是:" + sdf.format(ca.getTime()));
} catch (ParseException e) {
e.printStackTrace();
}
}
当前时间是:2021-09-20 16:19:46:535
修改日期后的日历时间是:2021-09-20 16:01:01:100
修改月份后的日历时间是:2021-01-20 16:01:01:100
add(f, delta)
add(f, delta) 将 delta 添加到 f 字段中。等同于调用 set(f, get(f) + delta),但要带以下两个调整:
Add 规则 1。调用后 f 字段的值减去调用前 f 字段的值等于 delta,以字段 f 中发生的任何溢出为模。溢出发生在字段值超出其范围时,结果,下一个更大的字段会递增或递减,并将字段值调整回其范围内。
Add 规则 2。如果期望某一个更小的字段是不变的,但让它等于以前的值是不可能的,因为在字段 f 发生更改之后,或者在出现其他约束之后,比如时区偏移量发生更改,它的最大值和最小值也在发生更改,然后它的值被调整为尽量接近于所期望的值。更小的字段表示一个更小的时间单元。HOUR 是一个比 DAY_OF_MONTH 小的字段。对于不期望是不变字段的更小字段,无需进行任何调整。日历系统会确定期望不变的那些字段。
此外,与 set() 不同,add() 强迫日历系统立即重新计算日历的毫秒数和所有字段。
示例:假定 GregorianCalendar 最初被设置为 1999 年 8 月 31 日。调用 add(Calendar.MONTH, 13) 将日历设置为 2000 年 9 月 30 日。Add 规则 1 将 MONTH 字段设置为 September,因为向 August 添加 13 个月得出的就是下一年的 September。因为在 GregorianCalendar 中,DAY_OF_MONTH 不可能是 9 月 31 日,所以 add 规则 2 将 DAY_OF_MONTH 设置为 30,即最可能的值。尽管它是一个更小的字段,但不能根据规则 2 调整 DAY_OF_WEEK,因为在 GregorianCalendar 中的月份发生变化时,该值也需要发生变化。
public static void main(String[] args) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
System.out.println("当前时间是:" + sdf.format(new Date()));
Calendar ca = Calendar.getInstance();
//修改日历的指定时间
ca.setTime(sdf.parse("2021-10-31 16:01:01:100"));
System.out.println("修改日期后的日历时间是:" + sdf.format(ca.getTime()));
ca.add(Calendar.MONTH,1);
System.out.println("修改月份后的日历时间是:" + sdf.format(ca.getTime()));
} catch (ParseException e) {
e.printStackTrace();
}
}
当前时间是:2021-09-20 16:28:33:741
修改日期后的日历时间是:2021-10-31 16:01:01:100
修改月份后的日历时间是:2021-11-30 16:01:01:100
roll(f, delta)
roll(f, delta) 将 delta 添加到 f 字段中,但不更改更大的字段。这等同于调用 add(f, delta),但要带以下调整:
Roll 规则。在完成调用后,更大的字段无变化。更大的字段表示一个更大的时间单元。DAY_OF_MONTH 是一个比 HOUR 大的字段。
public static void main(String[] args) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
System.out.println("当前时间是:" + sdf.format(new Date()));
Calendar ca = Calendar.getInstance();
ca.roll(Calendar.DAY_OF_MONTH,-21);
System.out.println("修改后的日历时间是:" + sdf.format(ca.getTime()));
} catch (Exception e) {
e.printStackTrace();
}
}
9月20 往前推21天,不是到8月30,而是9月20减去20天到9月30日,9月30日减去一天到9月29日
当前时间是:2021-09-20 16:31:56:197
修改后的日历时间是:2021-09-29 16:31:56:197
Java中文api地址:https://tool.oschina.net/apidocs/apidoc?api=jdk-zh
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/15809.html