当前位置 : 主页 > 编程语言 > 其它开发 >

Java基础——JDK1.8后的日期处理类

来源:互联网 收集:自由互联 发布时间:2022-06-29
Java1.0中包含了一个Date类,但是它的大多数方法已经在Java 1.1引入Calendar类之后被弃用了。而Calendar并不比Date好多少。它们面临的问题是: 可变性:象日期和时间这样的类对象应该是不可

Java1.0中包含了一个Date类,但是它的大多数方法已经在Java 1.1引入Calendar类之后被弃用了。而Calendar并不比Date好多少。它们面临的问题是:

  • 可变性:象日期和时间这样的类对象应该是不可变的。Calendar类中可以使用三种方法更改日历字段:set()、add() 和 roll()。

  • 偏移性:Date中的年份是从1900开始的,而月份都是从0开始的。

  • 格式化:格式化只对Date有用,Calendar则不行。

  • 此外,它们也不是线程安全的,不能处理闰秒等。

可以说,对日期和时间的操作一直是Java程序员最痛苦的地方之一。第三次引入的API是成功的,并且java 8中引入的java.time API 已经纠正了过去的缺陷,将来很长一段时间内它都会为我们服务。

Java 8 吸收了 Joda-Time 的精华,以一个新的开始为 Java 创建优秀的 API。

  • java.time – 包含值对象的基础包

  • java.time.chrono – 提供对不同的日历系统的访问。

  • java.time.format – 格式化和解析时间和日期

  • java.time.temporal – 包括底层框架和扩展特性

  • java.time.zone – 包含时区支持的类

Java 8 吸收了 Joda-Time 的精华,以一个新的开始为 Java 创建优秀的 API。新的 java.time 中包含了所有关于时钟(Clock),本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类。

1、本地日期时间:LocalDate、LocalTime、LocalDateTime 方法  now() / now(ZoneId zone) 静态方法,根据当前时间创建对象/指定时区的对象 of() 静态方法,根据指定日期/时间创建对象 getDayOfMonth()/getDayOfYear() 获得月份天数(1-31) /获得年份天数(1-366) getDayOfWeek() 获得星期几(返回一个 DayOfWeek 枚举值) getMonth() 获得月份, 返回一个 Month 枚举值 getMonthValue() / getYear() 获得月份(1-12) /获得年份 getHours()/getMinute()/getSecond() 获得当前对象对应的小时、分钟、秒 withDayOfMonth()/withDayOfYear()/withMonth()/withYear() 将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象 with(TemporalAdjuster t) 将当前日期时间设置为校对器指定的日期时间 plusDays(), plusWeeks(), plusMonths(), plusYears(),plusHours() 向当前对象添加几天、几周、几个月、几年、几小时 minusMonths() / minusWeeks()/minusDays()/minusYears()/minusHours() 从当前对象减去几月、几周、几天、几年、几小时 plus(TemporalAmount t)/minus(TemporalAmount t) 添加或减少一个 Duration 或 Period isBefore()/isAfter() 比较两个 LocalDate isLeapYear() 判断是否是闰年(在LocalDate类中声明) format(DateTimeFormatter t) 格式化本地日期、时间,返回一个字符串 parse(Charsequence text) 将指定格式的字符串解析为日期、时间
 import org.junit.Test;
 
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 
 public class TestLocalDateTime {
     @Test
     public void test7(){
         LocalDate now = LocalDate.now();
         LocalDate before = now.minusDays(100);
         System.out.println(before);//2019-02-26
    }
 
     @Test
     public void test06(){
         LocalDate lai = LocalDate.of(2019, 5, 13);
         LocalDate go = lai.plusDays(160);
         System.out.println(go);//2019-10-20
    }
 
     @Test
     public void test05(){
         LocalDate lai = LocalDate.of(2019, 5, 13);
         System.out.println(lai.getDayOfYear());
    }
 
 
     @Test
     public void test04(){
         LocalDate lai = LocalDate.of(2019, 5, 13);
         System.out.println(lai);
    }
 
     @Test
     public void test03(){
         LocalDateTime now = LocalDateTime.now();
         System.out.println(now);
    }
 
     @Test
     public void test02(){
         LocalTime now = LocalTime.now();
         System.out.println(now);
    }
 
     @Test
     public void test01(){
         LocalDate now = LocalDate.now();
         System.out.println(now);
    }
 }
2、持续日期/时间:Period和Duration

Period:用于计算两个“日期”间隔

Duration:用于计算两个“时间”间隔

 import org.junit.Test;
 import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.Period;
 public class TestPeriodDuration {
     @Test
     public void test01(){
         LocalDate t1 = LocalDate.now();
         LocalDate t2 = LocalDate.of(2018, 12, 31);
         Period between = Period.between(t1, t2);
         System.out.println(between);
         System.out.println("相差的年数:"+between.getYears());
         System.out.println("相差的月数:"+between.getMonths());
         System.out.println("相差的天数:"+between.getDays());
         System.out.println("相差的总数:"+between.toTotalMonths());
    }
 
     @Test
     public void test02(){
         LocalDateTime t1 = LocalDateTime.now();
         LocalDateTime t2 = LocalDateTime.of(2017, 8, 29, 0, 0, 0, 0);
         Duration between = Duration.between(t1, t2);
         System.out.println(between);
 
         System.out.println("相差的总天数:"+between.toDays());
         System.out.println("相差的总小时数:"+between.toHours());
         System.out.println("相差的总分钟数:"+between.toMinutes());
         System.out.println("相差的总秒数:"+between.getSeconds());
         System.out.println("相差的总毫秒数:"+between.toMillis());
         System.out.println("相差的总纳秒数:"+between.toNanos());
         System.out.println("不够一秒的纳秒数:"+between.getNano());
    }
 }
 
上一篇:谈谈线程安全
下一篇:没有了
网友评论