java入门篇 (33) jdk1.8 新特性

一、新增的日期类

1.1 LocalDateTime类

注释:LocalDate和LocalTime类与此类方法差不多,只举例LocalDateTime类

  • public static LocalDateTime now();
    获取系统当前时间

  • public static LocalDateTime of(int year,
    Month month,
    int dayOfMonth,
    int hour,
    int minute,
    int second,
    int nanoOfSecond);
    获取的日期实例是设置的年月日时分秒

public class Demo1 {
    public static void main(String[] args) {
        LocalDateTime lo = LocalDateTime.now();
        System.out.println(lo);
        LocalDateTime lo1 = LocalDateTime.of(2019,2,4,19,20,34);
        System.out.println(lo1);
    }
}

输出结果:
2019-02-04T19:20:52.547
2019-02-04T19:20:34
  • 获取日期对象年月日时分秒的方法
public class Demo1 {
    public static void main(String[] args) {
        LocalDateTime lo = LocalDateTime.now();
        System.out.println(lo);
        System.out.println(lo.getYear());
        System.out.println(lo.getMonth());
        System.out.println(lo.getDayOfMonth());
        System.out.println(lo.getMinute());
        System.out.println(lo.getHour());
        System.out.println(lo.getSecond());
    }
}

结果:
2019
FEBRUARY
4
6
20
41

1.2 格式化日期字符串的方法

  • 用方法 public String format(DateTimeFormatter.ofPattern(“日期格式”)格式化字符串;
public class Demo1 {
    public static void main(String[] args) {
        LocalDateTime lo = LocalDateTime.now();
        String str = lo.format(DateTimeFormatter.ofPattern("yyyy年mm月dd日"));
        System.out.println(str);
    }
}

  • DateTimeFormatter类的format方法格式化字符串

public class Text {
    public static void main(String[] args) {
        DateTimeFormatter date = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
        LocalDate lo = LocalDate.now();
        String format = date.format(lo);
        System.out.println(format);
    }
}
结果:
2019年02月07日

1.3 转换方法

注意:
LocalDate:表示年月日的类
LocalTime:表示时分秒的类

public class Demo1 {
    public static void main(String[] args) {
      LocalDateTime lo = LocalDateTime.now();
        LocalDate Date = lo.toLocalDate();
        System.out.println(Date);
        LocalTime time = lo.toLocalTime();
        System.out.println(time);
    }
}

结果:
2019-02-05
13:36:05.388

1.4 判断方法

  • isAfter()
    判断一个日期是否在指定日期之后

  • isBefore()
    判断一个日期是否在指定日期之前

  • isLeapYear()
    判断是否是闰年注意是LocalDate类中的方法

public class Demo1 {
    public static void main(String[] args) {
      LocalDateTime lo = LocalDateTime.now();
        LocalDate Date = lo.toLocalDate();
        System.out.println(Date);
        LocalTime time = lo.toLocalTime();
        System.out.println(time);
        LocalDateTime lo1 = LocalDateTime.of(2013,7,3,8,23,13);
        System.out.println(lo.isAfter(lo1));
        LocalTime T1 = LocalTime.now();
        LocalTime T2 = LocalTime.of(12,32,13);
        System.out.println(T1.isBefore(T2));
        LocalDate da1 = LocalDate.of(2012,3,1);
        LocalDate now = LocalDate.now();
        System.out.println(now.isLeapYear());
    }
}

结果:
2019-02-05
13:44:29.637
true
false
false

1.5 将字符串解析为日期类

  • parse()

将一个日期字符串解析成日期对象, 注意字符串日期的写法的格式要正确, 否则解析失败

        String str = "2013-02-12T12:23:32";
        LocalDateTime parse = lo1.parse(str);
        System.out.println(parse);
        String str1 = "12:23:22";
        System.out.println(T1.parse(str1));
        System.out.println(LocalTime.parse(str1));

按照自己设定的格式解析字符串:

public class Demo1 {
    public static void main(String[] args) {
     String date = "2013年10月12号";
        LocalDate date1 = LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy年MM月dd号"));
        System.out.println(date1.format(DateTimeFormatter.ofPattern("yyyy年MM月dd号")));
    }
}

1.6 给指定的日期增减时间

  • plusXXX()方法
    给指定的日期添加相应的时间量
public class Demo1 {
    public static void main(String[] args) {
     LocalDate date = LocalDate.of(1021,2,2);
        LocalDate date1 = date.plusYears(12);
        System.out.println("变化之后的时间:" + date1.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")));
    }
}

结果:
1040年02月02日
  • minusXXX ()方法
    给日期减去相应的时间量
public class Demo1 {
    public static void main(String[] args) {
     LocalDate date = LocalDate.of(1021,3,31);
        LocalDate date1 = date.minusMonths(1);
        System.out.println("变化之后的时间:" + date1.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")));
    }
}

结果:
变化之后的时间:1021年02月28日
  • withXXX()方法

指定日期系列的方法

public class Demo1 {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(1021,3,31);
        LocalDate date1 = date.withMonth(2);
       System.out.println("指定的日期:" + date1);
    }
}
结果:
指定的日期:1021-02-28

通过调整器获取指定时间:TemporalAdjusters类

  • static dayOfWeekInMonth(int ordinal, DayOfWeek dayOfWeek)
  • static firstDayOfMonth()
public class Demo1 {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(1021,3,31);
        System.out.println(date.with(TemporalAdjusters.firstDayOfMonth()));
        System.out.println(date.with(TemporalAdjusters.firstInMonth(DayOfWeek.FRIDAY)));
    }
}

结果:
1021-03-01
1021-03-02

二、Instant时间戳类

2.1 Instant类常用方法

  • now()方法
    获取当前系统时间,默认是获取的时间与我们相差8个小时
  • atOffset(ZoneOffset offset)
    设置时间的偏移量,返回一个新的偏移过后的日期
public class Demo1 {
    public static void main(String[] args) {
        Instant ins = Instant.now();
        OffsetDateTime time = ins.atOffset(ZoneOffset.ofHours(8));
        System.out.println(time);
    }
}

结果:
2019-02-07T14:29:29.098+08:00
  • getEpochSecond()
    从1970-01-01T00:00:00Z的Java时代获取秒数

  • toEpochMilli()
    从1970-01-01T00:00:00Z的Java时代获取毫秒数

  • static Instant ofEpochMilli(long epochMilli)
    获得的一个实例 Instant从1970-01-01T00划时代使用毫秒:00:00Z。

public class Demo1 {
    public static void main(String[] args) {
        Instant ins = Instant.now();
        OffsetDateTime time = ins.atOffset(ZoneOffset.ofHours(8));
        System.out.println(Instant.ofEpochMilli(1000*60 * 60));   
    }
}

结果:
1970-01-01T01:00:00Z

2.2 时区编号类ZoneID

  • public static ZoneID systemDefault();
    获取系统默认时区编号
public class Demo1 {
    public static void main(String[] args) {
        ZoneId id = ZoneId.systemDefault();
        System.out.println(id);
    }
}

结果:
Asia/Shanghai
  • ZonedDateTime atZone(ZoneId zone)
    将此瞬间与时区相结合,创建一个 ZonedDateTime 。

例如:获取当前系统所在默认时区的时间

public class Demo1 {
    public static void main(String[] args) {
        ZoneId id = ZoneId.systemDefault();
        System.out.println(Instant.now().atZone(id));
    }
}

结果:
2019-02-07T14:47:54.172+08:00[Asia/Shanghai]
  • static Set getAvailableZoneIds()
    获取一组可用的区域ID。
public class Text {
    public static void main(String[] args) {
        Set<String> ids = ZoneId.getAvailableZoneIds();
        for(String str:ids) {
            System.out.println(str);
        }
    }
}

结果:
Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8
Africa/Nairobi
America/Marigot
Asia/Aqtau
  • static LocalDateTime now(ZoneId zone)
    从指定时区的系统时钟获取当前的日期时间。
public class Text {
    public static void main(String[] args) {
        LocalDateTime date = LocalDateTime.now(ZoneId.of("Asia/Aden"));
        System.out.println(date);
    }
}

结果:
2019-02-07T16:25:02.161

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

  • static Duration between(Temporal startInclusive, Temporal endExclusive)
    获取一个 Duration表示两个时间对象之间的持续时间。
public class Demo1 {
    public static void main(String[] args) {
        Instant start = Instant.now();
        for (int i = 0; i < 1000; i++) {
            System.out.println(i);
        }
        Instant end = Instant.now();
        Duration between = Duration.between(start, end);
        System.out.println(between.toMillis());
    }
}
  • long toNanos()
    将此持续时间转换为总长度,单位为纳秒,表示为 long 。

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

  • static Period between(LocalDate startDateInclusive, LocalDate
    endDateExclusive)
    获得一个 Period ,由两个日期之间的年数,月份和日期组成。
  • int getDays()
    获得此期间的天数。
  • int getMonths()
    获取此期间的月数。
public class Demo1 {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2013, 3,23);
        LocalDate date1 = LocalDate.now();
        Period period = Period.between(date, date1);
        System.out.println(period.getYears());
        System.out.println(period.getMonths());
        System.out.println(period.getDays());
    }
}

