文章目录
一、新增的日期类
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]