java.util包
把1970年1月1日当做了时间原点,以毫秒值为单位
SimpleDateFormat 格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化
JDK8版本
| 字母 | 日期或时间元素 | 示例 |
|---|---|---|
| y | 年 | 1970;07 |
| Y | 周年[当这周跨年时,这周算下一年] | 2009;09 |
| M | 年中的月份 | July;Jul;01 |
| w | 年中的周数 | 27 |
| W | 月份中的周数 | 2 |
| D | 年中的天数 | 189 |
| d | 月份中的天数 | 10 |
| F | 月份中的星期 | 2 |
| E | 星期中的天名 | Tuesday;Tue |
| u | 星期中的天数(1=Monday,…,7=Sunday) | 2 |
| a | AM/PM标记 | PM |
| h | 12时制(1-12 am/pm) | 12 |
| H | 一天中的小时数(0-23) | 0 |
| k | 一天中的小时数(1-24) | 24 |
| K | am/pm中的小时数(0-11) | 0 |
| m | 小时中的分钟 | 30 |
| s | 分钟里的秒数 | 55 |
| S | 毫秒数 | 978 |
Date d1 = new Date();//获取当前系统时间
Date d2 = new Date(92115456);//获取指定毫秒数得到时间
//Date 转换成 String
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E");
String format = sdf.format(d1);
System.out.println("当前日期=" + format);
//String 转换成 Date,使用的 sdf 格式需要和给的String格式一样,否则会抛出异常
String s = "2021年4月20日 20:13:14 星期二";
Date parse = sdf.parse(s);
28.2.二代目
1. Calendar 类(日历)
- 它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法
- Calendar 是一个抽象类,并且构造器是 private,可以通过 getInstance()来获取实例,提供大量的方法和字段提供给开发人员
获取时间:
//创建日历对象
Calendar c = Calendar.getInstance();
//获取日历对象的某个日历字段
System.out.println("年:" + c.get(Calendar.YEAR));
//返回月的时候按照 0 开始编号
System.out.println("月:" + (c.get(Calendar.MONTH)+1));
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));
Calendar 没有专门的格式化方法,所以需要自己来组合显示
设置时间:
月份的下标从 0 开始,设置时同样需要注意,比如我们设置为 2 月 15 日除夕当晚的倒计时的最后一秒: 2018-02-15 23:59:59
可以这样:
Calendar cal = Calendar.getInstance(); // 如果想设置为某个日期,可以一次设置年月日时分秒,由于月份下标从0开始赋值月份要-1 // cal.set(year, month, date, hourOfDay, minute, second); cal.set(2018, 1, 15, 23, 59, 59);
或者也可以单个字段一一设置:
// 或者6个字段分别进行设置,由于月份下标从0开始赋值月份要-1 cal.set(Calendar.YEAR, 2018); cal.set(Calendar.MONTH, Calendar.FEBRUARY); cal.set(Calendar.DAY_OF_MONTH, 15); cal.set(Calendar.HOUR_OF_DAY, 23); cal.set(Calendar.MINUTE, 59); cal.set(Calendar.SECOND, 59); System.out.println(cal.getTime());
时间计算
add方法:
比如 1 月 31 号的时候,月份加一:
Calendar cal = Calendar.getInstance(); cal.set(2018, 1, 31, 8, 0, 0); System.out.println(cal.getTime()); cal.add(Calendar.MONTH, 1); System.out.println(cal.getTime());28.3.三代目
1. LocalDate(日期/年月日)、LocalTime(时间/时分秒)、LocalDateTime(日期时间/年月日时分秒)JDK8加入前面两代日期类的不足分析:
JDK 1.0 中包含了一个java.until.Date类,但是它的大多数方法已经在 JDK 1.1 引入Calendar 类之后被弃用了。
而 Calendar 也存在问题是:
- 可变性:像日期和时间这样的类应该是不变的
- 偏移性:Date 中的年份是从 1970 开始的,而月份都从0开始
- 格式化:格式化只对Date有用,Calendar 则不行
- 线程不安全
LocalDate:只包含日期,可以获取日期字段
LocalTime:只包含时间,可以获取时间字段
LocalDateTime:包含日期+时间,可以获取日期和时间字段
//使用 now() 返回表示当前日期时间的 对象
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
System.out.println("年:" + ldt.getYear());
System.out.println("月:" + ldt.getMonth());
System.out.println("月:" + ldt.getMonthValue());
System.out.println("日:" + ldt.getDayOfMonth());
System.out.println("时:" + ldt.getHour());
System.out.println("分:" + ldt.getMinute());
System.out.println("秒:" + ldt.getSecond());
2. DateTimeFormatter 格式日期类
类似于 SimpleDateFormat
LocalDateTime ldt = LocalDateTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss a");
String format = dateTimeFormatter.format(ldt);
System.out.println(format);
3.Instant 时间戳
类似于Date,提供了一系列和Date类转换的方式
//通过静态方法 now() 获取表示当前时间戳的对象 Instant now = Instant.now(); //通过 from 可以把 Instant 转成 Date Date date = Date.from(now); //通过 Date 的 toInstant() 可以把 date 转成Instant对象 Instant instant = date.toInstant();5. 常用方法
提供 plus() 和 minus() 方法可以对当前时间进行加或者减
LocalDateTime ldt = LocalDateTime.now(); //890天后时间 LocalDateTime localDateTime = ldt.plusDays(890); //3456分钟前时间 LocalDateTime localDateTime1 = ldt.minusMinutes(3456);



