专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java 8新特性:新的时间和日期API(java的日期类型)

temp10 2024-11-11 13:54:15 java教程 7 ℃ 0 评论

Java 8的一个重要新增特性就是引入了新的时间和日期API,它们被包含在java.time包中。借助新的时间和日期API可以以更简洁的方法处理时间和日期。

Java 8的时间是基于ISO日历系统,该系统是遵循通用格里高利规则的实际世界日历。所有的类都是不可变的并且是线程安全的。今天主要介绍日期和时间类中的LocalDate、LocalTime、Instant、Duration以及Period等。

Java 8新特性:新的时间和日期API(java的日期类型)

Dates and Times

Instant

Instant实质是一个数字时间戳,可以从当前的Clock中获取。与我们常使用的System.currentTimeMillis()有些类似,不过Instant可以精确到纳秒(Nano-Second),System.currentTimeMillis()方法只精确到毫秒(Milli-Second)。

Instant instant = Instant.now();
instant.getNano(); // nanoseconds
instant.getEpochSecond(); // 当前的绝对秒

Instant instant = Instant.ofEpochSecond(120, 100000);
ofEpochSecond()方法的第一个参数为秒,第二个参数为纳秒,上面的代码表示从1970-01-01 00:00:00开始后两分钟的10万纳秒的时刻

LocalDate

LocalDate存储的是日期,它不带有时间,所以你可以用它来存"2020-05-01"这样节日。

LocalTime

LocalTime存储的是时间,它不带有日期,即"09:30:31"这样的的时间点。

LocalDateTime

LocalDateTime则同时存储日期和时间,如"2010-12-03T11:30:01"。

ZonedDateTime

ZonedDateTime在存储日期和时间的同时,还带有时区。如"2017-01-05T15:26:56.147+08:00[Asia/Shanghai]

". 其中2017-01-05T15:26:56.147部分为LocalDateTime,+08:00[Asia/Shanghai]部分为ZoneId。如果可以,还是尽量使用不带时区的方法类,它能避免你的应用复杂化。

// 构建对象
LocalDateTime localDateTime = LocalDateTime.now(); // 2020-05-23T17:14:26.035
LocalDate localDate = localDateTime.toLocalDate(); // 2020-05-23
LocalTime localTime = localDateTime.toLocalTime(); // 17:14:26.035

DateTimeFormatter DAY_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime = LocalDateTime.parse("2020-05-01 12:30:31", DAY_TIME_FORMAT);

LocalDateTime localDateTime = LocalDateTime.of(2017, Month.JANUARY, 4, 17, 23, 52);

// 比较&运算
if (localDate.isAfter(anthorLocalDate.minusDays(1L))) {}

// format
DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyyMMdd");
localDate.format(DATE_FORMAT); //20200523

Duration and Period

Duration是沿时间轴以纳秒为单位的时间的简单度量。 Period以对人类有意义的单位表示时间量,例如年或天。

LocalDateTime from = LocalDateTime.of(2017, Month.JANUARY, 5, 10, 7, 0);    // 2017-01-05 10:07:00
LocalDateTime to = LocalDateTime.of(2017, Month.FEBRUARY, 5, 10, 7, 0);     // 2017-02-05 10:07:00
Duration duration = Duration.between(from, to);     // 表示从 2017-01-05 10:07:00 到 2017-02-05 10:07:00 这段时间

long days = duration.toDays();              // 这段时间的总天数
long hours = duration.toHours();            // 这段时间的小时数
long minutes = duration.toMinutes();        // 这段时间的分钟数
long seconds = duration.getSeconds();       // 这段时间的秒数
long milliSeconds = duration.toMillis();    // 这段时间的毫秒数
long nanoSeconds = duration.toNanos();      // 这段时间的纳秒数


// 2020-04-01 到 2020-05-23 这段时间
Period period = Period.between(
                LocalDate.of(2020, 04, 01),
                LocalDate.of(2020, 05, 23));
System.out.println(period.getDays());  // 22
System.out.println(period.getMonths());// 1
System.out.println(period.getYears()); // 0

Additional value types

除了上述的时间,日期等,还提供了年/月/日等类型。如

  • Month: 它是一个枚举值,表示一年的12个月:January, February, March, April, May, June, July, August, September, October, November and December.
  • DayOfWeek: 枚举类型,表示一周中的七天:Monday, Tuesday, Wednesday, Thursday, Friday, Saturday and Sunday.
  • Year: 不可变的日期,表示年。有了Year之后判断闰年就简单多了。
  • YearMonth: 表示年月,在ISO-8601日历系统中表示诸如"2020-05"。
  • MonthDay: 表示月和天,而不带有年和时间,"--12-03"。
  • OffsetTime: 不可变的日期时间对象,通常用来表示"hour-minute-second"的offset, 如"10:15:30+01:00"。
  • OffsetDateTime: 是日期时间再加上 offset(ISO-8601日历系统中与的UTC /格林威治时间偏移)的一个对象。
LocalDateTime localDateTime = LocalDateTime.now(); // 2020-05-23T17:14:26.035
LocalDate localDate = localDateTime.toLocalDate(); // 2020-05-23
int year = localDate.getYear();                     // 2020
Month month = localDate.getMonth();                 // 月份:MAY
int dayOfMonth = localDate.getDayOfMonth();         // 月份中的第几天:23
DayOfWeek dayOfWeek = localDate.getDayOfWeek();     // 一周的第几天:SATURDAY
int length = localDate.lengthOfMonth();             // 月份的天数:31
boolean leapYear = localDate.isLeapYear();          // 是否为闰年:true

method

尽管各种日期时间类的方法众多,但许多方法可以都使用一致的前缀命名。

  • of: 静态工厂方法,如 LocalDateTime.of(2017, Month.JANUARY, 5, 10, 7, 0);
  • parse:静态工厂方法基于parsing
LocalDateTime.parse("2020-05-01 12:30:31", DAY_TIME_FORMAT);
  • get:获取某值,localDateTime.getYear()
  • is:检查某值是否成立,如 year.isLeap()
  • with: 相当于setter的作用
LocalDate date = LocalDate.parse("2020-05-23");
//获取这个月的第一个周末的时间
date.with(TemporalAdjusters.dayOfWeekInMonth(1, DayOfWeek.SUNDAY)));//2020-05-03
  • plus: 给某值加上一个值,如 localDate.plusDays(1)
  • minus: 给某值加上一个值 如 localDate.minusYears()
  • to: 对象转换: LocalDate localDate = localDateTime.toLocalDate(); 将时间日期转化为时间

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表