概括
到JDK1.8为止,Java关于时间与日期的操作已经更新了3代。
- Date
- Calendar
- JDK8提供的新API
- LocalDate
- LocalTime
- LocalDateTime
- ZonedDateTime
:::success
关于时间操作的详细API,可以去看API手册。
搜索这些
- Date:时间类,毫秒级,功能很少,很多都废了
- Calendar:日历类,可以用来计算时间,得到年月日时分秒等数据
- LocalDateTime:新的时间类,更简单的计算时间,更简单的得到拆分的时间信息,更推荐
- SimpleDateFormat :Date格式化
- DateTimeFormatter :LocalDateTime格式化
:::
获取当前时间
(1)System.currentTimeMillis()
获取标准时间,此方法优势是不受时区的影响,但是得到结果是时间戳的格式。System.currentTimeMillis();
(2)Date
```java //获取当前系统时间,Date是这种格式的:Mon Jan 01 10:20:30 CST 1996 Date d1 = new Date();
//通过指定毫秒数得到时间,传入当前时间戳,得到当前时间 Date d2 = new Date(923456723234L);
<a name="CD0jM"></a>
## (3)Calendar
```java
//得到一个日历对象
Calendar calendar= Calendar.getInstance();
//得到当前时间
Date date = calendar.getTime();
//得到当前时间戳,从1970-01-01 0:0:0到现在的毫秒数
long millis = calendar.getTimeInMillis();
(4)LocalDate/Time
//只有日期,没有时间:2022-08-13
LocalDate date = LocalDate.now();
//只有时间,没有日期:22:47:16.854
LocalTime time = LocalTime.now();
//时间日期都有:2022-08-13T22:47:16.854
LocalDateTime dateTime = LocalDateTime.now();
//获取当前日期时间还有时区信息:2022-08-13T22:49:16.886+08:00[Asia/Shanghai]
//ZonedDateTime 一般是不可改变的,这意味着该类的对象执行计算的所有方法都会返回一个新的 ZonedDateTime 实例
ZonedDateTime zonedDateTime = ZonedDateTime.now();
(5)Instant
Instant now = Instant.now();
格式化日期时间成字符串
(1)SimpleDateFormat
Date d1 = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E");
//format:将日期转换成指定格式的字符串,传入一个Date类型就行了
String format = sdf.format(d1);
(2)DateTimeFormatter
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
LocalDateTime dateTime = LocalDateTime.now();
//jdk1.8的新时间那几个有一个format方法,传入一个DateTimeFormatter对象,就行时间格式化成字符串
String format = dateTime.format(formatter);
字符串转成时间对象
(1)转换为Date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss E");
//要被转换的日期字符的格式要和sdf定义的一样
String s = "1996年01月01日 10:20:30 星期一";
Date parse = sdf.parse(s);
(2)转换为LocalDate/Time
String s = "1996-01-01T10:20:30";
//s是LocalDateTime的默认格式的字符串
//parse还可以传入一个DateTimeFormatter对象用来指定日期格式,
LocalDateTime dateTime = LocalDateTime.parse(s);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String s1 = "1996/01/01";
LocalDate date = LocalDate.parse(s,formatter);
//Local系列都是通过parse把字符串变成时间的
得到年月日时分秒信息
(1)LocalDate/Time
(2)Calendar
Calendar calendar = Calendar.getInstance();
calendar.get(Calendar.YEAR); //获取年份
calendar.get(Calendar.MONTH)+1; //获取月份
calendar.get(Calendar.DATE); //获取日
calendar.get(Calendar.HOUR); //时(12小时制)
calendar.get(Calendar.HOUR_OF_DAY); //时(24小时制)
calendar.get(Calendar.MINUTE); //分
calendar.get(Calendar.SECOND); //秒
calendar.get(Calendar.DAY_OF_WEEK); //一周的第几天
//还有很多常量参数,可以自己去看
时间日期的计算
(1)用时间戳加减
有好几种得到时间戳的方法,两个时间戳相减/相加得到一个时间戳,转换成时间。
(2)Calendar
Calendar calendar = Calendar.getInstance();
//当前时间+3月
calendar.add(Calendar.MONTH, 3);
//再+5天
calendar.add(Calendar.DAY_OF_YEAR, 5);
//再-80年
calendar.add(Calendar.YEAR, -80);
//再+10小时
calendar.add(Calendar.HOUR_OF_DAY,10);