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:该类代表一个时区。
最后
以上就是辛勤电脑最近收集整理的关于java.time日历_Date类和Calendar类,以及Java 8推出的java.time包的全部内容,更多相关java.time日历_Date类和Calendar类,以及Java内容请搜索靠谱客的其他文章。
发表评论 取消回复