| 字母 | 含义 |
|---|---|
| yyyy | 年 |
| MM | 月 |
| dd | 日 |
| hh | 1-12小时制(1-12) |
| HH | 24小时制(0-23) |
| mm | 分 |
| ss | 秒 |
| S | 毫秒 |
| E | 星期几 |
| D | 一年中的第几天 |
| F | 一月中的第几个星期(会把这个月总共过的天数除以7) |
| w | 一年中的第几个星期 |
| W | 一月中的第几星期(会根据实际情况来算) |
| a | 上下午(am/pm)标识 |
| k | 和HH差不多,表示一天24小时制(1-24) |
| K | 和hh差不多,表示一天12小时制(0-11) |
| z | 表示时区 |
第三代日期类比如:yyyy-MM-dd HH:mm:ss E --------->2022-09-15 07:17:13 星期三
//LocalDateTime.now(); 当前日期+时间
//LocalDate.now(); 当前日期
//LocalTime.now(); 当前时间
//DateTimeFormatter 用于格式化日期
LocalDateTime ldt = LocalDateTime.now(); //1
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");//2
String format = dateTimeFormatter.format(ldt);//3
System.out.println("年=" + ldt.getYear());//年=2022
System.out.println("月=" + ldt.getMonth());//月=JULY
System.out.println("月=" + ldt.getMonthValue());//月=7
System.out.println("日=" + ldt.getDayOfMonth());//日=20
System.out.println("时=" + ldt.getHour());//时=14
System.out.println("分=" + ldt.getMinute());//分=35
System.out.println("秒=" + ldt.getSecond());//秒=51
//提供plus 和minus方法可以对当前日期时间进行加/减
LocalDateTime localDateTime = ldt.plusDays(10);//10天后的日期时间
System.out.println("10天后的日期时间=" + dateTimeFormatter.format(localDateTime));
LocalDateTime localDateTime2 = ldt.minusMinutes(600);//600 分钟前的日期时间
System.out.println("600 分钟前的日期时间=" + dateTimeFormatter.format(localDateTime2));
-
Instant 时间戳(类似于Date,提供了一系列和Date类型转换的方式)
-
lnstant—>Date:
- Date date = Date.from(instant);
-
Date->Instant:
- Instant instant = date.toInstant();
-
//1.通过 静态方法 now() 获取当前时间戳的对象
Instant now = Instant.now();
//2. 通过 from 方法 可以把 Instant 转成 Date
Date date = Date.from(now);
//3. 通过 date 的 toInstant() 方法 可以把 date 转成 Instant 对象
Instant instant = date.toInstant();
提示:第三代日期类很多方法,需要时查API即可
1. LocalDateTime类
2. MonthDay类:检查重复事件是否是闰年
3. 增加日期的某个部分
4. 使用plus方法测试增加时间的某个部分
5. 使用minus方法测试查看一年前和一年后的日期等等…
//这里的 Date 类是在 java.util 包下
//默认输出的日期格式是国外的方式, 因此通常需要对格式进行转换
//1.获取当前系统时间
Date nowTime = new Date();
//2.创建 SimpleDateFormat 对象,将日期指定格式输出
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E");
String format = sdf.format(nowTime);
// String -> Date(使用的sdf日期格式需要和“你给的String日期格式”一样,否则会抛出转换异常)
Date parseDate = sdf.parse("你给的 String");
// Date -> String
String newStringDate = sdf.format(parseDate);
第二代日期类,主要是Calendar类(日历)
//1. Calendar 是抽象类, 构造器是 private 的;
//2. 可以通过 getInstance() 创建实例对象
//3. 提供大量的方法和字段供程序员使用
//4. 如果我们需要按照 24 小时进制来获取时间, Calendar.HOUR ==改成=> Calendar.HOUR_OF_DAY
Calendar c = Calendar.getInstance(); //1.创建日历类对象
System.out.println("年:" + c.get(Calendar.YEAR));//2.获取日历对象的某个日历字段
System.out.println("月:" + (c.get(Calendar.MONTH) + 1));// Why月份 + 1, 因为 Calendar 在返回月份时,是按照 0 开始编号的
System.out.println("日:" + c.get(Calendar.DAY_OF_MONTH));
System.out.println("小时:" + c.get(Calendar.HOUR));
System.out.println("分钟:" + c.get(Calendar.MINUTE));
System.out.println("秒:" + c.get(Calendar.SECOND));
//Calender 没有提供专门的格式化方法,因此程序员需要自己来组合显示(灵活自由):
System.out.println(c.get(Calendar.YEAR) + "-"
+ (c.get(Calendar.MONTH) + 1) + "-"
+ c.get(Calendar.DAY_OF_MONTH) + " "
+ c.get(Calendar.HOUR_OF_DAY) + ":"
+ c.get(Calendar.MINUTE) + ":"
+ c.get(Calendar.SECOND));
第一代、二代日期类的不足分析:
JDK 1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK 1.1引入Calendar类之后被弃用了。
Calendar存在问题是:1)可变性:像日期和时间这样的类应该是不可变的。2)偏移性:Date中的年份是从1900开始的,而月份都从0开始。3)格式化:格式化只对Date有用,Calendar则不行。4)此外,一代、二代日期类线程不安全;不能处理闰秒等(每隔2天,多出1s)。



