目录
关于日期和时间的处理类:
Date:
Calendar:
SimpleDateFormat:
LocalDate:
LocalTime:
ZoneDateTime:
关于这些类的使用
Date
无参构造方法:Date();
boolean after(Date when);
boolean before(Date when);
int compareTo(Date date);
boolean equals(Object date);
long getTime();
String toString();
Calendar
静态常量
public Static Calendar getInstance();
public int get(int filed);
public final void set(int year,int month,int day);
public abstract void add(int field,int amount);
Date getTime();
SimpleDateFormat
无参构造方法
有参构造方法
格式化(从Date到String)
解析(从String到Date)
LocalDate、LocalTime、LocalDateTime
获取当前的时间
自定义日期
日期的加减
日期的指定
获取日期的年月日周时分秒
日期的比较与Date类相似
计算时间间隔
日期格式化:将时间对象转换为日期字符串
解析:将时间字符串转化为日期对象
格式化同类型的对象:将日期对象格式化为日期对象
LocalDate转为Date
Date转为LocalDate
关于日期和时间的处理类:
使用以下类需要导包,java.util
Date:
表示特定的瞬间,精确到毫秒,可以用来存储和表示日期和时间。
Date对象可以调用它的构造函数或parse()方法(将字符串解析为日期)来创建。
Calendar:
可以用于表示时区、日期和时间,可以用来获取和设置日期的时间值,执行日期和时间的计算。Calendar可以精确地表示到毫秒以下的时间间隔。
Calendar是一个抽象类接口,所以不能直接实例化对象,其中里面提供了getInstance()这个方法,来初始化获取一个日历对象,返回Calendar对象。
SimpleDateFormat:
是DateFormat的子类,是日期格式化类,专门用来格式化和解析日期的。
格式化是将存储日期的类转化为字符串记录的日期形式,主要值Date类转化为String类。
解析式将表示日期的字符串转化为记载日期的类。
使用下列类需要导包,java.time
LocalDate:
是Java8中的一个新类,用于表示不带时间的日期,例如2023-05-09。与上两者不同的是LocalDate不包含任何时间信息,仅包含日期信息。
提供了一些比较旧的日期类更加简单的方法 ,例如plusDays()和minusDays()来增加或减小天数。也可以执行日期算术运算,例如计算日期之间的天数和周数。
LocalTime:
用于表示不带日期和时区的时间,提供一些简单的方法,用于增加或减少特定的小时数、分钟数或秒数,并支持时间算术运算。
ZoneDateTime:
表示带时区的日期和时间,就是在日期和时间中包含了时区信息,不仅可以表示:年-月-日和时-分-秒,还可以表示时区的信息,也可以用于执行日期和时间的算术运算。
这三个类之间的主要区别在于它们代表的具体内容和范围:LocalDate代表日期,LocalTime代表时间,ZoneDateTime表示带有时区的日期和时间。
关于这些类的使用
Date
Date对象表示的时间的默认顺序是:星期、月、日、小时、分、秒、年。
无参构造方法:Date();
- 表示分配一个Date对象,并初始化,以便代表他被分配的时间,精确到毫秒,使用该构造方法创建的对象可以获取本地的当前时间。
Date D=new Date();
System.out.println(D);//Mon May 08 11:26:48 CST 2023
有参构造方法:Date(long date);
- 表示分配一个Date对象,并将其初始化为表示从标准时间起指定的毫秒数(就是从格林尼治时间1970年1月1日0时0分0秒开始经过参数date指定的毫秒数)
long D=24*6*60*1000;
Date date=new Date(D);
System.out.println(date);//Thu Jan 01 10:24:00 CST 1970
boolean after(Date when);
判断调用此方法的Date对象是否在指定日期之后。
boolean before(Date when);
判断调用此方法的Date对象是否在指定日期之前。
//初始化一个Date对象,获取当前时间
Date D1=new Date();
System.out.println(D1);
//分配一个Date对象
long date=24*60*60*10000;
Date D2=new Date(date);
System.out.println(D2);
//输出
//判断D2的时间是否在D1之前
System.out.println(D1.after(D2));//true
System.out.println(D2.before(D1));//true
int compareTo(Date date);
比较当前调用此方法的Date对象和指定日期,两者相等时返回0,调用对象在指定日期之前返回负数,反之是正数。
boolean equals(Object date);
调用此方法的Date对象和指定的日期相等时返回true,不等时放回false。
Date D1=new Date(24*60*60);
System.out.println(D1);
Date D2=new Date(24*60*60);
System.out.println(D2);
Date D3=new Date(24*60*60*2);
System.out.println(D3);
//调用方法
System.out.println(D1.compareTo(D2));//0
System.out.println(D1.compareTo(D3));//-1
System.out.println(D1.equals(D2));//true
System.out.println(D2.equals(D3));//false
long getTime();
返回字1970年1月1日0时0分0秒GMT以来此Date对象表示的毫秒数,
Date D1=new Date(D);
System.out.println(D1);//Fri Jan 02 08:00:00 CST 1970
System.out.println(D1.getTime());//86400000
String toString();
获取当前日期和时间并用以下形式的输出:dow mon dd hh:mm:ss zzz yyyy;(dow是周几:Sun、Mon、Tue、Wed、Tue、Dri、Sat)。也可以不调用,输出的结果一样。
Calendar
静态常量
Calendar.YEAR;//年份
Calendar.MONDAY;//月份
Calendar.DATE;//多少号
Calendar.HOUR;//小时(12小时制)
Calendar.HOUR_OF_DAY;//小时(24小时制)
Calendar.MINUTE;//分钟
Calendar.SECOND;//秒数
Calendar.MILLISECOND;//毫秒数
Calendar.WEEK_OF_MONTH;//当前月的第几个星期(日历式的第几周)
Calendar.WEEK_OF_YEAR;//当前年的第几个星期
Calendar.DAY_OF_WEEK_IN_MONTH;//当前月的第几个星期,以月份天数为标准,一个月的1号为第一周,8号为第二周
Calendar.DAY_OF_MONTH;//对于一周七天,对应的是一周中的第几天
Calendar.DAY_OF_YEAR;//表示一年中的第几天
Calendar.DAY_OF_MONTH;//表示一月中的第几天
Calendar.AM_PM;//上午或下午
Calendar.SUNDAY;//周日
Calendar.MONDAY;//周一
Calendar.TUESDAY;//周二
Calendar.WEDNESDAY;//周三
Calendar.THURSDAY;//周四
Calendar.FRIDAY;//周五
Calendar.SATURDAY;//周六
public Static Calendar getInstance();
创建Calendar类型的子类对象。
Calendar calendar=Calendar.getInstance();
System.out.println(calendar);
//java.util.GregorianCalendar[time=1683528233725,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2023,MONTH=4,WEEK_OF_YEAR=19,WEEK_OF_MONTH=2,DAY_OF_MONTH=8,DAY_OF_YEAR=128,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=43,SECOND=53,MILLISECOND=725,ZONE_OFFSET=28800000,DST_OFFSET=0]
public int get(int filed);
根据日历字段,获取其对应的值。
Calendar calendar=Calendar.getInstance();
int year=calendar.get(Calendar.YEAR);
System.out.println(year);//2023
public final void set(int year,int month,int day);
设置时间为指定的年,月,日。
Calendar calendar=Calendar.getInstance();
calendar.set(2022,2,14);
int year=calendar.get(Calendar.YEAR);
int month=calendar.get(Calendar.MONTH);
int day=calendar.get(Calendar.DATE);
System.out.println("year:"+year+"\tmonth:"+month+"\tday:"+day);//year:2022 mouth:52 day:14
public abstract void add(int field,int amount);
根据日历的规则,将指定时间添加或减少。
Calendar calendar=Calendar.getInstance();
calendar.add(Calendar.YEAR,3);
calendar.add(Calendar.DATE,-10);
int year=calendar.get(Calendar.YEAR);
int month=calendar.get(Calendar.MONTH)+1;
int date=calendar.get(Calendar.DATE);
System.out.println("year:"+year+"\tmouth:"+month+"\tdate:"+date);//三年后的十天前
Date getTime();
返回一个Date表示日历的时间。
Calendar calendar=Calendar.getInstance();
Date D=calendar.getTime();
System.out.println(D);//Mon May 08 15:10:55 CST 2023
SimpleDateFormat
日期和时间格式有日期和时间模式字符串指定,在日期和时间模式字符串中,从‘A’到‘Z’以及从‘a’到‘z’引导的字母被解释为表示日期或时间字符串的组件的模式字母,对应如下:
y 年
M 月
d 日
H 时
m 分
s 秒
无参构造方法
public SimpleDateFormate();
使用默认模式和日期格式。
有参构造方法
public SimpleDateFormate(String pattern);
使用给定模式和默认的日期格式。
格式化(从Date到String)
public final String format(Date date);
将日期格式化为日期时间字符串。
Date d=new Date();
SimpleDateFormat simpleFormatter=new SimpleDateFormat();
String str=simpleFormatter.format(d);
System.out.println(str);//23-5-8 下午3:24
Date d=new Date();
SimpleDateFormat simpleFormatter=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str=simpleFormatter.format(d);
System.out.println(str);//2023年05月08日 15:25:34
解析(从String到Date)
public Date parse(String source);
从给定字符串开始解析文本及生成日期。
要使用带参的构造方法,且带参的构造方法中的格式要与指定字符串的格式相同,否则会抛出异常。
String str="2023年5月8日 15:28:33";
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date;
date=simpleDateFormat.parse(str);//此处要将异常添加到方法名
System.out.println(date);//Mon May 08 15:28:33 CST 2023
LocalDate、LocalTime、LocalDateTime
获取当前的时间
LocalDate d1=LocalDate.now();
LocalTime d2=LocalTime.now();
LocalDateTime d3=LocalDateTime.now();
System.out.println(d1);//2023-05-08
System.out.println(d2);//15:45:00.151
System.out.println(d3);//2023-05-08T15:45:00.151
自定义日期
LocalDate d1=LocalDate.of(2023,5,8);
LocalTime d2=LocalTime.of(15,46,33);
LocalDateTime d3=LocalDateTime.of(2023,5,8,15,47,33);
System.out.println(d1);//2023-05-08
System.out.println(d2);//15:46:33
System.out.println(d3);//2023-05-08T15:47:33
日期的加减
LocalDate d1=LocalDate.now();
LocalDate d2=d1.plusDays(1L);//添加一天 2023-05-09
//月份 d1.plusMonths(x); 2023-06-08
//年份 d1.plusYears(x); 2024-05-08
//周数 d1.plusWeeks(x); 2023-05-15
LocalDate d3=d1.minusDays(1L);//减去一天 2023-05-07
//月份 d1.minusMonths(1L); 2023-04-08
//月份 d1.minusYears(1L); 2022-05-08
//月份 d1.minusWeeks(1L); 2023-05-01
小时、分钟、秒、毫秒同理。
日期的指定
LocalDate d1=LocalDate.now();
LocalDate d2=d1.withYear(2026);//指定年份为2026 2026-05-08
//月份 d1.withDate(3); 2023-05-03
//天数 d1.withMonth(3); 2023-03-08
LocalDate d3=d1.withDayOfMonth(20);//指定为当月的第二十天 2023-05-20
获取日期的年月日周时分秒
LocalDateTime d = LocalDateTime.now();
int year = d.getYear();//223
Month month = d.getMonth();//5
int monthValue = d.getMonthValue();//MAY
int dayOfMonth1 = d.getDayOfMonth();//8
int hour = d.getHour();//16
int minute = d.getMinute();//6
int second = d.getSecond();//32
int nano = d.getNano();//785000000(纳秒)
日期的比较与Date类相似
- date1.isBefore(date2)
- date1.isAfter(date2)
- date1.isEqual(date2)
- date1.isLeapYear(date2)//判断是否为闰年
计算时间间隔
Duration:用于计算两个LocalDateTime对象的时间间隔。
LocalDateTime d1 = LocalDateTime.of(2022,2,1,10,10,10);
LocalDateTime d2 = LocalDateTime.of(2023,2,5,20,20,20);
Duration duration=Duration.between(d1,d2);
System.out.println(duration.toDays());
System.out.println(duration.toHours());
System.out.println(duration.toMinutes());
System.out.println(duration.toMillis());
日期格式化:将时间对象转换为日期字符串
LocalDateTime d1 = LocalDateTime.now();
DateTimeFormatter dateTimeFormatter=DateTimeFormatter.ofPattern("yyyy-MM-dd HH-mm-ss");
System.out.println(dateTimeFormatter.format(d1));//2023-05-08 16-22-50
解析:将时间字符串转化为日期对象
String str = "2023-05-08";//对应的是MM-dd,所以5和8前面要加‘0’
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate d1 = LocalDate.parse(str, dateTimeFormatter);
System.out.println(d1);
格式化同类型的对象:将日期对象格式化为日期对象
//将d1转换为dateTimeFormatter规定类型的,字符串类型str
LocalDateTime d1=LocalDateTime.now();
DateTimeFormatter dateTimeFormatter=DateTimeFormatter.ofPattern("yyyy-MM-dd HH-mm-ss");
String str=dateTimeFormatter.format(d1);
//将d2解析字符串str
LocalDateTime d2=LocalDateTime.parse(str,dateTimeFormatter);
System.out.println(d1);//2023-05-08T16:36:44.101
System.out.println(d2);//2023-05-08T16:36:44
LocalDate转为Date
//LocalDate转为Date
LocalDate d1=LocalDate.now();
Date d2=Date.from(d1.atStartOfDay(ZoneOffset.systemDefault()).toInstant());
System.out.println(d2);//Mon May 08 00:00:00 CST 2023
LocalDateTime d3=LocalDateTime.now();
Date d4=Date.from((d3.atZone(ZoneOffset.ofHours(8))).toInstant());
System.out.println(d4);//Mon May 08 16:44:34 CST 2023
Date转为LocalDate
Date d1=new Date();
LocalDate d2=d1.toInstant().atZone(ZoneOffset.systemDefault()).toLocalDate();
System.out.println(d2);//2023-05-08
LocalDateTime d3=d1.toInstant().atZone(ZoneOffset.systemDefault()).toLocalDateTime();
System.out.println(d3);//2023-05-08T16:48:00.458