4、java8新时间日期 API

1、简介

LocalDate、 LocalTime、 LocalDateTime 类的实例是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息。

: ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法。

2、LocalDate、 LocalTime、 LocalDateTime常用方法:

方法描述示例
now()静态方法,根据当前时间创建对象LocalDateTime localDateTime = LocalDateTime.now();
of()静态方法,根据指定日期/时间创建对象LocalDateTime localDateTime = LocalDateTime.of(2018, 10,26, 12, 10, 55);
plusDays, plusWeeks,plusMonths, plusYears向当前 LocalDate 对象添加几天、几周、 几个月、 几年
minusDays, minusWeeks,minusMonths, minusYears从当前 LocalDate 对象减去几天、几周、 几个月、 几年
plus, minus添加或减少一个 Duration 或 Period
withDayOfMonth,withDayOfYear,withMonth,withYear将月份天数、 年份天数、 月份、 年份 修 改 为 指 定 的 值 并 返 回 新 的LocalDate 对象
getDayOfMonth获得月份天数(1-31)
getDayOfYear获得年份天数(1-366)
getDayOfWeek获得星期几(返回一个 DayOfWeek枚举值)
getMonth获得月份, 返回一个 Month 枚举值
getMonthValue获得月份(1-12)
getYear获得年份
until获得两个日期之间的 Period 对象,或者指定 ChronoUnits 的数字
isBefore, isAfter比较两个 LocalDate
isLeapYear判断是否是闰年

3、使用和示例

1. LocalDate、LocalTime、LocalDateTime
2. Instant : 时间戳。 (使用 Unix 元年 1970年1月1日 00:00:00 所经历的毫秒值)
3. Duration 和 Period

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

4. 日期的操纵

  • TemporalAdjuster : 时间校正器。有时我们可能需要获
    取例如:将日期调整到“下个周日”等操作。
  • TemporalAdjusters : 该类通过静态方法提供了大量的常
    用 TemporalAdjuster 的实现。

5. DateTimeFormatter : 解析和格式化日期或时间
6. 时区的处理

  • ZoneId:该类中包含了所有的时区信息
    getAvailableZoneIds() : 可以获取所有时区时区信息。
    of(id) : 用指定的时区信息获取 ZoneId 对象。
  • ZonedDate、 ZonedTime、 ZonedDateTime
    其中每个时区都对应着 ID,地区ID都为 “{区域}/{城市}”的格式。
    例如 : Asia/Shanghai 等

示例:

/**
 * 1、LocalDate、LocalTime、LocalDateTime
 */
@Test
public void test01(){
    LocalDateTime ldt = LocalDateTime.now();
    System.out.println(ldt);

    LocalDateTime ldt2 = LocalDateTime.of(2018, 12, 22, 10, 10, 10);
    System.out.println(ldt2);
//      加二十年
    LocalDateTime ldt3 = ldt2.plusYears(20);
    System.out.println(ldt3);
//      减两个月
    LocalDateTime ldt4 = ldt2.minusMonths(2);
    System.out.println(ldt4);
}

输出结果:

2019-01-05T10:35:31.597
2018-12-22T10:10:10
2038-12-22T10:10:10
2018-10-22T10:10:10

/**
 * 2、Instant : 时间戳。 (使用 Unix 元年 1970年1月1日 00:00:00 所经历的毫秒值)
 */
@Test
public void test02(){
    Instant ins = Instant.now();
    System.out.println(ins); //默认使用 UTC 时区
    OffsetDateTime odt = ins.atOffset(ZoneOffset.ofHours(8)); // 转成中国时区
    System.out.println(odt);

    System.out.println(ins.toEpochMilli()); // 毫秒时间戳
}

输出结果:

2019-01-05T02:43:22.004Z
2019-01-05T10:43:22.004+08:00
1546656202004

/**
 * 3、Duration : 用于计算两个“时间”间隔
 *    Period : 用于计算两个“日期”间隔
 */
@Test
public void test3(){
    Instant ins1 = Instant.now();
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
    }
    Instant ins2 = Instant.now();
    System.out.println("所耗费时间为:" + Duration.between(ins1, ins2));

    System.out.println("----------------------------------");

    LocalDate ld1 = LocalDate.now();
    LocalDate ld2 = LocalDate.of(2011, 1, 1);

    Period pe = Period.between(ld2, ld1);
    System.out.println(pe.getYears());
    System.out.println(pe.getMonths());
    System.out.println(pe.getDays());
}

输出结果:

所耗费时间为:PT1.001S
----------------------------------
8
0
4

/**
 * 4、TemporalAdjuster : 时间校正器
 */
@Test
public void test04(){
    LocalDateTime ldt = LocalDateTime.now();
    System.out.println(ldt);

    LocalDateTime ldt2 = ldt.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
    System.out.println(ldt2);

    //自定义:下一个工作日
    LocalDateTime ldt4 = ldt.with((l) -> {
        LocalDateTime ldt3 = (LocalDateTime) l;
        DayOfWeek dow = ldt3.getDayOfWeek();

        if(dow.equals(DayOfWeek.FRIDAY)){
            return ldt3.plusDays(3);
        }else if(dow.equals(DayOfWeek.SATURDAY)){
            return ldt3.plusDays(2);
        }else{
            return ldt3.plusDays(1);
        }
    });
    System.out.println(ldt4);
}

输出结果:

2019-01-05T11:14:23.353
2019-01-11T11:14:23.353
2019-01-07T11:14:23.353

/**
 * 5、DateTimeFormatter : 解析和格式化日期或时间
 */
@Test
public void test05(){
    DateTimeFormatter dft = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss E");

    LocalDateTime ldt = LocalDateTime.now();
    String strDate = ldt.format(dft);
    System.out.println(strDate);

    LocalDateTime newLdt = parse(strDate, dft);
    System.out.println(newLdt);
}

输出结果:

2019年01月05日 11:29:06 星期六
2019-01-05T11:29:06

/**
 * 6、ZonedDate、ZonedTime、ZonedDateTime : 带时区的时间或日期
 */
@Test
public void test06(){
    Set<String> set = ZoneId.getAvailableZoneIds(); // 获取所有时区
//        set.forEach(System.out::println);

    LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
    System.out.println(ldt);

    ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("US/Pacific"));
    System.out.println(zdt);
}

输出结果:

2019-01-05T11:35:52.179
2019-01-04T19:35:52.181-08:00[US/Pacific]

/**
 * LocalDateTime和字符串转换
 */
@Test
public void testFormatter() {
    // LocalDateTime转字符串
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println(formatter.format(localDateTime));
    // 字符串转LocalDateTime
    String str = "2008-08-23 23:59:59";
    DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    LocalDateTime localDateTime2 = LocalDateTime.parse(str,formatter2);
    System.out.println(localDateTime2);
}

/**
 * Date和LocalDateTime转换
 */
@Test
public void testConver() {
    // Date转LocalDateTime
    Date date = new Date();
    System.out.println(date);
    LocalDateTime localDateTime = date.toInstant()
                                      .atZone(ZoneId.systemDefault())
                                      .toLocalDateTime();
    System.out.println(localDateTime);
    // LocalDateTime转Date
    Date lToDate = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    System.out.println(lToDate);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值