2.5 TemporalAdjuster 时间矫正器类

  • 使用TemporalAdjusters自带的常量来获取日期
public class Text {
    public static void main(String[] args) {
        LocalDate date = LocalDate.now();
        TemporalAdjuster ad = TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY);
        LocalDate with = date.with(ad);
        System.out.println("设置的时间为:" + with);
    }
}

结果:
设置的时间为:2019-02-22
  • 采用TemporalAdjusters中的next方法来指定日期
public class Text {
    public static void main(String[] args) {
        LocalDate date = LocalDate.now();
        TemporalAdjuster ad = TemporalAdjusters.next(DayOfWeek.THURSDAY);
        TemporalAdjuster ad1 = TemporalAdjusters.nextOrSame(DayOfWeek.THURSDAY);
        LocalDate with = date.with(ad);
        LocalDate with1 = date.with(ad1);
        System.out.println("设置的时间为:" + with);
        System.out.println("设置的时间为:" + with1);
    }
}

结果为:
设置的时间为:2019-02-14
设置的时间为:2019-02-07

注意:
如果设置的时间刚好是今天,则nextOrSame()方法设置的是今天的时间,而next()方法设置的是下个周的时间。

2.6 案例:计算下个工作日是几号?

思路:如果是周五加3天,周六加2天,其他时间加一天

public class Text {
    public static void main(String[] args) {
       LocalDate date = LocalDate.now();
        DayOfWeek day = date.getDayOfWeek();
        LocalDate date1;
        switch(day) {
            case FRIDAY:
                date1 = date.plusDays(3);
                break;
            case SATURDAY:
                date1 = date.plusDays(2);
                break;
            default:date1 = date.plusDays(1);
            break;
        }
        System.out.println(date1);
    }
}
结果:
2019-02-08

2.7 ZonedDateTime类与LocalDateTime类

区别:带不带时区信息

public class Text {
    public static void main(String[] args) {
        System.out.println(LocalDateTime.now());
        System.out.println(ZonedDateTime.now());
    }
}

结果:
2019-02-07T20:00:20.557
2019-02-07T20:00:20.559+08:00[Asia/Shanghai]
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值