java中关于“时间和日期”小结

java1.0中有一个Data类,不过由于它的功能有限,后来java1.1又增加了Calendar类,之后Data类中的大部分方法就被弃用了。但是,Calendar的API还不够给力,它的实例是易变的,边切没有处理诸如闰秒这样的问题,后来java8中引入了java.time API,即本文重点研究的内容,。

Instant与Duration

Instant表示时间线上的某个点,即某个时刻的时间。
Duration表示两个时刻之间的时间差

方法 描述
plus/minus 在当前Instant或Duration加上/减去一个Duration
multipliedBy/dividedBy/negated 返回由当前的Duration乘以/除以给定long/取反而得到的duration

LocalDate

LocalDate是带有年、月、日的日期对象,可以使用静态方法now或of静态方法构建。

方法 描述
now / of / parse 从当前时间构建 / 从给定时间构建 / 解析字符串中的日期构建 LocalDate
plusDays / plusWeeks / plusMonths / plusYears 在当前LocalDate上加上一定的 天/星期/月/年
minusData / minusWeeks… … plus是加上一定时间,而minus是减去一定时间
withDayOfMonth / withDayOfYear / withMonth / withYear 根据给定的部分日期修改原有localDate值并返回
getDateOfWeek / getDateOfMonth / getDateOfYear 获取星期日期/月的日期/年的日期
getMonth / getMonthValue 获取Month的枚举值或月份的1~12数字
isBefore / isAfter 两个LocalDate进行比较
until 获取period,两个日期之间按照给定的chronoUnits比较计算的数值
isLeapYear 判断是否是闰年

TemporalAdjusters类提供了大量调整日期的方法,计算诸如“每个月的一地个星期二”之类的日期非常容易,如某个月的一个星期二可以向下面这样计算:

LocalDate firstTuesday = LocalDate.of(year,month,1).with(
    TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY)
);
方法 描述
next(weekday)/previous(weekday) 下一个/上一个给定的兴起日期
nextOrSame(weekday) / previousOrSame(weekday) 从给定日期起下一个/上一个给定的星期日期
dayOfWeekInMonth(n,weekday) 月份中第几个weekday
lastInMonth(weekday) 月份中最后一个weekday
firstDayOfMonth() / firstDayOfNextMonth() / firstDayOfNextYear() / 当月的第一日 / 下月的第一日 / 明年的第一日

LocalTime表示当日时刻,其挨批与LocalDate有些类似

ZonedDateTime

ZonedDateTime 表示时区时间,其对时间的操作与localDate中的方法类似
ZonedDateTime 对象的创建大致有如下几种:

  • local.atZone(zoneId)
  • ZonedDateTime.of(year,month,day,hour,minute,second,nano,zoneId)
  • instant.atZone(ZoneId.of(“UTC”))

    注:UTC代表“协调世界时间”,是不考虑夏令时的格林威治皇家天文台时间,ZoneId代表时区ID如America/New_York、Europe/Berlin

时间的解析与格式化

DateTimeFormatter类提供了三种用于打印日期/时间值的格式器:

  1. 预定义的格式器
  2. Local相关的格式器
  3. 带有定制模式的格式器

    部分预定义的格式器

    扫描二维码关注公众号,回复: 1682024 查看本文章
格式器 描述 示例
ISO_LOCAL_DATE 2018-06-15, 13:32:00
ISO_LOCAL_TIME 2018-06-15T08, 13:32:00
ISO_ORDINAL_DATE LocalDate的年和该年的第几日 1969-166
RFC_1123_DATE_TIME 用于邮件时间戳的标准,编篡与RFC822,并在RFC1123中将年份更改到4位 web,16 jul 1969 09:32:00 -0500

要使用这些标准的格式器,可以直接调用其format方法:

String formatted = DateTimeFormatter.ISO_LOCAL_DATE  .format(dateTime);

Local相关的格式化风格,可以将时间解析成AM、PM等时间格式

风格 日期 时间
SHORT 7/16/69 09:32 AM
MEDIUM Jul 16,1969 09:32:00 AM
LONG JulY 16,1969 09:32:00 AM EDT
FULL Wednesday,July 16,1969 09:32:00 AM EDT

可以使用静态方法 ofLocalizedDateofLocalizedTimeofLocalizedDateTime创建这种格式器
例如:

 DateTimeFormatter formatter = DateTimeFormatter .ofLocalizedDateTime(FormatStyle.LONG);
 String formatted = formatter.format(dateTime);//JulY 16,1969 09:32:00 AM EDT

自定义日期格式

Formatter = DateFormatter.ofPattern("E yyyy-MM-dd HH:mm:ss a");//Web 1969-07-16 09:32:00 AM

猜你喜欢

转载自blog.csdn.net/qq_31898845/article/details/80705459