Java8特性:时间日期处理类
Posted 唐微港
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8特性:时间日期处理类相关的知识,希望对你有一定的参考价值。
对比
在旧版的 Java 中,日期时间 API 存在诸多问题,其中有:
- 非线程安全 − java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。
- 设计很差 − Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。
- 时区处理麻烦 − 日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。
常用类
-
LocalDate:不包含时间的日期,比如2019-10-14。可以用来存储生日,周年纪念日,入职日期等。
-
LocalTime:与LocalDate想对照,它是不包含日期的时间,例如23:24:24。
-
LocalDateTime:包含了日期及时间,没有偏移信息(时区)。
-
ZonedDateTime:包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的。
-
Instant:时间戳,与System.currentTimeMillis()类似。
-
Duration:表示一个时间段。
-
Period:用来表示以年月日来衡量一个时间段。
常用类实列
-
LocalDate LocalTime LocalDateTime。可以对当前的时间日期等进行相应处理
public static void main(String[] args) { /** * 日期类LocalDate */ //获取本地日期 2020-12-11 LocalDate ld = LocalDate.now(); System.out.println(ld); //日期获取年月日 int dayOfYear = ld.getDayOfYear();//一年中的第几天 346 int dayOfMonth = ld.getDayOfMonth();//一年中的第几个月11 DayOfWeek dayOfWeek = ld.getDayOfWeek();//一年中的第几周 int year = ld.getYear();//年份2020 Month month = ld.getMonth();//月分DECEMBER System.out.println(dayOfYear + " " + dayOfMonth + " " + dayOfWeek + " " + year + " " + month); System.out.println("日期类LocalDate---------------------------"); /** * 日期时间类 */ //获取本地当前时间 2020-12-11T13:32:16.556 LocalDateTime ldt = LocalDateTime.now(); System.out.println(ldt); int dayOfYearT = ldt.getDayOfYear();//一年中的第几天 346 int dayOfMonthT = ldt.getDayOfMonth();//一年中的第几个月11 DayOfWeek dayOfWeekT = ldt.getDayOfWeek();//一年中的第几周 int year1 = ldt.getYear();//年份2020 Month month1 = ldt.getMonth();//月分DECEMBER int hour = ldt.getHour();//时 int minute = ldt.getMinute();//分钟 int second = ldt.getSecond();//秒 System.out.println(dayOfYearT + " " + dayOfMonthT + " " + dayOfWeekT + " " + year1 + " " + month1 + " " + hour + " " + minute + " " + second); System.out.println("-----------------------------"); /** * LocalTime */ LocalTime now = LocalTime.now();//时间13:58:22.826 LocalTime of = LocalTime.of(23, 24, 24);//指定时间23:24:24 LocalTime ptr = LocalTime.parse("11:15:30"); System.out.println(now + " "+of+" "+ptr); System.out.println("LocalTime------------------------------"); /** * 日期时间类和日期类的相互转化 */ //本地日期时间转化为本地日期本地时间 LocalDate ld1 = ldt.toLocalDate(); LocalTime lt1 = ldt.toLocalTime(); //2020-12-11 System.out.println(ld1); //13:34:38.038 System.out.println(lt1); System.out.println("LocalDate--------LocalDateTime------------LocalTime"); }
-
ZonedDateTime类,用于处理带时区的日期和时间。ZoneId表示不同的时区。大约有40不同的时区
public static void main(String[] args) {
// 获取可用的时区
Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
availableZoneIds.forEach((a) -> System.out.println(a));
System.out.println("----------------------------------");
//获取当前时区
ZoneId zoneId = ZoneId.systemDefault();
System.out.println(zoneId);
ZoneRules rules = zoneId.getRules();
String id = zoneId.getId();
System.out.println(rules+" "+" "+id);
System.out.println("----------------------------------");
// 创建时区
ZoneId of = ZoneId.of("Asia/Shanghai");
System.out.println(of);
System.out.println("----------------------------------");
//获取当前时区时间日期还可以用now获取具体的事件日期时区等
ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDateTime.now(), zoneId);
ZonedDateTime now = ZonedDateTime.now();
System.out.println(zonedDateTime);
System.out.println(now);
}
-
Instant用于一个时间戳,与System.currentTimeMillis()类似,但Instant可以精确到纳秒(Nano-Second)。
Instant除了可以使用now()方法创建,还可以通过ofEpochSecond方法创建。
public static void main(String[] args) { Instant now = Instant.now(); System.out.println(now); //指定毫秒值100 Instant instant = Instant.ofEpochSecond(365 * 24 * 60, 100); System.out.println(instant); //获取毫秒值 int nano = now.getNano(); System.out.println(nano); }
-
Duration: Duration的内部实现与Instant类似,但Duration表示时间段,通过between方法创建。
public static void main(String[] args) { LocalDateTime from = LocalDateTime.now();//当前时间 LocalDateTime to = LocalDateTime.now().plusDays(1);//当前时间加上一天 Duration duration = Duration.between(from, to);// 指定为当前时间到当前加上一天的时间 long l2 = duration.toDays(); long l = duration.toHours(); long l1 = duration.toMillis(); long l3 = duration.toNanos(); System.out.println(l2 + "天=" + l + "小时=" + l1 + "秒=" + l3 + "微秒"); }
-
Period与Duration类似,获取一个时间段,只不过单位为年月日,也可以通过of方法和between方法创建,between方法接收的参数为LocalDate。
public static void main(String[] args) {
Period period = Period.of(1, 10, 25);
int days = period.getDays();
System.out.println(days);
int months = period.getMonths();
System.out.println(months);
int years = period.getYears();
System.out.println(years);
IsoChronology chronology = period.getChronology();//获取年表
System.out.println(chronology);
List<TemporalUnit> units = period.getUnits();
System.out.println(units);//获取单位
System.out.println(period);
Period period1 = Period.between(LocalDate.now(), LocalDate.now().plusYears(1));
System.out.println(period1);
}
以上是关于Java8特性:时间日期处理类的主要内容,如果未能解决你的问题,请参考以下文章
Java8新特性函数式编程API新时间日期处理APIOptional容器类总结
Java8新特性函数式编程API新时间日期处理APIOptional容器类总结
Java8新特性函数式编程API新时间日期处理APIOptional容器类总结