前言:
不断向上成长,你就会活成一道光,谁接近你就是接近光
大家好我是擦擦屁屁闻闻手
,一个有味道
的公众号,让大家久等了,搞了个人博客
,由于也是第一次各种百度,皇天不负有心人,还真给我倒腾出来了,只是有点简约,大家可以去看看,博客地址搭建过程以后整理整理发出来,毕竟知识还得衔接上,闲话少叙,开始我们今天的知识
jdk8之前
- Date类
概述:
java.util.Date 类 表示特定的瞬间
,精确到毫秒
.- 查阅API文档,发现Date拥有多个构造函数,只是
部分已经过时
,但是其中有未过时的构造函数可以把毫秒值转成日期对象
。
- public Date() :分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
- public Date(long date) :分配Date对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即1970年1月1日00:00:00 GMT)以来的指定毫秒数。
由于我们处于东八区,所以我们的基准时间为1970年1月1日8时0分0秒
简单来说:使用无参构造,可以自动设置当前系统时间的毫秒值;指定long类型的构造参数,可以自定义毫秒值时刻.
案例:
public class Test {
public static void main(String[] args) {
Date date=new Date();
System.out.println(date);
System.out.println(new Date(0L));
}
}
Tue May 19 12:46:27 CST 2020
Thu Jan 01 08:00:00 CST 1970
在使用println方法时,会自动调用Date类中的toString方法。Date类对Object类中的toString方法进行了覆盖重写,所以结果为指定格式的字符串。
常用方法就一个:
public long getTime() 把日期对象转换成对应的时间毫秒值。
可以替换成
Systemle类
的静态方法static long currentTimeMillis()
、返回当前时间(以毫秒为单位)
案例:
public class Test {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date.getTime());
System.out.println(System.currentTimeMillis());
}
}
1589864504965
1589864504965
- DateFormat类
-
概述:
java.text.DateFormat 是日期/时间格式化
子类的抽象类
,我们通过这个类可以帮我们完成日期和文本之间的转换
,也就是可以在Date对象与String对象之间进行来回转换
。- 格式化:按照指定的格式,从Date对象转换为String对象。
- 解析:按照指定的格式,从String对象转换为Date对象。
-
构造方法:
由于DateFormat为抽象类
,不能直接使用
,所以需要常用的子类java.text.SimpleDateFormat
。这个类需要一个模式(格式)来指定格式化或解析的标准
。构造方法为:
public SimpleDateFormat(String pattern):用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat,
参数
pattern是一个字符串
,代表日期时间的自定义格式。
格式规则:
标识字母(区分大小写) | 含义 |
---|---|
y | 年 |
M | 月 |
d | 日 |
H | 时 |
m | 分 |
s | 秒 |
案例:
public class Test {
public static void main(String[] args) {
Date date = new Date();
System.out.println("---------格式化前---------");
System.out.println(date);
System.out.println("---------格式化后---------");
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(format.format(date));
}
}
---------格式化前---------
Tue May 19 13:17:51 CST 2020
---------格式化后---------
2020-05-19 13:17:51
常用方法:
- public String format(Date date) :将
Date对象
格式化
为字符串
。 - public Date parse(String source) :将
字符串
解析
为Date对象
。
- public String format(Date date) :将
format方法
案例同上
parse方法
public class Test {
public static void main(String[] args) throws ParseException {
DateFormat df = new SimpleDateFormat("yyyy年MM月dd日");
String str = "2018年12月11日";
Date date = df.parse(str);
System.out.println(date);
}
}
Tue Dec 11 00:00:00 CST 2018
此出告诉我们调用parse方法有可能会抛出异常,我们可以选择
捕获处理
也可以选择继续声明出去
,在此出我们统一选择声明出去
,选择Add
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ZjwEfbu-1589973304332)(https://img.duanyujia.com/wenzhang/20200519132631.jpg)]
- Calendar类
日历我们都见过也就长这样
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4V83WDDd-1589973304335)(https://img.duanyujia.com/wenzhang/20200520091702.jpg)]
概述:
java.util.Calendar是日历类,在Date后出现,替换掉了许多Date的方法
。该类将所有可能用到的时间信息封装为静态成员变量
,方便获取。日历类就是方便获取各个时间属性的。获取方式:
Calendar为抽象类,由于语言敏感性,Calendar类在创建对象时并非直接创建,而是通过静态方法创建,返回子类对象
,如下public static Calendar getInstance() :使用默认时区和语言环境获得一个日历
案例:
public class Test {
public static void main(String[] args) throws ParseException {
Calendar calendar = Calendar.getInstance();
}
}
常用方法:
- public int get(int field) :返回给定日历字段的值。
- public void set(int field, int value) :将给定的日历字段设置为给定值。
- public abstract void add(int field, int amount) :根据日历的规则,为给定的日历字段添加或减去指
定的时间量。 - public Date getTime() :返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。
Calendar类中提供很多成员常量,代表给定的日历字段:
字段值 | 含义 |
---|---|
YEAR | 年 |
MONTH | 月(从0开始,需要+1使用) |
DAY_OF_MONTH | 月中的天(几号) |
HOUR | 时(12小时制) |
HOUR_OF_DAY | 时(24小时制) |
MINUTE | 分 |
SECOND | 秒 |
DAY_OF_WEEK | 周中的天(周几,周日为1,需要-1使用) |
get/set方法:
get方法用来获取指定字段的值,set方法用来设置指定字段的值
案例:
get方法
public class Test {
public static void main(String[] args) {
// 创建Calendar对象
Calendar cal = Calendar.getInstance();
// 获取年
int year = cal.get(Calendar.YEAR);
// 获取月
int month = cal.get(Calendar.MONTH) + 1;
// 获取日
int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
System.out.print(year + "年" + month + "月" + dayOfMonth + "日");
}
}
2020年5月20日
set方法
public class Test {
public static void main(String[] args) {
// 创建Calendar对象
Calendar cal = Calendar.getInstance();
//先设置年
cal.set(Calendar.YEAR,2021);
// 获取年
int year = cal.get(Calendar.YEAR);
// 获取月
int month = cal.get(Calendar.MONTH) + 1;
// 获取日
int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
System.out.print(year + "年" + month + "月" + dayOfMonth + "日");
}
2021年5月20日
add方法:
add方法可以对指定日历字段的值进行加减操作,如果第二个参数为正数则加上偏移量,如果为负数则减去偏移量
public class Test {
public static void main(String[] args) {
// 创建Calendar对象
Calendar cal = Calendar.getInstance();
// 获取年
int year = cal.get(Calendar.YEAR);
// 获取月
int month = cal.get(Calendar.MONTH) + 1;
// 获取日
int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
System.out.println("---------未使用add方法前-----------");
System.out.println(year + "年" + month + "月" + dayOfMonth + "日");
// 使用add方法
cal.add(Calendar.DAY_OF_MONTH, 2); // 加2天
cal.add(Calendar.YEAR,-3); // 减3年
// 获取年
year = cal.get(Calendar.YEAR);
// 获取月
month = cal.get(Calendar.MONTH) + 1;
// 获取日
dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
System.out.println("---------使用add方法后-----------");
System.out.println(year + "年" + month + "月" + dayOfMonth + "日");
}
}
---------未使用add方法前-----------
2020年5月20日
---------使用add方法后-----------
2017年5月22日
getTime方法:
Calendar中的getTime方法并不是获取毫秒时刻,而是拿到对应的Date对象
public class Test {
public static void main(String[] args) {
// 创建Calendar对象
Calendar cal = Calendar.getInstance();
Date date = cal.getTime();
System.out.println(date);
}
}
Wed May 20 09:47:15 CST 2020
西方星期的开始为周日,中国为周一。在Calendar类中,
月份的表示是以0-11代表1-12月
。日期是有大小关系的,时间靠后,时间越大
。
jdk8之后
jdk8之前的日期处理:
- java的java.util.Date和java.util.Calendar类易用性差,不支持时区,并且是可变的,也就意味着他们都不是线程安全的;
- 用于格式化日期的类DateFormat被放在java.text包中,它是一个抽象类,所以我们需要实例化一个SimpleDateFormat对象来处理日期格式化,并且DateFormat也是非线程安全,这意味着如果你在多线程程序中调用同一个DateFormat对象,会得到意想不到的结果。
- 对日期的计算方式繁琐,而且容易出错,因为月份是从0开始的,这意味着从Calendar中获取的月份需要加一才能表示当前月份
jdk8之后的日期处理:
- Java 8的日期和时间类包含
LocalDate、LocalTime、Instant、Duration以及Period
,这些类都包含在java.time包中。 - 增加和减少日期
- 格式化日期,旧的格式化日期以及
SimpleDateFormat
的非线程安全
使其应用非常受限,新的日期API中提供了一个DateTimeFormatter类用于处理日期格式化操作,它被包含在java.time.format包中,Java 8的日期类有一个format()方法用于将日期格式化为字符串,该方法接收一个DateTimeFormatter类型参数: - 时区,Java 8中的时区操作被很大程度上简化了,新的时区类java.time.ZoneId是原有的java.util.TimeZone类的替代品。ZoneId对象可以通过
ZoneId.of()
方法创建,也可以通过ZoneId.systemDefault()
获取系统默认时区
新API基于ISO标准日历系统,java.time包下的所有类都是不可变类型而且线程安全。
编号 | 类名称 | 描述 |
---|---|---|
1 | Instant | 时间戳 |
2 | Duration | 持续时间,时间差 |
3 | LocalDate | 只包含日期,比如:2020-05-20 |
4 | LocalTime | 只包含时间,比如:23:12:10 |
5 | LocalDateTime | 包含日期和时间,比如:2020-05-20 23:12:10 |
6 | Period | 时间段 |
7 | java.time.format.DateTimeFormatter | 时间格式化 |
LocalDate类
LocalDate获取年、月、日、周:
- public int getYear() 获取当前
年份
- public Month getMonth() 获取当前月份的
枚举类型
- public int getMonthValue() 获取当前月份的值
1到12
- public int getDayOfMonth()获取
几号
字段- public DayofWeek getDayOfWeek()获取
星期几
字段的枚举类型,再.getgetValue()
拿到数字星期几
- public int getDayOfYear() 获取
当前日期
是当前年
的第几天
public class Test {
LocalDate localDate = LocalDate.now();
System.out.println("今天的日期:"+localDate);
System.out.println("获取年份:"+localDate.getYear());
System.out.println("获取月份的枚举类型:"+localDate.getMonth());
System.out.println("获取月份:"+localDate.getMonthValue());
System.out.println("获取今天几号:"+localDate.getDayOfMonth());
System.out.println("今天周中的第几天(周几)的枚举类型::"+localDate.getDayOfWeek());
System.out.println("今天是周:"+localDate.getDayOfWeek().getValue());
System.out.println("今天是"+localDate.getYear()+"年的第:"+localDate.getDayOfYear()+"天");
}
}
今天的日期:2020-05-20
获取年份:2020
获取月份的枚举类型:MAY
获取月份:5
获取今天几号:20
今天周中的第几天(周几)的枚举类型::WEDNESDAY
今天是周:3
今天是2020年的第:141天
LocalDate计算未来的年、月、日、周:
public class Test {
public static void main(String[] args) {
LocalDate localDate = LocalDate.now();
System.out.println("两年后的日期:"+localDate.plusYears(2));
System.out.println("两月后的日期:"+localDate.plusMonths(2));
System.out.println("两天后日期:"+localDate.plusDays(2));
System.out.println("两周后日期:"+localDate.plusWeeks(2));
}
}
两年后的日期:2022-05-20
两月后的日期:2020-07-20
两天后日期:2020-05-22
两周后日期:2020-06-03
LocalTime
LocalTime,获取当前系统时间、时、分、秒,精确到纳秒,不包含日期
public class Test {
public static void main(String[] args) {
LocalTime localTime = LocalTime.now();
System.out.println("当前系统时间为:"+localTime);
System.out.println("当前系统时间的时:"+localTime.getHour());
System.out.println("当前系统时间的分:"+localTime.getMinute());
System.out.println("当前系统时间的秒:"+localTime.getSecond());
System.out.println("当前系统时间的纳秒:"+localTime.getNano());
}
}
当前系统时间为:16:08:27.142
当前系统时间的时:16
当前系统时间的分:8
当前系统时间的秒:27
当前系统时间的秒:142000000
LocalTime,计算未来的系统时间的时、分、秒,精确到纳秒,不包含日期
public class Test {
public static void main(String[] args) {
LocalTime localTime = LocalTime.now();
System.out.println("当前系统时间:"+localTime);
System.out.println("获取两小时后的时间" + localTime.plusHours(2));
System.out.println("获取两分之后的时间" + localTime.plusMinutes(2));
System.out.println("获取两秒后的时间" + localTime.plusSeconds(2));
}
}
当前系统时间:16:16:39.695
获取两小时后的时间18:16:39.695
获取两分后的时间16:18:39.695
获取两秒后的时间16:16:41.695
public class Test {
public static void main(String[] args) {
LocalTime localTime = LocalTime.now();
System.out.println("当前系统时间:"+localTime);
System.out.println("获取两小时前的时间" + localTime.minusHours(2));
System.out.println("获取两分前的时间" + localTime.plusMinutes(2));
System.out.println("获取两秒前的时间" + localTime.plusSeconds(2));
}
}
当前系统时间:16:22:30.041
获取两小时前的时间14:22:30.041
获取两分前的时间16:24:30.041
获取两秒前的时间16:22:32.041
LocalDateTime
LocalDateTime:见名知意, 获取系统的日期+时间,其实就是兼容了LocalDate和LocalTime的某些方法,再加上自身的一些方法
public class Test {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("当前系统的日期加时间:" + localDateTime);
System.out.println("当前系统的年:" + localDateTime.getYear());
System.out.println("当前系统的月:" + localDateTime.getMonthValue());
System.out.println("当前系统的日:" + localDateTime.getDayOfMonth());
System.out.println("当前系统的时:" + localDateTime.getHour());
System.out.println("当前系统的分:" + localDateTime.getMinute());
System.out.println("当前系统的秒:" + localDateTime.getSecond());
}
}
当前系统的日期加时间:2020-05-20T16:45:46.343
当前系统的年:2020
当前系统的月:5
当前系统的日:20
当前系统的时:16
当前系统的分:45
当前系统的秒:46
Duration
Duration一般用来时间间隔的处理
public class Test {
public static void main(String[] args) throws InterruptedException {
Instant inst1 = Instant.now();
System.out.println("当前时间 : " + inst1);
//设置秒数加10
Instant inst2 = inst1.plus(Duration.ofSeconds(10));
System.out.println("十秒后的时间 : " + inst2);
//相差秒数转换为毫秒
System.out.println("两个时间相差毫秒数: " + Duration.between(inst1, inst2).toMillis());
//相差秒数
System.out.println("两个时间相差秒数:: " + Duration.between(inst1, inst2).getSeconds());
}
当前时间 : 2020-05-20T09:39:45.470Z
十秒后的时间 : 2020-05-20T09:39:55.470Z
两个时间相差毫秒数: 10000
两个时间相差秒数:: 10
Period
Period类主要是Period类方法getYears(),getMonths()和getDays()来计算.
public class Test {
public static void main(String[] args) throws InterruptedException {
LocalDate today = LocalDate.now();
System.out.println("当前日期 : " + today);
//指定年月日设置日期
LocalDate birthDate = LocalDate.of(1993, Month.OCTOBER, 19);
System.out.println("设置后的日期 : " + birthDate);
Period p = Period.between(birthDate, today);
System.out.println("相差"+ p.getYears()+"年"+ p.getMonths()+"个月" +p.getDays()+"天");
}
}
当前日期 : 2020-05-20
设置后的日期 : 1993-10-19
相差26年7个月1天
DateTimeFormatter
DateTimeFormatter类用于将字符串解析为日期对象
- static ofPattern(String pattern):静态方法,根据指定的字符串设定的格式,将返回一个DateTimeFormatter对象。
- LocalDateTime.parse(strDate,formatter);静态方法,此方法将指定的字符串strDate,按DateTimeFormatter对象的字符串格式解析为一个LocalDateTime对象。
- format(formatter):此方法属于LocalDateTime类的方法。用于将LocalDateTime对象按照DateTimeFormatter指定的格式,转换为一个字符串对象。
public class Test {
public static void main(String[] args) throws InterruptedException {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//将字符串按照DateTimeFormatter对象指定的格式解析为LocalDateTime对象
LocalDateTime date = LocalDateTime.parse("2018-08-18 22:30:22", formatter);
System.out.println(date.toString());
//将LocalDateTime对象按照DateTimeFormatter指定的格式转换为字符串输出
formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd_HH/mm/ss");
String str = date.format(formatter);
System.out.println(str);
}
}
2018-08-18T22:30:22
2018/08/18_22/30/22
其中还有
Instant
时区的处理、ZonedDateTime
、ZoneId
等等,由于不常用这里就不在仔细讲了
愿景:
愿程序永无Bug
本文使用mdnice
排版