java.time日历_Date类和Calendar类,以及Java 8推出的java.time包

Date类和Calendar类,以及Java 8推出的java.time包

Data类

Date类已经很老了,Java官方不建议使用它的构造器和方法了

能用的构造器和方法就还有以下几个:

public class DateTest {

public static void main(String[] args) {

//获得一个当前时间,该构造器在底层调用System.currentTimeMillis()获得long整数作为日期参数

Date date = new Date();

//获得当前时间100ms后的时间

Date date1 = new Date(System.currentTimeMillis()+100);

//测试该日期是否在指定日期之后

System.out.println(date.after(date1)); //false

//测试该日期是否在指定日期之前

System.out.println(date.before(date1));//true

}

}

Calendar类

Calendar是一个抽象类,它用于表示日历,是所有日历类的模板,Java本身提供了一个GregorianCalendar类,它代表了通常说的公历。

Calendar是一个抽象类,所以不能使用构造器来创建Calendar对象。但它提供了几个静态的getInstance方法来获取Calendar对象,这些方法根据TimeZone,Locale类来获取特定的Calendar,如果不指定TimeZone和Locale,则使用默认的TimeZone和Locale来创建Calendar。

Calendar和Date都是表示日期的工具类,它们可以自由转换:

Calendar calendar = Calendar.getInstance();

//从calendar对象中取出Date对象

Date date = calendar.getTime();

//通过Date对象获得对应的Calendar对象

Calendar calendar1 = Calendar.getInstance();

calendar1.setTime(date);

Calendar除了提供了大量设置时间,获取时间的 set set 方法之外,还提供了 add 和 roll 方法来进行日期的运算(PS:Calendar中,月份起始值是0):

Calendar c = Calendar.getInstance();

//add(int field,int amount)方法十分强大,当被修改的字段超出它允许的范围时,会发生进位,即上一级字段也发生改变

//如果下一级字段会改变,那么字段就会修正到变化最小的值:2020-01-31 加1个月--> 2020-02-29 而不是 2020-03-02

c.add(Calendar.MONTH,6);//当前月份往后推6个月

c.add(Calendar.MONTH,-5);//往后推6个月后,月份再往前推5个月

System.out.println(c.getTime());

//roll(int field,int amount)方法与add()的处理规则不同

//当被修改的字段超出它的允许范围时,上一级字段不会变化:2020-01-31 加10天--> 2020-01-10

//如果下一级字段会改变,处理规则和add()相似:2020-01-31 加1个月--> 2020-02-29 而不是 2020-03-02

c.roll(Calendar.MONTH,2); //当前月份往后推2个月

c.roll(Calendar.MONTH,-1); //往后推完2个月,再往前推1个月

System.out.println(c.getTime());

Calendar的容错性

Calendar calendar = Calendar.getInstance();

calendar.set(Calendar.MONTH,13); //默认Calendar的容错性是true,MONTH字段设置为13,将会导致YEAR字段加1

calendar.setLenient(false); //关闭容错性

calendar.set(Calendar.MONTH,13); //会引发异常 java.lang.IllegalArgumentException: MONTH

System.out.println(calendar.getTime());

Calendar的set()方法延迟修改

set(int field,int amount) 改变日期的字段时,尽管日历的字段会立即发生更改,但Calendar所代表的时间是不会立即发生更改的,直到下次调用get() getTime() getTimeInMillis() add() roll()时才会重新计算日历的时间。这称为set方法的延迟修改,优势是多次调用set()不会触发多次不必要的计算。

Java 8 新增的日期、时间包

Java 8 新增的java.time包下有如下常用的类:

Clock:该类用于获取指定时区的当前日期、时间。该类可取代System类的currentTimeMillis()方法,而且提供了更多的方法来获取当前日期、时间。该类提供了大量的静态方法来获取对象。

//----------------关于Clock的用法

Clock clock = Clock.systemUTC();

System.out.println("当前时刻:"+clock.instant());

//获取Clock对应的毫秒数,与System.currentTimeMillis()输出相同

System.out.println(clock.millis());

System.out.println(System.currentTimeMillis());

Duration:该类代表持续时间,可以非常方便的获取一段时间(最大单位是Day)。

Duration duration = Duration.ofSeconds(10000);

System.out.println("10000s = "+duration.toMinutes()+" min");

