API(日期时间)
日期时间:
- Date(获取日期时间对象)
- 1、获取当前时间:
1 //创建一个日期对象,代表此刻日期时间对象
2 Date date = new Date();
3 System.out.println("当前时间:" + date);
运行结果:
从打印结果可以看出,打印的并非date对象本身(地址),而是具体的日期时间,这就说明Date类重写了父类的toString方法。
- 2、获取时间毫秒值
1 //获取时间毫秒值
2 Date date = new Date();
3 long time = date.getTime();
4 System.out.println(time);
5 System.out.println("-------方式二--------");
6 long time2 = System.currentTimeMillis();
7 System.out.println(time2);
运行结果:
两者若有稍微时间差的原因是因为程序的执行需要消耗一定的时间
- 案例:请计算出当前时间往后走1小时121秒后的时间:
< 方法一 >
1 //1、得到当前时间毫秒值
2 long time = System.currentTimeMillis();
3 Date date = new Date();
4 System.out.println(date);
5
6 //2、当前时间加上1小时121秒
7 long retTime = time + (60 * 60 + 121) * 1000;
8 //3、把最终计算得出的时间毫秒值转换成日期对象
9 Date date2 = new Date(retTime);
10 System.out.println(date2);
运行结果:
< 方法二 >
1 long time = System.currentTimeMillis();
2 System.out.println(new Date());
3
4 time += (60 * 60 + 121) * 1000;
5 Date date = new Date();
6 date.setTime(time); //通过setTime的方式
7 System.out.println(date);
结果示例:
- SimpleDateFormat(格式化日期时间格式)
- 1、格式化日期时间对象:
1 //1、创建一个日期时间对象
2 Date date = new Date();
3 System.out.println(date);
4
5 //2、格式化改日期时间对象
6 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE a"); //EEE:星期几,a:上下午
7 //3、格式化日期时间对象成字符串格式
8 String ret = sdf.format(date);
9 System.out.println(ret);
结果示例:
- 格式化时间毫秒值:
继上述代码添加上一下代码:
1 //拓展:格式化时间毫秒值,并计算121秒之后的时间
2 long time = System.currentTimeMillis() + 121 * 1000;
3 String formatTime = sdf.format(time);
4 System.out.println(formatTime);
- 2、解析时间案例:请计算出 2021年08月06日 11:11:11,往后走2天14小时49分06秒的时间:
1 //时间:2021年08月06日 11:11:11,往后2天14小时49分06秒
2 //1、用字符串保存开始时间
3 String beginTime = "2021年08月06日 11:11:11";
4 //2、把字符串时间解析成日期时间对象
5 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
6 Date date = sdf.parse(beginTime); //使用parse需要抛出ParseException异常
7 //3、把所得日期对象转换成时间毫秒值在加上往后走的时间
8 long time = date.getTime() + (2 * 24 * 60 * 60 + 14 * 60 * 60 + 49 * 60 + 6) * 1000L;
9 //4、格式化最终的时间毫秒值
10 String lastTime = sdf.format(time);
11 System.out.println(lastTime);
- 3、练习案例(秒杀活动):
- 需求:
- 小贾下单并付款的时间为:2020年11月11日 0:03:47
- 小皮下单并付款的时间为:2020年11月11日 0:10:11
- 用代码说明两位同学有没有成功参加秒杀活动
1 public static void main(String[] args) throws ParseException { //使用parse需要抛出异常
2 //开始时间和结束时间
3 String beginTime = "2020年11月11日 0:00:00";
4 String endTime = "2020年11月11日 0:10:00";
5
6 //存储两位同学秒杀的字符串时间
7 String strXiaoJia = "2020年11月11日 0:03:47";
8 String strXiaoPi = "2020年11月11日 0:10:11";
9
10 //格式化时间成日期时间对象
11 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
12 Date startTime = sdf.parse(beginTime);
13 Date lastTime = sdf.parse(endTime);
14 Date dateXiaoJia = sdf.parse(strXiaoJia);
15 Date dateXiaoPi = sdf.parse(strXiaoPi);
16
17 //判断是否在秒杀时间内
18 if(dateXiaoJia.after(startTime) && dateXiaoJia.before(lastTime)){
19 System.out.println("小贾秒杀成功");
20 }else {
21 System.out.println("小贾秒杀失败");
22 }
23 if(dateXiaoPi.after(startTime) && dateXiaoPi.before(lastTime)){
24 System.out.println("小皮秒杀成功");
25 }else {
26 System.out.println("小皮秒杀失败");
27 }
28 }
- Calender
1 public static void main(String[] args) {
2 //拿到日期对象
3 Calendar calendar = Calendar.getInstance();
4 //打印calendar对象里边的所有信息
5 System.out.println(calendar);
6 //通过get方法获取日历某一项信息
7 System.out.println(calendar.get(Calendar.YEAR)); //年份
8 System.out.println(calendar.get(Calendar.MONTH) + 1);//月份 (0~11)
9 System.out.println(calendar.get(Calendar.DAY_OF_MONTH)); //日
10 System.out.println(calendar.get(Calendar.SECOND));
11
12 System.out.println("-----------");
13 //修改日历的信息(几乎不用)
14 // calendar.set(Calendar.YEAR,2025);
15 // System.out.println(calendar.get(Calendar.YEAR)); //年份 2025
16 //64天,56分,35秒之后是什么时间
17 calendar.add(Calendar.DAY_OF_YEAR,63);
18 calendar.add(Calendar.MINUTE,56);
19 calendar.add(Calendar.SECOND,35);
20 System.out.println(calendar.get(Calendar.YEAR)); //年份
21 System.out.println(calendar.get(Calendar.MONTH) + 1);//月份 (0~11)
22 System.out.println(calendar.get(Calendar.DAY_OF_MONTH)); //日
23 System.out.println(calendar.get(Calendar.SECOND)); //秒
24
25 //日历拿到当前时间毫秒值(很少用)
26 long time = calendar.getTimeInMillis();
27 System.out.println(time);
28 }
示例结果:
- JDK8开始新增日期API(内容超多,具体使用在查找API文档)
- localDate:
1 public static void main(String[] args) {
2 //1、获取本地日期对象
3 LocalDate nowDate = LocalDate.now();
4 System.out.println("当前时间" + nowDate);
5 System.out.println("当前年份:" + nowDate.getYear());
6 System.out.println("当前月份(英文):" + nowDate.getMonth());
7 System.out.println("当前月份(数字):" + nowDate.getMonthValue());
8 System.out.println("-----------");
9 System.out.println("当前年份第几天:" + nowDate.getDayOfYear());
10 System.out.println("星期(英文):" + nowDate.getDayOfWeek());
11 System.out.println("星期(数字):" + nowDate.getDayOfWeek().getValue());
12 System.out.println("月份(英文):" + nowDate.getMonth());
13 System.out.println("月份(数字):" + nowDate.getMonth().getValue());
14 System.out.println("---------------");
15 LocalDate ld = LocalDate.of(1998,12,25);
16 System.out.println("拿出指定时间:" + ld);
17 LocalDate ld2 = LocalDate.of(1998, Month.DECEMBER, 25);
18 System.out.println("设定英文月份:" + ld2);
19 }
示例结果;
- localTime :
1 public static void main(String[] args) {
2 //获取本地日期时间对象
3 LocalTime lt = LocalTime.now();
4 System.out.println("当前系统时间:" + lt);
5 System.out.println("小时:" + lt.getHour());
6 System.out.println("分钟:" + lt.getMinute());
7 System.out.println("秒:" + lt.getSecond());
8 System.out.println("纳秒:" + lt.getNano());
9 System.out.println("------------");
10 LocalTime lt2= LocalTime.of(19,30); //指定时、分
11 System.out.println("指定时、分:" + lt2);
12 System.out.println("指定时、分、秒:" + LocalTime.of(19,30,28));
13 System.out.println("指定时、分、秒、纳秒:" + LocalTime.of(19,30,28,1556));
14 }
示例结果:
- LocalDateTime(LocalDateTime综合了LocalDate和LocalTime里面的方法) :
1 public static void main(String[] args) {
2 //获取当前日期时间对象
3 LocalDateTime ldt = LocalDateTime.now();
4 System.out.println("系统当前时间:" + ldt);
5 System.out.println("年份:" + ldt.getYear());
6 System.out.println("月份(英文):" + ldt.getMonth());
7 System.out.println("月份(数字):" + ldt.getMonthValue());
8 System.out.println("日:" + ldt.getDayOfMonth());
9 System.out.println("时:" + ldt.getHour());
10 System.out.println("分:" + ldt.getMinute());
11 System.out.println("秒:" + ldt.getSecond());
12 System.out.println("纳秒:" + ldt.getNano());
13 System.out.println("星期几(英文):" + ldt.getDayOfWeek());
14 System.out.println("星期几(数字):" + ldt.getDayOfWeek().getValue());
15 System.out.println("一年中第几天:" + ldt.getDayOfYear());
16 System.out.println("---------------");
17 LocalDate ld = ldt.toLocalDate();//转换成LocalDate对象
18 LocalTime lt = ldt.toLocalTime();//转换成LocalTime对象
19 }
结果示例:
- 关于修改相关的API
1 public static void main(String[] args) {
2 LocalDate lt = LocalDate.now(); //创建LocalDate对象
3 System.out.println(lt);
4 //当前时间加上2年3个月13天3周后的时间
5 LocalDate addLt = lt.plusYears(2).plusMonths(3).plusDays(15).plusWeeks(5);
6 System.out.println(addLt);
7 //当前时间减去2年3个月13天3周后的时间
8 LocalDate minusLt = lt.minusYears(2).minusMonths(3).minusDays(15).minusWeeks(5);
9 System.out.println(minusLt);
10 //将当前时间修改为2018年10月1日
11 LocalDate modifyLd = lt.withYear(2018).withMonth(10).withDayOfMonth(1);
12 System.out.println(modifyLd);
13 //比较两个时间
14 System.out.println(lt.isAfter(minusLt));
15 System.out.println(lt.isBefore(addLt));
16 System.out.println(lt.isBefore(modifyLd));
17 System.out.println("----------------");
18 //判断两个日期是否相等(比较两个日期是否相等)
19 LocalDate birthDate = LocalDate.of(1998,12,15);
20 System.out.println(birthDate.equals(lt));
21 //使用MonthDay(工具)类的of方法,从birthDate对象中通过get方法取到月份、日份
22 MonthDay md = MonthDay.of(birthDate.getMonth(),birthDate.getDayOfMonth()) ;
23 MonthDay md2 = MonthDay.from(birthDate);
24 System.out.println(md);
25 System.out.println(md2);
26 //是否为生日
27 System.out.println(md.equals(md2));
28 }
示例运行结果:
- Instant时间戳
1 public static void main(String[] args) {
2 //获取当前时间戳对象
3 Instant instant = Instant.now();
4 System.out.println("世界标准时间:(0时区)" + instant);
5 //获取系统此刻时间
6 Instant instantSystem = Instant.now();
7 ZonedDateTime defaultTime = instantSystem.atZone(ZoneId.systemDefault());
8 System.out.println("所在时区时间:" + defaultTime);
9 //返回Date对象
10 Date date = Date.from(instant);
11 System.out.println(date);
12 //Date对象转成时间戳
13 Instant dti = date.toInstant();
14 System.out.println(dti);
15 }
- DateTimeFormat
1 public static void main(String[] args) {
2 LocalDateTime ldt = LocalDateTime.now();
3 System.out.println("LocalTime默认时间格式:" + ldt);
4 //创建格式化器
5 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss EEE a");
6 //<方法一>正向格式化:
7 String ret = dtf.format(ldt);
8 System.out.println("自定义日期时间格式(正向格式化):" + ret);
9 //<方法二>逆向格式化
10 String ret2 = ldt.format(dtf);
11 System.out.println("自定义日期时间格式(逆向格式化):" + ret2);
12 //解析字符串时间对象
13 //创建格式化器
14 DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
15 String strTime = "2022年05月05日 11:46:04";
16 LocalDateTime strToLdt = LocalDateTime.parse(strTime,dtf2); //按照dtf2的格式格式化改字符串
17 System.out.println(strToLdt);
18 }
- Period
1 public static void main(String[] args) {
2 //创建LocalDate对象
3 LocalDate ld = LocalDate.now();
4 System.out.println(ld);
5 //生日的年、月、日
6 LocalDate birthDate = LocalDate.of(2000,4,10);
7 System.out.println(birthDate);
8 Period period = Period.between(birthDate,ld); //参数二减去参数一
9 System.out.println(period);
10 System.out.println(period.getYears());
11 System.out.println(period.getMonths());
12 System.out.println(period.getDays());
13 }
- Duration
1 public static void main(String[] args) {
2 //闯将LocalDateTime时间对象,年-月-日
3 LocalDateTime ldt = LocalDateTime.now();
4 System.out.println("当前时间:" + ldt);
5 //出生日期 : 年-月-日-时-分-秒
6 LocalDateTime birthDate = LocalDateTime.of(2012,8,16,0,0,0);
7 System.out.println("自定义时间:" + birthDate);
8 //时间差
9 Duration duration = Duration.between(birthDate,ldt); //参数二减去参数一
10 System.out.println("时间差:" + duration);
11 System.out.println("时间差(天数):" + duration.toDays());
12 System.out.println("时间差(小时):" + duration.toMinutes());
13 System.out.println("时间差(秒):" + duration.toMinutes());
14 System.out.println("时间差(毫秒):" + duration.toMinutes());
15 System.out.println("时间差(纳秒):" + duration.toNanos());
16 }
示例结果:
- ChronoUnit
1 public static void main(String[] args) {
2 //创建LocalDateTime时间对象:此刻
3 LocalDateTime ldt = LocalDateTime.now();
4 System.out.println("系统此刻时间:" + ldt);
5 //指定年月日时分秒
6 LocalDateTime birLdt = LocalDateTime.of(1998,3,12,14,45,36);
7 System.out.println("指定时间:" + birLdt);
8 //计算两个日期对象时间间隔
9 System.out.println("------两个日期对象时间间隔------");
10 Long years = ChronoUnit.YEARS.between(birLdt,ldt);
11 System.out.println("年份:" + years);
12 System.out.println("月份:" + ChronoUnit.MONTHS.between(birLdt,ldt));
13 System.out.println("周数:" + ChronoUnit.WEEKS.between(birLdt,ldt));
14 System.out.println("天数:" + ChronoUnit.DAYS.between(birLdt,ldt));
15 System.out.println("秒数:" + ChronoUnit.MILLIS.between(birLdt,ldt));
16 System.out.println("纳秒数:" + ChronoUnit.NANOS.between(birLdt,ldt));
17 }
ChronoUnit工具类提供的日期时间API可谓是相当丰富的,除此之外还有半天、十年、世纪、千年、纪年等时间差,上边也只是列出了比较可能常用的API(需要用其他的在查即可),ChronoUnit是一个枚举类。