7.1 Java包管理器
- 包(package)的导入
为了管理更多的代码互不侵犯,所以采用一个叫“包管理”的机制来管理代码,简单来说就是把不同的Java代码放在不同的文件夹里,这个文件夹就是“包(package)”。对于使用不同包的代码,得需要先导入这个包。
String,int,double,long这些属于基础类型,所以不需要导入包。
在Java当中导入包语句就是 import 包名+类名; ,包名+类名组成了完整的包路径。
注意:这一句代码是在类文件的最前面
LocalDate这个类的完整包路径是java.time.LocalDate,代码如下:
import java.time.LocalDate; public class DateTest { public static void main(String[] args) { // 得到当前的完整时间 LocalDate now = LocalDate.now(); // 打印出时间 System.out.println(now.toString()); } }
- 日期时间和字符串的转化
刚才代码输出的结果是 2021-08-18,而我们习惯看到的是这样的格式: 年-月-日,我们需要借助一个日期格式化类来帮助我们做格式化,这个类就是DateTimeFormatter,它的完整包路径是java.time.format.DateTimeFormatter,需要先导入一下。
import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class DateTest5 { public static void main(String[] args) { LocalDate time = LocalDate.now(); // 打印默认的时间数据 System.out.println(time.toString()); // 创建一个格式化方式 DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy年MM月dd"); // 执行时间的格式化处理,得到期望格式的时间字符串 String timeStr = df.format(time); // 打印时间 System.out.println(timeStr); } }
如果想得到2021/08/18,可以通过下面代码实现
import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class DateTest6 { public static void main(String[] args) { LocalDate time = LocalDate.now(); // 创建一个格式化方式 DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy/MM/dd"); // 执行时间的格式化处理,得到期望格式的时间字符串 String timeStr = df.format(time); // 打印时间 System.out.println(timeStr); } }
- 获取日期时间的具体值
从一个日期得到年份,月份,日,星期几等数据
import java.time.LocalDate; public class DateTest7 { public static void main(String[] args) { LocalDate time = LocalDate.now(); // 得到当前时间所在年 int year = time.getYear(); System.out.println("当前年份 " + year); // 得到当前时间所在月 int month = time.getMonth().getValue(); System.out.println("当前月份 " + month); // 得到当前时间在这个月中的天数 int day = time.getDayOfMonth(); System.out.println("当前日 " + day); // 得到当前时间所在星期数 int dayOfWeek = time.getDayOfWeek().getValue(); System.out.println("当前星期 " + dayOfWeek); } }
getMonth()和getOfWeek()方法返回值不是具体数字,而是对象,所以必须用getValue()得具体数字。
7.2时间日期类的运用
- 字符串转化为日期时间
前边我们通过time.toString()这个方法的执行把time的数据变成了字符串,所以就会有一个方向的需求把字符串变成LocalDate类型
import java.time.LocalDate; public class DateTest8 { public static void main(String[] args) { // 定义一个时间字符串,日期是2019年1月1日 String date = "2019-01-01"; // 把字符串转化位 LocalDate 对象,并得到字符串匹配的日期 LocalDate date2 = LocalDate.parse(date); // 打印出日期 System.out.println(date2.toString()); } }
如上代码,LocalDate.parse(date)这个parse方法可以把日期字符串转化为日期类型,注意这个字符串格式是2019-02-09类型的。如果日期字符串不是yyyy-MM-dd,就需要借助DateTimeFormatter,比如
import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class DateTest81 { public static void main(String[] args) { // 定义一个时间字符串,日期是2019年1月1日 String date = "2019/01/01"; DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // 把字符串转化位 LocalDate 对象,并得到字符串匹配的日期 LocalDate date2 = LocalDate.parse(date,df); // 打印出日期 System.out.println(date2.toString()); } }
- 日期时间的计算
比如说预定酒店,2021年5月1日入住,3天后离店。从需求上可以看出,只要我们对日期的天数进行+3的计算就可以完成了。
import java.time.LocalDate; public class DateTest9 { public static void main(String[] args) { LocalDate leaveTime = getLeaveTime("2019-05-01", 4); System.out.println(leaveTime.toString()); } /** * 根据入住时间和入住天数得到离店时间 * * @param checkInTime * @param days * @return */ public static LocalDate getLeaveTime(String checkInTime, int days) { // 把字符串转化为 LocalDate 类型 LocalDate time = LocalDate.parse(checkInTime); // 使用 plusDays 添加天数,得到新的时间 LocalDate leaveTime = time.plusDays(days); return leaveTime; } }
除了处理天数相加外,还可以进行其他日期时间的计算,
import java.time.LocalDate; public class DateTest10 { public static void main(String[] args) { LocalDate now = LocalDate.now(); System.out.println("当前:" + now.toString()); System.out.println("加法运算"); System.out.println("加1天:" + now.plusDays(1)); System.out.println("加1周:" + now.plusWeeks(1)); System.out.println("加1月:" + now.plusMonths(1)); System.out.println("加1年:" + now.plusYears(1)); System.out.println("减法运算"); System.out.println("减1天:" + now.minusDays(1)); System.out.println("减1周:" + now.minusWeeks(1)); System.out.println("减1月:" + now.minusMonths(1)); System.out.println("减1年:" + now.minusYears(1)); } }
- 两个日期时间的判断
在日常工作中我们经常会对两个时间进行判断,比如说判断两个时间是否是同一天,一个日期是否在另外一个日期的前面或者后面,来看一下对应的方法如何执行
import java.time.LocalDate; public class DateTest11 { public static void main(String[] args) { LocalDate now = LocalDate.now(); // 可以对两个 LocalDate 进行比较, // 可以判断一个日期是否在另一个日期之前或之后, // 或者判断两个日期是否是同年同月同日。 boolean isBefore = now.minusDays(1).isBefore(LocalDate.now()); System.out.println("是否在当天之前:" + isBefore); boolean isAfter = now.plusDays(1).isAfter(LocalDate.now()); System.out.println("是否在当天之后:" + isAfter); // 判断是否是当天 boolean sameDate = now.isEqual(LocalDate.now()); System.out.println("是否在当天:" + sameDate); } }
例:
小明在日历上添加了一个提醒,2021-10-08和小凡一起去上海迪士尼玩
需求1:创建一个notice方法,这个方法用来执行提醒任务并接受一个字符串
1.如果传入日期早于10月8号,则打印:活动还未开始
2.如果是10月8日,则打印:活动开始啦
3.如果超过10月8日,则打印:活动已经结束啦
需求2:在main方法里执行3次notice方法,每次调用的参数值不同,分别是:
1.2021-03-08
2.2021-10-08
3.2021-12-29
1 import java.time.LocalDate; 2 3 public class Test803 { 4 5 public static void main(String[] args) { 6 7 notice("2019-03-08"); 8 notice("2019-04-08"); 9 notice("2019-04-09"); 10 11 } 12 13 public static void notice(String time) { 14 // 把字符串转化为 LocalDate 类型 15 LocalDate dateTime = LocalDate.parse(time); 16 17 LocalDate noticeTime = LocalDate.parse("2019-04-08"); 18 19 if (dateTime.isBefore(noticeTime)) { 20 System.out.println("活动还未开始"); 21 } else if (dateTime.isAfter(noticeTime)) { 22 System.out.println("活动已经结束啦"); 23 } else if (dateTime.equals(noticeTime)) { 24 System.out.println("活动开始啦"); 25 } 26 27 } 28 29 }
运行结果:
/usr/lib/jvm/java-1.11.0-openjdk-amd64/bin/java -javaagent:/home/coder/idea/lib/idea_rt.jar=45341:/home/coder/idea/bin -Dfile.encoding=UTF-8 -classpath /home/coder/project/j1_8_2_22_cs/target/classes Test803
活动还未开始
活动开始啦
活动已经结束啦
进程已结束,退出代码为 0