java8之前的日期函数是java.util.Date,再使用过程中,体验是非常不理想的。尤其是当对创建好的时间对象进行改变的时候(日期加减等),会改变这个创建好的对象。
java.util.Date
public class DateTest {
public static void main(String[] args) {
Date date =new Date();
System.out.println(date);// Mon Aug 05 09:26:03 CST 2019
// 日期操作
date.setYear(date.getYear()+1);
System.out.println(date); //Wed Aug 05 09:26:03 CST 2020
}
}
输出相同的date对象,得到的结果却被改变了。
java.time.LocalDate、java.time.LocalDateTime;
import java.time.LocalDate;
import java.time.LocalDateTime;
public class DateTest {
public static void main(String[] args) {
LocalDate ldate =LocalDate.now();
System.out.println(ldate); // 2019-08-05
LocalDate newDate = ldate.plusDays(1);
System.out.println(ldate);// 2019-08-05
System.out.println(newDate);// 2019-08-06
LocalDateTime ldt =LocalDateTime.now();
System.out.println(ldt); // 2019-08-05T09:32:04.273
}
}
观察二者的API会发现java.time.LocalDate是一个final类。
日期类LocalDate
设置固定日期,并对该日期进行操作。
@Test
public void test(){
LocalDate date = LocalDate.of(2017, 11, 23);
System.out.println("年份:"+date.getYear());
Month month = date.getMonth();
System.out.println("月份(单词):"+month);
int monthValue = date.getMonthValue();
System.out.println("月份(数字)"+monthValue);
System.out.println("多少号:"+date.getDayOfMonth());
System.out.println("返回由此日期表示的月份的长度:"+date.lengthOfMonth());
System.out.println("返回由此日期表示的年份的长度:"+date.lengthOfYear());
DayOfWeek dayOfWeek = date.getDayOfWeek();
System.out.println("星期几(单词):"+dayOfWeek);
System.out.println("星期几(数字):"+dayOfWeek.getValue());
System.out.println("一年中的第几天:"+date.getDayOfYear());
System.out.println("是否是闰年:"+ date.isLeapYear());
LocalDate a = LocalDate.of(2012, 6, 30);
System.out.println("检查此日期是否在指定日期之后:"+ date.isAfter(a));
System.out.println("检查此日期是否在指定日期之前:"+date.isBefore(a));
System.out.println("检查此日期是否等于指定的日期。"+date.isEqual(a));
System.out.println("将日期输出:"+date.toString());
}
年份:2017
月份(单词):NOVEMBER
月份(数字)11
多少号:23
返回由此日期表示的月份的长度:30
返回由此日期表示的年份的长度:365
星期几(单词):THURSDAY
星期几(数字):4
一年中的第几天:327
是否是闰年:false
检查此日期是否在指定日期之后:true
检查此日期是否在指定日期之前:false
检查此日期是否等于指定的日期。false
将日期输出:2017-11-23
时间类LocalTime
对当前时间操作(使用工厂方法 now 从系统时钟中获取当前的日期)
public static void main(String[] args) {
LocalTime now = LocalTime.now();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
System.out.println("小时:" + hour + '\t' + "分钟:" + minute + '\t' + "秒:" + second);
System.out.println(now.toString());
}
日期类时间类格式化
将字符串转为日期或时分秒(注意字符串参数格式,格式不对java.time.format.DateTimeParseException)
public static void main(String[] args) {
String date = "2019-08-05";
String time = "15:51:30";
LocalDate localDate = LocalDate.parse(date);
LocalTime localTime = LocalTime.parse(time);
System.out.println(localDate);
System.out.println(localTime);
}
2019-08-05
15:51:3022
//时间转字符串格式化
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
String dateTime = LocalDateTime.now(ZoneOffset.of("+8")).format(formatter);
//字符串转时间
String dateTimeStr = "2018-07-28 14:11:15";
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, df);
日期时间类LocalDateTime
public static void main(String[] args) {
LocalDateTime ldt =LocalDateTime.now();
System.out.println(ldt);
}
2019-08-05T10:08:23.545
LocalDate、LocalTime、LocalDateTime三者之间转换
public static void main(String[] args) {
String date = "2019-08-17";
String time = "15:51:30";
LocalDate localDate = LocalDate.parse(date);
LocalTime localTime = LocalTime.parse(time);
LocalDateTime localDateTime = LocalDateTime.of(2017, 11, 23, 16, 01, 30, 888);
LocalDateTime localDateTime1 = LocalDateTime.of(localDate, localTime);
// localDateTime-->LocalDate,LocalTime
LocalDate localDate1 = localDateTime.toLocalDate();
LocalTime localTime1 = localDateTime.toLocalTime();
// LocalDate,LocalTime --> LocalDateTime
LocalDateTime localDateTime2 = localDate.atTime(16, 02, 30);
LocalDateTime localDateTime3 = localTime.atDate(localDate);
System.out.println("localDate:"+localDate);
System.out.println("localTime:"+localTime);
System.out.println("localDateTime:"+localDateTime);
System.out.println("localDateTime1:"+localDateTime1);
System.out.println("localDate1:"+localDate1);
System.out.println("localTime1:"+localTime1);
}
localDate:2019-08-17
localTime:15:51:30
localDateTime:2017-11-23T16:01:30.000000888
localDateTime1:2019-08-17T15:51:30
localDate1:2017-11-23
localTime1:16:01:30.000000888
Period获取两个日期之间的日期差
public static void main(String[] args) {
Period p = Period.between(LocalDate.of(2014, 3, 18),LocalDate.now());
System.out.printf("目标日期距离今天的时间差:%d 年 %d 个月 %d 天\n", p.getYears(), p.getMonths(), p.getDays());
}
Duration获取时间差
Duration d1 = Duration.between(time1, time2);
Duration d1 = Duration.between(dateTime1, dateTime2);
Duration d2 = Duration.between(instant1, instant2);
获取秒数和毫秒数
//获取秒数
Long second = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
//获取毫秒数
Long milliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
获取时间戳
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);
//将localDateTime转换成时间戳
System.out.println("localDateTime:"+java.sql.Timestamp.valueOf(localDateTime).getTime());
//使用System获取时间戳
System.out.println("system:"+System.currentTimeMillis());
}
2019-08-05T10:43:15.328
localDateTime:1564972995328
system:1564972995332
时间戳转换成LocalDateTime
Long timestamp = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
LocalDateTime time2 =LocalDateTime.ofEpochSecond(timestamp/1000,0,ZoneOffset.ofHours(8));