第二章 日期工具类
1、掌握日期相关类的使用
java.util;
- Date 了解
- Calendar 掌握
分时间案例 日期时间类 if语句 关系运算 逻辑运算
时间戳概念
指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)
起至现在的总秒数,本质是一个long类型的整数,表示日期对象。
java 体系的时间戳是毫秒。
lang包下的所有类,无需导入
java.lang;
JAVA1.8
LocalDate
LocalTime 18:20:30
LocalDateTime 2023-02-09 09:11:20 Date Calender
package cn.practice;
public class TimeStamp {
public static void main(String[] args) {
long ss = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
long ee = System.currentTimeMillis();
System.out.printf("ms:%d %n", ee - ss);
System.out.println(System.currentTimeMillis());
System.out.printf("%tF %<tT%n", 0L);
//格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)
System.out.printf("%tF %<tT%n", 1676033611399L);
//1676033611399L - 时间戳
//currentTimeMillis()得到当前时间戳
}
}
日期工具类
1.java.util.Date
Date 类表示系统特定的时间戳,可以精确到毫秒。
Date 对象表示时间的默认顺序是星期、月、日、小时、分、秒、年。
- Date()
- Date(long date)
package cn.practice;
import java.util.Date;
public class StruDate {
public static void main(String[] args) {
Date date1 = new Date(); // 调用无参数构造函数
System.out.println(date1.toString()); // 输出:Fri Feb 10 21:24:05 CST 2023
Date date2 = new Date(60000); // 调用含有一个long类型参数的构造函数
System.out.println(date2); // 输出:Thu Jan 01 08:01:00 CST 1970
}
}
方法 | 描述 |
---|---|
boolean after(Date when ) | 判断此日期是否在指定日期之后 |
boolean before(Date when) | 判断此日期是否在指定日期之前 |
int compare To(Date another Date) | 比较两个日期的顺序 |
boolean equals(Object obj) | 比较两个日期的相等性 |
long getTime() | 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来 此 Date 对象表示的毫秒数 |
String toString() | 把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy。 其中 dow 是一周中的某一天(Sun、Mon、Tue、Wed、Thu、Fri 及Sat) |
package cn.practice;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class StruDate1 {
public static void main(String[] args) throws ParseException {
// 2000-12-16 2000.12.16 定义输出格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 将字符串转化为日期
Date date = sdf.parse("2000-11-11 11:11:11");
System.out.println(date);//Sat Nov 11 11:11:11 CST 2000
Date date1 = new Date();
// 将日期转化为字符串
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String str = sdf1.format(date1);
System.out.println(str);//2023-02-11 14:30:59
var now = new Date(); // 创建一个Date对象,获取当前时间
// 指定格式化格式
var f = new SimpleDateFormat("今天是 " + "yyyy 年 MM 月 dd 日 E HH 点 mm 分 ss 秒");
System.out.println(f.format(now));// 将当前时间袼式化为指定的格式
//今天是 2023 年 02 月 11 日 周六 14 点 33 分 56 秒
}
}
package cn.practice;
import java.util.Date;
public class StruDate2 {
public static void main(String[] args) {
//构造方法 实例化对象
Date d1 = new Date();
Date d2 = new Date(System.currentTimeMillis());
System.out.println(System.currentTimeMillis());
Date d3 = new Date(1676097794284L);
System.out.printf("%tF %<tT%n",d1);
System.out.printf("%tF %<tT%n",d2);
System.out.printf("%tF %<tT%n",d3);
//常用方法
long now = d1.getTime();
d1.setTime(now + (1000 * 60 * 60 * 24 * 10));
//10天后 2023-02-21 14:55:31
System.out.printf("%tF %<tT%n",d1);
//计算两个日期之间的天数 1989-10-15出生到目前生活了多少天?
Date ss = new Date(1989-1900,9,15,8,20,30);
long t1 = ss.getTime();//1989-10-15 08:20:30
System.out.printf("%tF %<tT%n",ss);
System.out.printf("%tF %<tT%n",t1);
long t2 = System.currentTimeMillis();//2023-02-11 15:17:17
System.out.printf("%tF %<tT%n",t2);
System.out.println((t2-t1)/(1000*60*60*24));//12172
}
}
2.java.util.Calendar
Calendar类是一个抽象类,创建Calendar对象不能使用new关键字,与 YEAR、MONTH、DAY_OF—MONTH、HOUR 、操作日历字段等提供了一些方法。
掌握Calendar类实例化,add() set() get()三大方法
可以用getInstance()方法来获得Calendar类的对象(getInstance()方法返回一个Calendar对象,其日历字段已由当前日期和时间初始化)。
Calendar c = Calendar.getInstance();
方法 | 描述 |
---|---|
void add(int field,int amout) | 给 field 添加或减去指定的时间量 amount |
boolean after(Object when) | 判断 Calendar 表示的时间是否在指定时间 when 之后,并返回结果 |
boolean before(Object when) | 判断 Calendar 表示的时间是否在指定时间 when 之前,并返回结果 |
void clear() | 清空 Calendar 中的日期时间值 |
int compare To(Calendar anotherCalendar) | 比较两个 Calendar 对象表示的时间值(从格林威治时间 1970年 01 月 01 日 00 时 00 分 00 秒至现在的毫秒偏移量),大则返回 1,小则返回 -1,相等返回 0 |
int get(int field) | 返回指定日历字段的值 |
int getActualMaximum(int field) | 返回指定日历字段可能拥有的最大值 |
int getActualMinimum(int field) | 返回指定日历字段可能拥有的最小值 |
int getFirstDayOfWeek() | 获取一星期的第一天。根据不同地区,返回不同值 |
static Calendar getInstance() | 使用默认时区和语言坏境获得一个日历 |
static Calendar getInstance(TimeZone zone) | 使用指定时区和默认语言环境获得一个日历 |
static Calendar getInstance(TimeZone zone,Locale aLocale) | 使用指定时区和语言环境获得一个日历 |
Date getTime() | 返回一个表示此 Calendar 时间值(从格林威治时间 1970 年 01月 01 日 00 时 00 分 00 秒至现在的毫秒偏移量)的 Date 对象 |
long getTimeInMillis() | 返回此 Calendar 的时间值,以毫秒为单位 |
void set(int field,int value) | 为指定的日历字段设置给定值 |
void set(int year,int month,int date) | 设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值 |
void set(int year,int month,int date,int hourOfDay,int miniute,int second) | 设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值 |
void setFirstDayOfWeek(int value) | 设置一星期的第一天是哪一天 |
void setTimeInMillis(long millis) | 用给定的 long 值设置此 Calendar 的当前时间值 |
Calendar 对象可以调用 set() 方法将日历翻到任何一个时间,当参数 year 取负数时表示公元前。
Calendar 对象调用 get() 方法可以获取有关年、月、日等时间信息,参数 field 的有效值由 Calendar 静态常量指定。
常量 | 意义 |
---|---|
Calendar.YEAR | 年份 |
Calendar.MONTH | 月份 |
Calendar.DATE | 日期 |
Calendar.DAY_OF_MONTH | 日期 |
Calendar.HOUR | 12小时制的小时 |
Calendar.HOUR_OF_DAY | 24 小时制的小时 |
Calendar.MINUTE | 分钟 |
Calendar.SECOND | 秒 |
Calendar.DAY_OF_WEEK | 星期几 |
//eg.要获取当前月份
int month = Calendar.getInstance().get(Calendar.MONTH);
实例:使用 Calendar 类处理日期时间
package cn.practice;
import java.util.Calendar;
import java.util.Date;
public class StruCalendarDate {
public static void main(String[] args) {
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(new Date());
// 将系统当前时间赋值给 Calendar 对象
System.out.println("现在时刻:" + calendar1.getTime()); //现在时刻:Sat Feb 11 18:13:31 CST 2023
int year = calendar1.get(Calendar.YEAR);
System.out.println("现在是" + year + "年");//现在是2023年
int month = calendar1.get(Calendar.MONTH) + 1; // 获取当前月份(月份从 0 开始,所以加 1)
System.out.print(month + "月");
int day = calendar1.get(Calendar.DATE); // 获取日
System.out.print(day + "日");
System.out.print(" ");
int week = calendar1.get(Calendar.DAY_OF_WEEK) - 1; // 获取今天星期几(以星期日为第一天)
System.out.print("星期" + week);
System.out.print(" ");
int hour = calendar1.get(Calendar.HOUR_OF_DAY); // 获取当前小时数(24 小时制)
System.out.print(hour + "时");
int minute = calendar1.get(Calendar.MINUTE);
System.out.print(minute + "分");
int second = calendar1.get(Calendar.SECOND);
System.out.print(second + "秒");
int millisecond = calendar1.get(Calendar.MILLISECOND);
System.out.print(millisecond + "毫秒");
System.out.print(" ");
int dayOfMonth = calendar1.get(Calendar.DAY_OF_MONTH); // 获取今天是本月第几天
System.out.println("今天是本月的第 " + dayOfMonth + " 天");//今天是本月的第 11 天
int dayOfWeekInMonth = calendar1.get(Calendar.DAY_OF_WEEK_IN_MONTH);// 获取今天是本月第几周
System.out.println("今天是本月第 " + dayOfWeekInMonth + " 周");
int many = calendar1.get(Calendar.DAY_OF_YEAR); // 获取今天是今年第几天
System.out.println("今天是今年第 " + many + " 天");
Calendar c = Calendar.getInstance();
c.set(2012, 8, 8); // 设置年月日,时分秒将默认采用当前值
System.out.println("设置日期为 2012-8-8 后的时间:" + c.getTime());
//设置日期为 2012-8-8 后的时间:Sat Sep 08 18:21:30 CST 2012
}
}
设置-7天,获取7天前的日期
package cn.practice;
import java.util.Calendar;
import java.util.Date;
public class StruCalendarDate1 {
public static void main(String[] args) {
//获取实例对象
var c = Calendar.getInstance();
//c.set();c.get();
System.out.println(c.get(Calendar.HOUR_OF_DAY));
System.out.println(new Date().getHours());
//c.add(); 设置-7天,获取7天前的日期
c.add(Calendar.DATE,-7);
//日历类转换为Date类
Date d=c.getTime();
System.out.printf("%tF %<tT%n",d);
//日历类获取时间戳
long ts = c.getTimeInMillis();
System.out.printf("%tF %<tT%n",ts);
System.out.printf("%tF %<tT%n",c);
}
}
2、计算2023-1-1 这一天是星期几?
package cn.practice;
import java.time.LocalDate;
import java.time.format.TextStyle;
import java.util.Locale;
public class CalDataisWeek {
public static void main(String[] args) {
var data01 = LocalDate.of(2023,1,1);
var dayisweek = data01.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.CHINESE);
System.out.printf("%tF这一天是%<tA",data01);
}
}
3、掌握LocalDate使用,掌握LocalDate、LocalTime、LocalDateTime类的format格式化方法()
java.time.*;
LocalDate dd = Local
java8 DateAPI
-
LocalDate
-
jdk1.8 新的日期API
java.time.LocalDate类
java.util.Date Calendar
此类只有年月日
-
package cn.practice;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.time.temporal.ChronoUnit;
import java.util.Locale;
public class StruLocalDate {
public static void main(String[] args) {
//实例化
LocalDate d1=LocalDate.now();
var d2 = LocalDate.of(1985,10,17);
//常用操作 c++ 今日5天后日期
System.out.println(d1.plusDays(5));
//今日3天前日期
System.out.println(d1.minusDays(3));
//今日25个月后的新日期
System.out.println(d1.plus(25, ChronoUnit.MONTHS));
//今日日期的月份 中文效果: 十月
var daymonth = d1.getMonth().getDisplayName(TextStyle.FULL, Locale.CHINESE);
System.out.println(daymonth);
var dayweek = d1.getDayOfWeek().getDisplayName(TextStyle.FULL,Locale.CHINESE);
System.out.println(dayweek);
var dayweek1 = d1.getDayOfWeek().getDisplayName(TextStyle.SHORT,Locale.CHINESE);
System.out.println(dayweek1);
System.out.println("----------------");
//计算两个日期之间的天数
long days = ChronoUnit.DAYS.between(d2,d1);
System.out.printf("%s 到 %s 之间有 %d 天",d2,d1,days);
System.out.println();
//格化输出
System.out.println(d1);
System.out.println(d2);
System.out.printf("%tF%n",d1);
System.out.printf("%tF%n",d2);
System.out.printf("%tY年%<tm月%<td日 %<tA%n",d1);
System.out.printf("%tY年%<tm月%<td日 %<tA%n",d2);
System.out.println(d1.isLeapYear());
//专业的格式工具类java.time.DateTimeFormatter
var fmt = DateTimeFormatter.ofPattern("yyyy年MM月dd日 E M L");
var fmt1 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 E M L",Locale.CHINA);
System.out.println(fmt.format(d1));
System.out.println(fmt.format(d2));
System.out.println(fmt1.format(d1));
System.out.println(fmt1.format(d2));
}
}
-
LocalTime
LocalTime本地化时间 只有时分秒 没有日期
package cn.practice;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class StruLocalTime {
public static void main(String[] args) {
//LocalTime 实例化
var t1 = LocalTime.now();
var t2 = LocalTime.of(14, 30, 20);
var t3 = LocalTime.parse("19:23:25", DateTimeFormatter.ofPattern("HH:mm:ss"));
//简单输出
System.out.println(t1);//08:44:09.385507600
System.out.printf("%tT%n", t1);//08:44:09
System.out.println(t2);//14:30:20
System.out.println(t3);//19:23:25
//格式化输出
DateTimeFormatter df = DateTimeFormatter.ofPattern("HH时mm分ss秒");
System.out.println(df.format(t1));
System.out.println(df.format(t2));
System.out.println(df.format(t3));
System.out.println(t1.plusSeconds(1000));
//把1000秒加到t1中
var sns = t1.plusSeconds(1000).format(DateTimeFormatter.ofPattern("HH:mm:ss"));
System.out.println(sns);
//把1000秒加到t1中 格式化输出
LocalTime time = LocalTime.now();
System.out.println(time);
System.out.printf("%tT%n", time);
System.out.printf("%tH时%<tM分%<tS秒%n", time);
System.out.println(time.format(DateTimeFormatter.ofPattern("HH:mm:ss")));
}
}
LocalDateTime
包含了年月日时分秒相关信息,相当于LocalDateTime = LocalDate + LocalTime
相当于以前的java.util.Date,也相当于java.util.Calendar类
package cn.practice;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.util.Locale;
public class StruLocalDateTime1 {
public static void main(String[] args) {
var d1= LocalDateTime.now();
System.out.println(d1);
System.out.printf("%tF %<tT %n",d1);
System.out.printf("%tF%n",d1);
System.out.printf("%tT%n",d1);
System.out.printf("%tY年%<tm月%<td日 %<tH:%<tM:%<tS %<tA %<tp %s %n",d1,d1.getMonth().getDisplayName(TextStyle.FULL, Locale.CHINA));
//将字符串转换为LocalDateTime
var d2=LocalDateTime.of(2022,10,17,14,49,50);
System.out.println(d2);
System.out.println(d2.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
String str="2022-03-15 20:30:40";
var d3=LocalDateTime.parse(str,DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(d3);
}
}
java.time.LocalDateTime & java.time.DateTimeFormatter
package cn.practice;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
public class StruLocalDateTime2 {
//private static LocalDateTime date;
public static void main(String[] args) {
//java.time.LocalDateTime & java.time.DateTimeFormatter
//获取一天的开始时间
//LocalDate now = LocalDate.now();
//var ss= LocalDateTime.of(now, LocalTime.MIN);
LocalDate date = LocalDate.of(2023,2,18);
var ss= LocalDateTime.of(date, LocalTime.MIN);
System.out.println("--------------");
System.out.println(ss);//2023-02-18T00:00
System.out.println(ss.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));//2023-02-18 00:00:00
//获取一天的结束时间
//var endOfTheDay = LocalDateTime.of(now,LocalTime.MAX);
var endOfTheDay = LocalDateTime.of(date,LocalTime.MAX);
System.out.println(endOfTheDay);//2023-02-18T23:59:59.999999999
System.out.println(endOfTheDay.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));//2023-02-18 23:59:59
//将LocalDateTime 对象 获取 毫秒时间戳
long ms = LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
System.out.println(ms);//1676707914598
System.out.println(System.currentTimeMillis());//1676707914599
System.out.printf("%tF %<tT%n",LocalDateTime.now());//2023-02-18 16:11:54
//获取系统毫秒 时间戳
long mm = Instant.now().toEpochMilli();
Date d = new Date(ms);
System.out.printf("%tF %<tT%n",d);//2023-02-18 16:11:54
Calendar c=Calendar.getInstance();
c.setTimeInMillis(1676368128327L);
System.out.printf("%tF %<tT%n",c);//2023-02-14 17:48:48
}
}
4、计算两个日期之间有多少天?
package cn.practice;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
public class StruLocalDateTime {
public static void main(String[] args) {
//计算两个日期之间的天数
LocalDateTime a = LocalDateTime.of(2001,10,5,8,0,0);
LocalDateTime b = LocalDateTime.now();
long days = ChronoUnit.DAYS.between(a,b);
System.out.printf("%tF %<tT到%tF %<tT 之间有%d天",a,b,days);
//2001-10-05 08:00:00到2023-02-11 19:37:03 之间有7799天
}
}
5、给出一个年份,判断这一年是不是闰年?
//2013 是不是闰年?
int year = 2020;
String info = LocalDate.of(year, 1, 1).isLeapYear() ? "闰年" : "平年";
System.out.println(info);
//if语句判断是不是闰年
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
System.out.println("闰年");
} else {
System.out.println("平年");
}
String s = year % 400 == 0 || (year % 4 == 0 && year % 100 != 0) ? "闰年" :
"平年";
System.out.println(s);