一. JDK8之前传统的日期、时间:
1. Datel类
概述:代表时间和日期。
Date构造器:
Date常见方法:
弊端:
- 打印日期对象的格式不满足国人的阅读习惯。==>解决:(SimpleDateFormat的format)。
- 想要封装一个指定的时间点Date对象计算非常麻烦(麻烦不代表不能做)。==>解决:parse。
- 想要修改Date对象表示的时间点非常麻烦。==>解决:Calendar类。
2. SimpleDateFormat(重要)
概述:
代表简单日期格式化,可以用来把日期对象、时间毫秒格式化成我们想要的格式。
SimpleDateFormat构造器:
public SimpleDateFormat(String pttern)
格式化的时间形式的常用的模式对应关系如下:
占位符 | 含义 |
---|---|
yyyy | 年份占位符 |
MM | 月份占位符 |
dd | 日期占位符 |
HH | 小时占位符 |
mm | 分钟占位符 |
ss | 秒占位符 |
EEEE | 星期占位符(一般不用) |
SimpleDateFormat使用模版:
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒")
代码示例:
public static void main(String[] args) throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
Date now = new Date();
System.out.println("转换的时间:" + simpleDateFormat.format(now));
Date now1 = simpleDateFormat.parse("2000年02月03日 13时14分52秒");
System.out.println("时间戳时间:" + now1);
}
注意:如果格式不匹配模版就会出现异常。
运行结果:
3. Calendar
概述:
代表的是系统此时时间对应的日历,通过它可以单独获取、修改时间中的年、月、日、时、分、秒等。
Calendar日历类的常见方法:
Date类底层就维护了一个毫秒值(对日期进行修改非常麻烦),Calendar类的核心思想就是一个时间点的各个组成部分拆分封装,用哪个就获取哪个。
Calendar类一般用于对时间进行修改,获取(获取指定的某一个字段)
public static Calendar getInstance() : 获取一个表示当前时间点的Calendar对象 多态。
Calendar calendar = Calendar.getInstance();
(1)public int get(int field) : 基于时间字段编号获取时间字段值 Calendar类将时间字段编号封装为了常量
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1; //月份的底层存储方式 从0开始 获取要原基础+1
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(year + "年" + month + "月" + day + "日");
(2)public void set(int field,int value) : 将指定时间字段编号对应的内容修改为value值 [知结果不知过程]
calendar.set(Calendar.YEAR, 2008);
calendar.set(Calendar.MONTH, 7); //月份的底层存储方式 从0开始 设置要原基础-1
calendar.set(Calendar.DAY_OF_MONTH, 8);
(3)public void add(int field,int amount) : 基于指定时间字段编号的内容进行累加(amount:正数累加 负数累减)
calendar.add(Calendar.YEAR, 3);
calendar.add(Calendar.MONTH, 5);
calendar.add(Calendar.DAY_OF_MONTH, 7);
(4)public Date getTime() : 将Calendar保存的时间转换为Date对象
Date date = calendar.getTime();
二. JDK8开始新增的日期、时间
1. LocalDate、LocalTime、LocalDateTime(重要)
LocalDate: 年月日星期(没有时分秒的概念)
LocalTime : 时分秒纳秒(没有年月日的概念)
LocalDateTime :**年月日星期时分秒纳秒 **
获取核心日期对象的方式有两种(都是静态)
使用格式:
(1) 基于静态方法now()获取表示当前时间的日期对象。
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDate);
System.out.println(localTime);
System.out.println(localDateTime);
运行结果:
(2)基于静态方法of()获取表示指定时间的日期对象 注意:不同的类调用of传递参数需求不一样。
LocalDate targetLocalDate = LocalDate.of(2008, 8, 8); //2008-08-08
LocalTime targetLocalTime = LocalTime.of(20, 8, 8); //20:08:08
LocalDateTime targetLocalDateTime = LocalDateTime.of(2023, 10, 1, 0, 0, 0);
常用的成员方法:
(1)获取日期对象中对应字段的值。
获取日期对象中对应字段的值 非常多 格式:获取哪个字段就在字段名前面加get 例:获取年份 getYear(); 获取月份 getMonth(); 获取日期 getDayOfMonth()。
代码示例:
System.out.println("now对象中的年份数据是 : " + now.getYear());
System.out.println("now对象中的月份数据是 : " + now.getMonth()); //补:获取纯数字 getMonthValue();
System.out.println("now对象中的日期数据是 : " + now.getDayOfMonth());
(2)修改日期对象中对应字段的值。
修改日期对象中对应字段值 [知结果不知过程] 非常多 格式:修改哪个字段就在字段名前面加with 例:修改年份 withYear()。
代码示例:
LocalDateTime resultLocalDateTime = now.withMonth(12).withDayOfMonth(25).withHour(18).withMinute(0).withSecond(0);
System.out.println("修改后的日期对象时间是 : " + resultLocalDateTime);
(3)累加/累减日期对象中对应字段的值。
累加/累减日期对象中的字段值 [知过程不知结果] 非常多 格式:针对于哪个字段累加就在字段名前面加plus/minus 例:累加年 plusYears() 减少月 minusMonths()
LocalDateTime resultLocalDateTime2 = resultLocalDateTime.plusMonths(4).minusDays(4);
System.out.println("累加/累减后的日期对象时间是 : " + resultLocalDateTime2);
注意事项:由于新的日期类是不可变的,所以在进行了修改,累加/累减操作后,一定要记得接收结果。在修改或者是累减累减过程可以基于链式编程完成多次操作。
2. DateTimeFormatter(重要)
概述:格式化LocalDateTime的时间格式。
日期变字符串:
//使用DateTimeFormatter,日期变字符串(DateTimeFormatter.format返回字符串)
LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");
System.out.println(dateTimeFormatter.format(localDateTime));
字符串变日期:
字符串变日期的时候,根据实际需要调用对应parse()的方法,插入模版和字符串进行转换,具体格式如下:
//使用DateTimeFormatter,字符串变日期
LocalDate localDate1 = LocalDate.parse("2000年02月03日", DateTimeFormatter.ofPattern("yyyy年MM月dd日"));
System.out.println(localDate1);
3. ZoneID
概述:
ZoneID时区:l由于世界各个国家与地区的经度不同,各地区的时间也有所不同,因此会划分为不同的时区。
ZoneId 时区的常见方法:
ZonedDateTime带时区的常用方法:
4. Instant
概述:通过获取Instant的对象可以拿到此刻的时间,该时间由两部分组成:从1970-01-01 00:00:00 开始走到此刻的总秒数 +不够1秒的纳秒数。
常用方法:
作用:
- 可以用来记录代码的执行时间,或用于记录用户操作某个事件的时间点。
- 传统的Date类,只能精确到毫秒,并且是可变对象;
- 新增的Instant类,可以精确到纳秒,并且是不可变对象,推荐用Instant代替Date。
5. Period(一段时间)
可以用于计算两个LocalDate对象相差的年数、月数、天数。
常用方法:
代码示例
//Period可以表示一段时间,可以基于计算机获取结果,也可以手动封装一段时间。
//public static Period of(int year,int month,int days)
Period p1 = Period.of(10,3,5);
//between(LocalDate start,LOcalDate end):计算两个时间日期的差值
Period p2 = Period.between(LocalDate.of(2008,Month.AUGUST,8),LocalDate.now);
//基于计算时间差的Period对象调用获取相差的时间
System.out.println(p2.getYear+p2.getMonth+p2.getDays);
6. Duration(持续时间)
概述:可以用于计算两个时间对象相差的天数、小时数、分数、秒数、纳秒数;支持LocalTime、LocalDateTime、Instant等时间。
常用方法: