目录
Date
Calendar
LocalDateTime
在运用中常见的计算时间差值的案例
Date;
Carlendar:
LocalDateTime:
总结:
概述:Date代表了一个特定的时间,精确到毫秒
构造方法:
代码演示:
Date d1 = new Date();
System.out.println(d1);
System.out.println("---------------------------------------");
long date = 1000*60*60;
Date d2 = new Date(date);
System.out.println(d2);
运行结果:
常用方法:
代码演示:
public class DateDemo02 {
public static void main(String[] args) {
//创建日期对象
Date d = new Date();
//public long getTime():获取的是日期对象从1970年1月1日 00:00:00到现在的毫秒值
// System.out.println(d.getTime());
// System.out.println(d.getTime() * 1.0 / 1000 / 60 / 60 / 24 / 365 + "年");
//public void setTime(long time):设置时间,给的是毫秒值
// long time = 1000*60*60;
long time = System.currentTimeMillis();
d.setTime(time);
System.out.println(d);
}
}
运行结果:
概述:
方法:
代码演示:
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1;
int date = c.get(Calendar.DATE);
System.out.println(year + "年" + month + "月" + date + "日");
System.out.println("------------------------------------");
c.set(2050,10,10);
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH) + 1;
date = c.get(Calendar.DATE);
System.out.println(year + "年" + month + "月" + date + "日");
运行结果:
使用新时间日期API的必要性
在java8以前,或许:
但是,你必须知道,以上有关的时间日期操作对象,都是可变的、线程不安全的,同时,如果作为一个经常写过类似代码的人来说,尽管有相关对象提供某些操作,但并不能很快、很简单的就能得到最终想要的结果,如:要计算两个时间点之间相差的年、月、日、周、时、分、秒等,这些计算尽管原有API也能够实现,但原有API除了线程不安全之外,另外一个不足之处就是代码繁琐,性能低!
没错,java8出的新的时间日期API都是线程安全的,并且性能更好,代码更简洁!
其中,LocalDate、LocalTime、LocalDateTime是新API里的基础对象,绝大多数操作都是围绕这几个对象来进行的,有必要搞清楚:
LocalDate : 只含年月日的日期对象
LocalTime :只含时分秒的时间对象
LocalDateTime : 同时含有年月日时分秒的日期对象
三者的区别(LocalDate、LocalTime、 LocalDateTime ):
1.表示时间的区别
代码演示:
LocalDate localDate = LocalDate.of(2018, 1, 13);
LocalTime localTime = LocalTime.of(9, 43, 20);
LocalDateTime localDateTime = LocalDateTime.of(2018, 1, 13, 9, 43, 20);
System.out.println(localDate);
System.out.println(localTime);
System.out.println(localDateTime);
运行结果:
2.LocalDateTime对于时间的修改更加准确
兄弟们上代码:
LocalDateTime current = LocalDateTime.now();
System.out.println("当前时刻 : " + current);
System.out.println("当前年份 : " + current.getYear());
System.out.println("当前月份 : " + current.getMonth());
System.out.println("当前日份 : " + current.getDayOfMonth());
System.out.println("当前时 : " + current.getHour());
System.out.println("当前分 : " + current.getMinute());
System.out.println("当前秒 : " + current.getSecond());
修改具体的值:
LocalDateTime localDateTime = LocalDateTime.now();
//以下方法的参数都是long型,返回值都是LocalDateTime
LocalDateTime plusYearsResult = localDateTime.plusYears(2L);
LocalDateTime plusMonthsResult = localDateTime.plusMonths(3L);
LocalDateTime plusDaysResult = localDateTime.plusDays(7L);
LocalDateTime plusHoursResult = localDateTime.plusHours(2L);
LocalDateTime plusMinutesResult = localDateTime.plusMinutes(10L);
LocalDateTime plusSecondsResult = localDateTime.plusSeconds(10L);
System.out.println("当前时间是 : " + localDateTime + "\n"
+ "当前时间加2年后为 : " + plusYearsResult + "\n"
+ "当前时间加3个月后为 : " + plusMonthsResult + "\n"
+ "当前时间加7日后为 : " + plusDaysResult + "\n"
+ "当前时间加2小时后为 : " + plusHoursResult + "\n"
+ "当前时间加10分钟后为 : " + plusMinutesResult + "\n"
+ "当前时间加10秒后为 : " + plusSecondsResult + "\n"
);
//也可以以另一种方式来相加减日期,即plus(long amountToAdd, TemporalUnit unit)
// 参数1 : 相加的数量, 参数2 : 相加的单位
LocalDateTime nextMonth = localDateTime.plus(1, ChronoUnit.MONTHS);
LocalDateTime nextYear = localDateTime.plus(1, ChronoUnit.YEARS);
LocalDateTime nextWeek = localDateTime.plus(1, ChronoUnit.WEEKS);
System.out.println("now : " + localDateTime + "\n"
+ "nextYear : " + nextYear + "\n"
+ "nextMonth : " + nextMonth + "\n"
+ "nextWeek :" + nextWeek + "\n"
);
//日期的减法用法一样,在此不再举例
运行结果:
/*
* 算一下你来到这个世界多少天?
*
* 分析:
* A:键盘录入你的出生的年月日
* B:把该字符串转换为一个日期
* C:通过该日期得到一个毫秒值
* D:获取当前时间的毫秒值
* E:用D-C得到一个毫秒值
* F:把E的毫秒值转换为年
* /1000/60/60/24
*/
public class MyYearOldDemo {
public static void main(String[] args) throws ParseException {
// 键盘录入你的出生的年月日
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的出生年月日:");
String line = sc.nextLine();
// 把该字符串转换为一个日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse(line);
// 通过该日期得到一个毫秒值
long myTime = d.getTime();
// 获取当前时间的毫秒值
long nowTime = System.currentTimeMillis();
// 用D-C得到一个毫秒值
long time = nowTime - myTime;
// 把E的毫秒值转换为年
long day = time / 1000 / 60 / 60 / 24;
System.out.println("你来到这个世界:" + day + "天");
}
}
Calendar c = Calendar.getInstance();
int n = 0;
//public int get(int field):返回给定日历字段的值
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1;
int date = c.get(Calendar.DATE);
System.out.println(year + "年" + month + "月" + date + "日");
Calendar c1 = Calendar.getInstance();
c1.set(2021, 10, 25);
year = c1.get(Calendar.YEAR);
month = c1.get(Calendar.MONTH) + 1;
date = c1.get(Calendar.DATE);
System.out.println(year + "年" + month + "月" + date + "日");
while (c.before(c1)) {
n++;
c.add(Calendar.DATE, 1);
}
System.out.println(n);
//计算两个日期的日期间隔-年月日
LocalDate date1 = LocalDate.of(2020, 10, 21);
LocalDate date2 = LocalDate.of(2019, 9, 11);
//内部是用date2-date1,所以得到的结果是负数
Period period = Period.between(date1, date2);
System.out.println("相差年数 : " + period.getYears());
System.out.println("相差月数 : " + period.getMonths());
System.out.println("相差日数 : " + 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("相差的年月日分别为 : " + years + "," + months + "," + days);
1.出现的差异:
Date是JDK1.0提供的。
Calendar是在JDK1.1提供的,它替代了Date中的很多方法。
LocalDate是在JDK1.8提供的。
2.准确度的差异
Date和Calendar在实例化时会有偏移量(例如实例化"2000-1-2"),Date的year偏移量是1900,month偏移量是1(0~11月,在指定月份时要-1)。Calendar的月份有偏移量1,和Date一样,年份没有偏移量。
LocalDate(LocalTime LocalDateTime)没有偏移量。
3.底层原理:
Date和Calendar如果修改了它们的某个日期值,是直接改变其原本的值,类比对基础数据类型的修改。
LocalDate(LocalTime LocalDateTime)对它们的修改不会改变其原本的值,而是会返回一个新对象,类比String的不可变性。