Java常用日期类使用
一、java.util.Date
1.1 时区
GMT(Greenwich Mean Time)代表格林尼治标准时间,而CST却同时可以代表如下4个不同的时区:
Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00
1.2 基本使用
1.2.1 初始化
Date date = new Date();
Date date1 = new Date(1000L);
// 默认创建一个本地时间, long类型
// Date date = new Date(System.currentTimeMillis());
// 从1970-1-1 0:0:0开始
1.2.2 输出时间
System.out.println(date1);
// 打印出北京时间 Thu Jan 01 08:00:01 CST 1970
System.out.println(date1.toGMTString());
// 打印出格林标准时间 1 Jan 1970 00:00:01 GMT
1.2.3 输出时差
// 返回与格林时间的时差, 以分钟计时, 正好是8个小时, 此函数输出-480 则北京时间-480分钟等于格林时间
date1.getTimezoneOffset();
1.2.4 打印毫秒数
long m = date1.getTime();
// 打印出date到1970年1月1日的毫秒数
System.out.println("m = " + m);
1.2.5 比较时间
// 比较时间
// 返回boolean类型
date.after(date1);
date.before(date1);
// 返回-1 1 0
date.compareTo(date1);
1.3 java.util.Date的子类
1.3.1 java.sql.Date的使用
// sql包的date类, 接收一个毫秒值
java.sql.Date sqldate = new java.sql.Date(1000L);
// 输出一个这样的字符串 1970-01-01
System.out.println(sqldate);
// 转换成格林时间和util中date输出一样
System.out.println(sqldate.toGMTString());
1.3.2 java.sql.Timestamp使用
java.sql.Timestamp timestamp = new Timestamp(2000L);
// 返回的均为本地时间
//1970-01-01 08:00:02.0
//1970-01-01T08:00:02
System.out.println(timestamp);
System.out.println(timestamp.toLocalDateTime());
// 返回一个格林瞬时时间
// 1970-01-01T00:00:02Z
System.out.println(timestamp.toInstant());
1.3.3 java.sql.Time使用
java.sql.Time time = new Time(3000L);
// 返回一个不带日期的本地时间 08:00:03
System.out.println(time);
1.4 SimpleDateFormat使用
Date date = new Date();
// 指定格式输出时间
// yyyy 年
MM 月
dd 日
hh 12小时制
HH 24小时制0-23
mm 分
ss 秒
SSS 毫秒
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
System.out.println(dateFormat.format(date));
// 将指定格式的字符串转化成Date
// "2018-05-26 09:03:22.658"
DateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
try {
date = dateFormat1.parse("2018-05-26 09:03:22.658");
// 输出 date = Sat May 26 09:03:22 CST 2018
System.out.println("date = " + date);
} catch (ParseException e) {
e.printStackTrace();
}
1.5 Calender使用
GregorianCalendar类中存放了各国的标准日历
Calendar calendar = new GregorianCalendar();
// 设置日历时间
calendar.set(Calendar.YEAR, 2019);
calendar.set(Calendar.MONTH, 5);
calendar.set(Calendar.DAY_OF_MONTH, 26);
//使用Date类设置calendar时间
calendar.setTime(new Date());
//取得日历时间 calendar.getTime(); 返回一个Date对象
// 输出Wed Jun 26 12:58:42 CST 2019
System.out.println(calendar.getTime().toString());
//使用日历取得时间偏移
// 输出Tue Jun 26 12:58:42 CST 2029
calendar.add(Calendar.YEAR, 10);
System.out.println(calendar.getTime().toString());
二、java8 新特性—java.time包 时间处理类
Java处理日期、日历和时间的不足之处:将java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限。
Java 8推出了全新的日期时间API。不同于老版本,新API基于ISO标准日历系统,java.time包下的所有类都是不可变类型而且线程安全。
ZoneId:时区ID,用来确定Instant和LocalDateTime互相转换的规则。
Instant:瞬时实例,用来表示时间线上的一个点(瞬时)。
LocalDate:表示没有时区的日期, 不包含具体时间,LocalDate是不可变并且线程安全的。
LocalTime:表示没有时区的时间, 不包含日期,LocalTime是不可变并且线程安全的。
LocalDateTime:表示没有时区的日期时间,组合了日期和时间,LocalDateTime是不可变并且线程安全的。
ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差。
Clock:用于访问当前时刻、日期、时间,用到时区。
Duration:用秒和纳秒表示时间的数量(长短),用于计算两个日期的“时间”间隔。
Period:用于计算两个“日期”间隔。
其中,LocalDate、LocalTime、LocalDateTime是新API里的基础对象。新API还引入了ZoneOffSet和ZoneId类,使得解决时区问题更为简便。解析、格式化时间的DateTimeFormatter类也全部重新设计。
2.1 常用方法使用
2.1.1 获取当前时间
/**
* 获取当前时间
*/
@Test
public void localDateCreate() {
LocalDate yyyyMMdd = LocalDate.now();
LocalTime HHmmssSSS = LocalTime.now();
LocalDateTime yyyyMMddHHmmssSSS = LocalDateTime.now();
System.out.println("年月日: " + yyyyMMdd);
System.out.println("时分秒毫秒: " + HHmmssSSS);
System.out.println("年月日时分秒毫秒: " + yyyyMMddHHmmssSSS);
//输出:
// 年月日: 2020-10-16
// 时分秒毫秒: 09:55:49.448
// 年月日时分秒毫秒: 2020-10-16T09:55:49.448
}
2.1.2 设置自定义日期
/**
* 设置自定义日期
*/
@Test
public void setDate() {
LocalDate yyyyMMdd = LocalDate.of(2020, 10, 15);
LocalTime HHmmssSSS = LocalTime.of(10, 10, 10);
LocalDateTime yyyyMMddHHmmssSSS = LocalDateTime.of(2020, 10, 15, 10, 10);
System.out.println("自定义的年月日: " + yyyyMMdd);
System.out.println("自定义时分秒毫秒: " + HHmmssSSS);
System.out.println("自定义年月日时分秒毫秒: " + yyyyMMddHHmmssSSS);
//输出:
// 自定义的年月日: 2020-10-15
// 自定义时分秒毫秒: 10:10:10
// 自定义年月日时分秒毫秒: 2020-10-15T10:10
}
2.1.3 日期时间的加减
/**
* 日期时间的加减
*/
@Test
public void lessOrAddDate() {
System.out.println("########################### >>> LocalDate <<< ###########################");
LocalDate yyyyMMdd = LocalDate.now();
System.out.println("LocalDate yyyyMMdd 当前时间: " + yyyyMMdd);
System.out.println("*********LocalDate yyyyMMdd 添加 操作*********");
LocalDate addOneDay = yyyyMMdd.plusDays(1L); //添加一日
LocalDate addOneMonths = yyyyMMdd.plusMonths(1L);//添加一月
LocalDate addOneYears = yyyyMMdd.plusYears(1L);//添加一年
LocalDate addOneWeeks = yyyyMMdd.plusWeeks(1L);//添加一周
System.out.println("LocalDate yyyyMMdd 添加一日: " + addOneDay);
System.out.println("LocalDate yyyyMMdd 添加一月: " + addOneMonths);
System.out.println("LocalDate yyyyMMdd 添加一年: " + addOneYears);
System.out.println("LocalDate yyyyMMdd 添加一周: " + addOneWeeks);
System.out.println("*********LocalDate yyyyMMdd 减 操作*********");
LocalDate delOneDay = yyyyMMdd.minusDays(1L); //减去一日
LocalDate delOneMonths = yyyyMMdd.minusMonths(1L);//减去一月
LocalDate delOneYears = yyyyMMdd.minusYears(1L);//减去一年
LocalDate delOneWeeks = yyyyMMdd.minusWeeks(1L);//减去一周
System.out.println("LocalDate yyyyMMdd 减去一日: " + delOneDay);
System.out.println("LocalDate yyyyMMdd 减去一月: " + delOneMonths);
System.out.println("LocalDate yyyyMMdd 减去一年: " + delOneYears);
System.out.println("LocalDate yyyyMMdd 减去一周: " + delOneWeeks);
System.out.println("########################### >>> LocalTime <<< ###########################");
LocalTime HHmmssSSS = LocalTime.now();
System.out.println("LocalTime HHmmssSSS 当前时间: " + HHmmssSSS);
System.out.println("*********LocalTime HHmmssSSS 添加 操作*********");
LocalTime addOneHours = HHmmssSSS.plusHours(1L); //添加1小时
LocalTime addOneMinutes = HHmmssSSS.plusMinutes(1L);//添加1分钟
LocalTime addOneSeconds = HHmmssSSS.plusSeconds(1L);//添加1秒
LocalTime addOneNanos = HHmmssSSS.plusNanos(1L);//添加1纳秒
System.out.println("LocalTime HHmmssSSS 添加1小时: " + addOneHours);
System.out.println("LocalTime HHmmssSSS 添加1分钟: " + addOneMinutes);
System.out.println("LocalTime HHmmssSSS 添加1秒: " + addOneSeconds);
System.out.println("LocalTime HHmmssSSS 添加1纳秒: " + addOneNanos);
System.out.println("*********LocalTime HHmmssSSS 减 操作*********");
LocalTime delOneHours = HHmmssSSS.minusHours(1L); //减去1小时
LocalTime delOneMinutes = HHmmssSSS.minusMinutes(1L);//减去1分钟
LocalTime delOneSeconds = HHmmssSSS.minusSeconds(1L);//减去1秒
LocalTime delOneNanos = HHmmssSSS.minusNanos(1L);//减去1纳秒
System.out.println("LocalTime HHmmssSSS 减去1小时: " + delOneHours);
System.out.println("LocalTime HHmmssSSS 减去1分钟: " + delOneMinutes);
System.out.println("LocalTime HHmmssSSS 减去1秒: " + delOneSeconds);
System.out.println("LocalTime HHmmssSSS 减去1纳秒: " + delOneNanos);
System.out.println("########################### >>> LocalDateTime <<< ###########################");
LocalDateTime yyyyMMddHHmmssSSS = LocalDateTime.now();
System.out.println("LocalDateTime yyyyMMddHHmmssSSS 当前时间: " + yyyyMMddHHmmssSSS);
System.out.println("*********LocalDateTime yyyyMMddHHmmssSSS 添加 操作*********");
LocalDateTime localDateTimeaddOneDay = yyyyMMddHHmmssSSS.plusDays(1L); //添加一日
LocalDateTime localDateTimeaddOneMonths = yyyyMMddHHmmssSSS.plusMonths(1L);//添加一月
LocalDateTime localDateTimeaddOneYears = yyyyMMddHHmmssSSS.plusYears(1L);//添加一年
LocalDateTime localDateTimeaddOneWeeks = yyyyMMddHHmmssSSS.plusWeeks(1L);//添加一周
LocalDateTime localDateTimeaddOneHours = yyyyMMddHHmmssSSS.plusHours(1L); //添加1小时
LocalDateTime localDateTimeaddOneMinutes = yyyyMMddHHmmssSSS.plusMinutes(1L);//添加1分钟
LocalDateTime localDateTimeaddOneSeconds = yyyyMMddHHmmssSSS.plusSeconds(1L);//添加1秒
LocalDateTime localDateTimeaddOneNanos = yyyyMMddHHmmssSSS.plusNanos(1L);//添加1纳秒
System.out.println("LocalDateTime yyyyMMddHHmmssSSS 添加一日: " + localDateTimeaddOneDay);
System.out.println("LocalDateTime yyyyMMddHHmmssSSS 添加一月: " + localDateTimeaddOneMonths);
System.out.println("LocalDateTime yyyyMMddHHmmssSSS 添加一年: " + localDateTimeaddOneYears);
System.out.println("LocalDateTime yyyyMMddHHmmssSSS 添加一周: " + localDateTimeaddOneWeeks);
System.out.println("LocalDateTime yyyyMMddHHmmssSSS 添加1小时: " + localDateTimeaddOneHours);
System.out.println("LocalDateTime yyyyMMddHHmmssSSS 添加1分钟: " + localDateTimeaddOneMinutes);
System.out.println("LocalDateTime yyyyMMddHHmmssSSS 添加1秒: " + localDateTimeaddOneSeconds);
System.out.println("LocalDateTime yyyyMMddHHmmssSSS 添加1纳秒: " + localDateTimeaddOneNanos);
System.out.println("*********LocalDateTime yyyyMMddHHmmssSSS 减 操作*********");
LocalDateTime localDateTimedelOneDay = yyyyMMddHHmmssSSS.minusDays(1L); //减去一日
LocalDateTime localDateTimedelOneMonths = yyyyMMddHHmmssSSS.minusMonths(1L);//减去一月
LocalDateTime localDateTimedelOneYears = yyyyMMddHHmmssSSS.minusYears(1L);//减去一年
LocalDateTime localDateTimedelOneWeeks = yyyyMMddHHmmssSSS.minusWeeks(1L);//减去一周
LocalDateTime localDateTimedelOneHours = yyyyMMddHHmmssSSS.minusHours(1L); //减去1小时
LocalDateTime localDateTimedelOneMinutes = yyyyMMddHHmmssSSS.minusMinutes(1L);//减去1分钟
LocalDateTime localDateTimedelOneSeconds = yyyyMMddHHmmssSSS.minusSeconds(1L);//减去1秒
LocalDateTime localDateTimedelOneNanos = yyyyMMddHHmmssSSS.minusNanos(1L);//减去1纳秒
System.out.println("LocalDateTime yyyyMMddHHmmssSSS 减去一日: " + localDateTimedelOneDay);
System.out.println("LocalDateTime yyyyMMddHHmmssSSS 减去一月: " + localDateTimedelOneMonths);
System.out.println("LocalDateTime yyyyMMddHHmmssSSS 减去一年: " + localDateTimedelOneYears);
System.out.println("LocalDateTime yyyyMMddHHmmssSSS 减去一周: " + localDateTimedelOneWeeks);
System.out.println("LocalDateTime yyyyMMddHHmmssSSS 减去1小时: " + localDateTimedelOneHours);
System.out.println("LocalDateTime yyyyMMddHHmmssSSS 减去1分钟: " + localDateTimedelOneMinutes);
System.out.println("LocalDateTime yyyyMMddHHmmssSSS 减去1秒: " + localDateTimedelOneSeconds);
System.out.println("LocalDateTime yyyyMMddHHmmssSSS 减去1纳秒: " + localDateTimedelOneNanos);
/*
输出:
########################### >>> LocalDate <<< ###########################
LocalDate yyyyMMdd 当前时间: 2020-10-16
*********LocalDate yyyyMMdd 添加 操作*********
LocalDate yyyyMMdd 添加一日: 2020-10-17
LocalDate yyyyMMdd 添加一月: 2020-11-16
LocalDate yyyyMMdd 添加一年: 2021-10-16
LocalDate yyyyMMdd 添加一周: 2020-10-23
*********LocalDate yyyyMMdd 减 操作*********
LocalDate yyyyMMdd 减去一日: 2020-10-15
LocalDate yyyyMMdd 减去一月: 2020-09-16
LocalDate yyyyMMdd 减去一年: 2019-10-16
LocalDate yyyyMMdd 减去一周: 2020-10-09
########################### >>> LocalTime <<< ###########################
LocalTime HHmmssSSS 当前时间: 10:20:22.164
*********LocalTime HHmmssSSS 添加 操作*********
LocalTime HHmmssSSS 添加1小时: 11:20:22.164
LocalTime HHmmssSSS 添加1分钟: 10:21:22.164
LocalTime HHmmssSSS 添加1秒: 10:20:23.164
LocalTime HHmmssSSS 添加1纳秒: 10:20:22.164000001
*********LocalTime HHmmssSSS 减 操作*********
LocalTime HHmmssSSS 减去1小时: 09:20:22.164
LocalTime HHmmssSSS 减去1分钟: 10:19:22.164
LocalTime HHmmssSSS 减去1秒: 10:20:21.164
LocalTime HHmmssSSS 减去1纳秒: 10:20:22.163999999
########################### >>> LocalDateTime <<< ###########################
LocalDateTime yyyyMMddHHmmssSSS 当前时间: 2020-10-16T10:20:22.165
*********LocalDateTime yyyyMMddHHmmssSSS 添加 操作*********
LocalDateTime yyyyMMddHHmmssSSS 添加一日: 2020-10-17T10:20:22.165
LocalDateTime yyyyMMddHHmmssSSS 添加一月: 2020-11-16T10:20:22.165
LocalDateTime yyyyMMddHHmmssSSS 添加一年: 2021-10-16T10:20:22.165
LocalDateTime yyyyMMddHHmmssSSS 添加一周: 2020-10-23T10:20:22.165
LocalDateTime yyyyMMddHHmmssSSS 添加1小时: 2020-10-16T11:20:22.165
LocalDateTime yyyyMMddHHmmssSSS 添加1分钟: 2020-10-16T10:21:22.165
LocalDateTime yyyyMMddHHmmssSSS 添加1秒: 2020-10-16T10:20:23.165
LocalDateTime yyyyMMddHHmmssSSS 添加1纳秒: 2020-10-16T10:20:22.165000001
*********LocalDateTime yyyyMMddHHmmssSSS 减 操作*********
LocalDateTime yyyyMMddHHmmssSSS 减去一日: 2020-10-15T10:20:22.165
LocalDateTime yyyyMMddHHmmssSSS 减去一月: 2020-09-16T10:20:22.165
LocalDateTime yyyyMMddHHmmssSSS 减去一年: 2019-10-16T10:20:22.165
LocalDateTime yyyyMMddHHmmssSSS 减去一周: 2020-10-09T10:20:22.165
LocalDateTime yyyyMMddHHmmssSSS 减去1小时: 2020-10-16T09:20:22.165
LocalDateTime yyyyMMddHHmmssSSS 减去1分钟: 2020-10-16T10:19:22.165
LocalDateTime yyyyMMddHHmmssSSS 减去1秒: 2020-10-16T10:20:21.165
LocalDateTime yyyyMMddHHmmssSSS 减去1纳秒: 2020-10-16T10:20:22.164999999
*/
}
2.1.4 修改时间值
/**
* 将年、月、日等修改为指定的值,并返回新的日期(时间)对象
* 析: 其效果与时间日期相加减差不多,如今天是2018-01-13,要想变为2018-01-20有两种方式
* a. localDate.plusDays(20L) -> 相加指定的天数
* b. localDate.withDayOfYear(20) -> 直接指定到哪一天
*/
@Test
public void directDesignationTime() {
LocalDate yyyyMMdd = LocalDate.now();
System.out.println("LocalDate yyyyMMdd 当前时间: " + yyyyMMdd);
LocalDate addDay = yyyyMMdd.plusDays(4);
System.out.println("LocalDate yyyyMMdd 添加4天后的日期: " + addDay);
LocalDate directDesignationDate = yyyyMMdd.withDayOfMonth(20);
System.out.println("LocalDate yyyyMMdd 直接指定到当月第几号: " + directDesignationDate);
LocalDate directDesignationYearDate = yyyyMMdd.withDayOfYear(20);
System.out.println("LocalDate yyyyMMdd 直接指定到当年第几天: " + directDesignationYearDate);
LocalDate directDesignationYear = yyyyMMdd.withYear(2000);
System.out.println("LocalDate yyyyMMdd 当前时间直接指定年份: " + directDesignationYear);
LocalDate directDesignationMonth = yyyyMMdd.withMonth(6);
System.out.println("LocalDate yyyyMMdd 当前时间直接指定月份: " + directDesignationMonth);
}
2.1.5 获取日期(年月日周时分秒)
/**
* 获取日期的年月日周时分秒
*/
@Test
public void getDateInfo() {
LocalDateTime yyyyMMddHHmmssSSS = LocalDateTime.now();
//本年当中第多少天
int dayOfYear = yyyyMMddHHmmssSSS.getDayOfYear();
//本月当中第多少天
int dayOfMonth = yyyyMMddHHmmssSSS.getDayOfMonth();
DayOfWeek dayOfWeek = yyyyMMddHHmmssSSS.getDayOfWeek();
//本周中星期几
int value = dayOfWeek.getValue();
System.out.println("今天是" + yyyyMMddHHmmssSSS + "\n"
+ "本年当中第" + dayOfYear + "天" + "\n"
+ "本月当中第" + dayOfMonth + "天" + "\n"
+ "本周中星期" + value + "-即" + dayOfWeek + "\n");
int year = yyyyMMddHHmmssSSS.getYear(); //年
Month month = yyyyMMddHHmmssSSS.getMonth(); //月
int monthValue = yyyyMMddHHmmssSSS.getMonthValue(); //直接获取
int dayOfMonth1 = yyyyMMddHHmmssSSS.getDayOfMonth(); //日
int hour = yyyyMMddHHmmssSSS.getHour(); //时
int minute = yyyyMMddHHmmssSSS.getMinute(); //分
int second = yyyyMMddHHmmssSSS.getSecond(); //秒
int nano = yyyyMMddHHmmssSSS.getNano(); //纳秒
System.out.println("今天是" + yyyyMMddHHmmssSSS + "\n"
+ "年 : " + year + "\n"
+ "月 : " + monthValue + "-即 " + month + "\n"
+ "日 : " + dayOfMonth1 + "\n"
+ "时 : " + hour + "\n"
+ "分 : " + minute + "\n"
+ "秒 : " + second + "\n"
+ "纳秒 : " + nano + "\n"
);
}
2.1.6 时间日期前后的比较与判断
/**
* 时间日期前后的比较与判断
*/
@Test
public void isBefore() {
LocalDate now = LocalDate.now();
LocalDate of = LocalDate.of(2020, 10, 15);
//判断of 是否在 now 时间之前
boolean before = of.isBefore(now);
System.out.println("判断of 是否在 now 时间之前:" + before);
//判断of 是否在 now 时间之后
boolean after = of.isAfter(now);
System.out.println("判断of 是否在 now 时间之后:" + after);
//判断两个时间是否相等
boolean equal = of.isEqual(now);
System.out.println("判断两个时间是否相等:" + equal);
//判断是否为闰年
boolean leapYear = now.isLeapYear();
System.out.println("判断是否为闰年:" + leapYear);
//输出 判断of 是否在 now 时间之前:true
判断of 是否在 now 时间之后:false
判断两个时间是否相等:false
判断是否为闰年:true
}
2.1.7 时钟:clock()
/**
* java8时钟:clock()
*/
@Test
public void clock() {
//返回当前时间,根据系统时间和UTC
Clock clock = Clock.systemUTC();
System.out.println(clock);
// 运行结果: SystemClock[Z]
}
2.1.8 时间戳
/**
* 时间戳
* 事实上Instant就是java8以前的Date,
* 可以使用以下两个类中的方法在这两个类型之间进行转换,
* 比如Date.from(Instant)就是用来把Instant转换成java.util.date的,
* 而new Date().toInstant()就是将Date转换成Instant的
*/
@Test
public void instant() {
Instant instant = Instant.now();
System.out.println(instant);
Date date = Date.from(instant);
Instant instant2 = date.toInstant();
System.out.println(date);
System.out.println(instant2);
//输出 2022-05-21T08:30:07.177Z
Sat May 21 16:30:07 CST 2022
2022-05-21T08:30:07.177Z
}
2.1.9 计算时间、日期间隔
/**
* 计算时间、日期间隔
* Duration: 用于计算两个“时间”间隔
* Period: 用于计算两个“日期”间隔
*/
@Test
public void durationOrPeriod() {
LocalDateTime now = LocalDateTime.now();
System.out.println("duration当前时间:" + now);
LocalDateTime of = LocalDateTime.of(2020, 10, 15, 10, 24);
System.out.println("duration自定义时间:" + of);
//Duration:用于计算两个“时间”间隔
Duration duration = Duration.between(now, of);
System.out.println(now + " 与 " + of + " 间隔 " + "\n"
+ " 天 :" + duration.toDays() + "\n"
+ " 时 :" + duration.toHours() + "\n"
+ " 分 :" + duration.toMinutes() + "\n"
+ " 毫秒 :" + duration.toMillis() + "\n"
+ " 纳秒 :" + duration.toNanos() + "\n"
);
LocalDate nowDate = LocalDate.now();
System.out.println("period当前时间:" + now);
LocalDate OfDate = LocalDate.of(2020, 10, 15);
System.out.println("period自定义时间:" + of);
//Period:用于计算两个“日期”间隔
Period period = Period.between(nowDate, OfDate);
System.out.println("Period相差年数 : " + period.getYears());
System.out.println("Period相差月数 : " + period.getMonths());
System.out.println("Period相差日数 : " + period.getDays());
//还可以这样获取相差的年月日
System.out.println("-------------------------------");
long years = period.get(ChronoUnit.YEARS);
long months = period.get(ChronoUnit.MONTHS);
long days = period.get(ChronoUnit.DAYS);
System.out.println("Period相差的年月日分别为 : " + years + "," + months + "," + days);
//注意,当获取两个日期的间隔时,并不是单纯的年月日对应的数字相加减,而是会先算出具体差多少天,在折算成相差几年几月几日的
/*
输出:
duration当前时间:2020-10-16T14:41:40.235
duration自定义时间:2020-10-15T10:24
2020-10-16T14:41:40.235 与 2020-10-15T10:24 间隔
天 :-1
时 :-28
分 :-1697
毫秒 :-101860235
纳秒 :-101860235000000
period当前时间:2020-10-16T14:41:40.235
period自定义时间:2020-10-15T10:24
Period相差年数 : 0
Period相差月数 : 0
Period相差日数 : -1
-------------------------------
Period相差的年月日分别为 : 0,0,-1
*/
}
2.2 日期格式化
2.2.1 LocalDate转String
/**
* 将时间对象转化为日期字符串
* 时间日期的格式化(格式化后返回的类型是String) 自定格式 使用 DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS");
* 注:自定义转化的格式一定要与日期类型对应
* LocalDate只能设置仅含年月日的格式
* LocalTime只能设置仅含时分秒的格式
* LocalDateTime可以设置含年月日时分秒的格式
*/
@Test
public void formatter1() {
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS");
String format = dtf.format(now);
System.out.println(format);
//输出: 2020-10-16 14:41:01:086
}
2.2.2 String转LocalDate
/**
* 将时间字符串形式转化为日期对象
*
* 注:格式的写法必须与字符串的形式一样
* 2018-01-13 21:27:30 对应 yyyy-MM-dd HH:mm:ss
* 20180113213328 对应 yyyyMMddHHmmss
* 否则会报运行时异常!
*
* 但要记住:得到的最终结果都是类似2018-01-13T21:27:30的格式
* 因为在输出LocalDateTime对象时,会调用其重写的toString方法。
*/
@Test
public void formatter2() {
String dateStr = "2020-11-12";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate formatterDate = LocalDate.parse(dateStr, dtf);
System.out.println(formatterDate);
//输出 2020-11-12
}
2.2.3 将时间日期对象转为格式化后的时间日期对象
/**
* 将时间日期对象转为格式化后的时间日期对象
*/
@Test
public void formatter3() {
//新的格式化API中,格式化后的结果都默认是String,有时我们也需要返回经过格式化的同类型对象
LocalDateTime ldt1 = LocalDateTime.now();
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String temp = dtf1.format(ldt1);
System.out.println(temp);
LocalDateTime formatedDateTime = LocalDateTime.parse(temp, dtf1);
System.out.println(formatedDateTime);
//输出 2022-05-21 16:53:02
2022-05-21T16:23:39
}
2.3 转换
2.3.1 localDate转date
/**
* localDate 转 date
* localDateTime 转 date
*
*/
@Test
public void localDateToDate() {
LocalDate now = LocalDate.now();
Date from = Date.from(now.atStartOfDay(ZoneOffset.systemDefault()).toInstant());
LocalDateTime localDateTime = LocalDateTime.now();
Date date = Date.from(localDateTime.atZone(ZoneOffset.ofHours(8)).toInstant());
System.out.println(from);
System.out.println(date);
//输出 Sat May 21 00:00:00 CST 2022
Sat May 21 16:25:38 CST 2022
}
2.3.2 date转localDate
/**
* date 转 localDate
* date 转 localDateTime
*
*/
@Test
public void dateToLocalDate() {
Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneOffset.systemDefault()).toLocalDate();
System.out.println(localDate);
LocalDateTime localDateTime = date.toInstant().atZone(ZoneOffset.systemDefault()).toLocalDateTime();
System.out.println(localDateTime);
//输出 2022-05-21
2022-05-21T16:26:42.636
}
2.3.3 localDate转时间戳
/**
* LocalDate 转 时间戳
* LocalDateTime 转 时间戳
*/
@Test
public void localDateToInstant() {
LocalDate localDate = LocalDate.now();
long instant = localDate.atStartOfDay(ZoneOffset.systemDefault()).toInstant().toEpochMilli();
System.out.println(instant);
LocalDateTime now = LocalDateTime.now();
long instant1 = now.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
System.out.println(instant1);
//输出 1653062400000
1653121639197
}
2.3.4 时间戳转localDate
/**
* 时间戳 转 LocalDate
* 时间戳 转 LocalDateTime
*/
@Test
public void instantToLocalDate() {
long time = new Date().getTime();
LocalDateTime localDateTime = Instant.ofEpochMilli(time).atZone(ZoneOffset.systemDefault()).toLocalDateTime();
System.out.println(localDateTime);
LocalDate localDate = Instant.ofEpochMilli(time).atZone(ZoneOffset.systemDefault()).toLocalDate();
System.out.println(localDate);
//输出 2022-05-21T16:27:55.876
2022-05-21
}
2.3.5 localDate转String
/**
* localDate 转 String
* LocalDateTime 转 String
*/
@Test
public void localDateToString() {
//localDate转换成String
LocalDate localDate = LocalDate.now();
//按照yyyyMMdd样式进行更改
String format1 = localDate.format(DateTimeFormatter.BASIC_ISO_DATE);
System.out.println(format1);
//按照yyyy-MM-dd样式进行更改
String format2 = localDate.format(DateTimeFormatter.ISO_DATE);
System.out.println(format2);
//自定义样式进行更改
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
String format3 = localDate.format(pattern);
System.out.println(format3);
//LocalTime类型转换为String类型
//按照xx:xx:xx.xx样式进行转换
LocalTime localTime = LocalTime.now();
String format4 = localTime.format(DateTimeFormatter.ISO_TIME);
System.out.println(format4);
//按照自定义样式进行转换
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss");
String format5 = localTime.format(formatter);
System.out.println(format5);
//LocalDateTime类型转换为String类型
LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
String format6 = localDateTime.format(formatter2);
System.out.println(format6);
//输出 20220521
2022-05-21
2022年05月21日
16:40:36.817
04:40:36
2022-05-21 04:40:36
}
参考文章
- java8新添加的时间类简单使用