System.out.println("10000s = "+duration.toHours()+" h");

System.out.println("10000s = "+duration.toDays()+" day");

//在clock基础上增加10000s

Clock clock = Clock.systemUTC();

Clock clock1 = Clock.offset(clock,duration);

Instant:代表一个具体时刻,可以精确到纳秒。该类提供了静态的now()方法来获取当前时刻,也提供了静态的now(Clock clock)方法来获取clock对应的时刻。还有minusXxx()和plusXxx()在当前时刻基础上加上一段时间(Duration)

Instant instant = Instant.now();

System.out.println(instant); // 2020-03-13T12:27:49.748706800Z

//增加10000s

instant = instant.plusSeconds(10000);

System.out.println(instant);

//根据字符串解析Instant对象

Instant instant1 = Instant.parse("2019-01-01T00:00:00.00Z"); //最后必须要加个Z

System.out.println(instant1);

//在instant1的基础上加上3小时15分钟

instant1 = instant1.plus(Duration.ofHours(3).plusMinutes(15));

System.out.println(instant1);

LocalDate:该类代表不带时区的日期,例如:2012-01-01,该类提供了静态的now()方法来获取当前日期,也提供了静态的now(Clock clock)方法获取clock对应的日期。还有minusXxx()和plusXxx()在当前年份基础上减去或加上几年、几月、几周或几日。

LocalDate localDate = LocalDate.now();

System.out.println(localDate); //2020-03-14

//获得2014年的第146天

localDate = LocalDate.ofYearDay(2014,146);

System.out.println(localDate); //2014-05-26

//设置为2014年的5月21日

localDate = LocalDate.of(2014, Month.MAY,21);

System.out.println(localDate); //2014-05-21

localDate = localDate.plusWeeks(1); //加上一周

System.out.println(localDate); //2014-05-28

localDate = localDate.withMonth(3); //变为3月

System.out.println(localDate); //2014-03-28

localDate = localDate.with(TemporalAdjusters.lastDayOfMonth()); //取本月最后一天

System.out.println(localDate); //2014-03-31

LocalTime:该类代表不带时区的时间,例如:08:57:02,该类提供了静态的now()方法来获取当前时间,也提供了静态的now(Clock clock)方法获取clock对应的时间。还有minusXxx()和plusXxx()在当前年份基础上减去或加上几小时、几分、几秒。

LocalTime localTime = LocalTime.now();

System.out.println(localTime); //08:59:40.747327700

//设置为早上7点0分0秒0纳秒

localTime = LocalTime.of(7,0,0,0);

System.out.println(localTime); //07:00

//返回一天中的第6000秒

localTime = LocalTime.ofSecondOfDay(6000);

System.out.println(localTime); //01:40

LocalDateTime:该类代表不带时区的日期、时间,例如:2012-03-12T08:33:21。该类提供了静态的now()方法来获取当前日期、时间,也提供了静态的now(Clock clock)方法获取clock对应的日期、时间。还有minusXxx()和plusXxx()在当前日期、时间基础上减去或加上几年、几月、几周、几日、几小时、几分、几秒、几纳秒。

LocalDateTime localDateTime = LocalDateTime.now();

System.out.println(localDateTime); //2020-03-14T09:07:14.694952

//当前日期、时间加上24小时30分钟

LocalDateTime future = localDateTime.plusHours(24).plusMinutes(30);

System.out.println(future);

MonthDay:该类代表月日,例如:--03-15,该类提供了静态的now()方法来获取当前月日,也提供了静态的now(Clock clock)方法获取clock对应的月日。

YearMonth:该类代表年月,例如:2020-03,该类提供了静态的now()方法来获取当前年月,也提供了静态的now(Clock clock)方法来获取clock对应的月日。minusXxx(),plusXxx()方法减去或加上几年、几月。

Year:该类仅代表年,例如:2020,该类提供了静态的now()方法来获取当前年份,也提供了静态的now(Clock clock)方法来获取clock对应的年份。除此之外,还有minusYears()、plusYears()方法在当前的年份上减去或加上几年。

Month:这是一个枚举类,定义了一月到十二月的枚举值。

DayOfWeek:这是一个枚举类,定义了周日到周六的枚举值。

ZoneDateTime:该类代表一个时区化的日期、时间。

ZoneId:该类代表一个时区。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值