首页 > 编程语言 > 详细

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

时间:2020-03-15 13:44:05      阅读:62      评论:0      收藏:0      [点我收藏+]

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:该类代表一个时区。

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

原文:https://www.cnblogs.com/woshi123/p/12497037.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!