日期类
第一代日期类
Date
JDK1.0就在java.util包下提供了Date类用于表示特定的瞬间,可以精确到毫秒。
大部分方法已经过时,已经被第二代日期类Calendar代替
序号 | 方法定义 | 描述 |
---|---|---|
1 | Date() | 返回一个代表当前系统时间的Date对象,精确到毫秒 |
2 | Date(long date) | 返回一个距离UTC时间date毫秒的新日期对象,精确到毫秒 |
3 | int compareTo(Date anotherDate) | 比较两个日期大小 |
4 | long getTime() | 返回自1970年1月1日00:00:00 GMT以来此Date对象表示的毫秒数 |
5 | String toString() | 把Date对象转换为以下形式的String:dow mon dd hh:mm:ss zzz yyy 其中:dow是一周中的某一天(Sun,Mon,Tue,Wed,Thu,Fri,Sat) |
UTC是一个世界公用时间,每个国家都有自己的本地时间。UTC时间就必然存在一个换算关系。北京时间将比UTC时间快8个小时
世界公用,为啥会说北京时间要快呢?不是该统一么?
譬如,UTC时间是凌晨0点,这时北京时区也知道这时是UTC时间的0点,但是北京时区已经天亮了,处于我们日常的早上8点了,
北京时区的确可以用UTC来计时,但与天色不一致,并不方便本时区居民的日常出行。因此不会按UTC时间的0点来说,而是按北京时间的8点来说。本地时间本质上是为了本地区居民的日常出行方便。
@Test
void DateTest(){
Date date = new Date();
System.out.println("现在系统时间:" + date);
long time = date.getTime();
System.out.println("距离UTC毫秒数:" + time);
}
SimpleDateFormat
可以实现格式化操作,是java.text.DateFormat的子类
序号 | 标记 | 描述 |
---|---|---|
1 | y | 年,年份是4位数字,使用yyyy表示 |
2 | M | 年中的月份,月份是2位数字,使用MM表示 |
3 | d | 月中的天数,天数是2位数字,使用dd表示 |
4 | H | 一天中的小时数(24小时),小时是2位数字,使用HH表示 |
5 | m | 小时中的分钟数,分钟是2位数字,使用mm表示 |
6 | s | 分钟中的秒数,秒是2位数字,使用ss表示 |
7 | S | 毫秒数,毫秒数是3位数字,使用SSS表示(默认1个S也是3为数字) |
SimpleDateFormat类主要将Date日期转换为字符串,或者将某个字符串转换为Date对象
- 常见的方法
方法定义 | 描述 |
---|---|
format | 将一个Date格式转化为日期/时间字符串,此方法继承的父类DateFormat的方法 |
parse | 从给定字符串的开始解析文本,以生成一个日期,此方法继承的父类DateFormat的方法 |
@Test
void SimpleDateFormatTest() throws ParseException {
SimpleDateFormat format =
new SimpleDateFormat("yyyy年MM月dd日HH小时mm分钟ss秒S毫秒");
String str = format.format(new Date());
System.out.println("指定格式日期字符串:" + str);
Date date = format.parse(str);
System.out.println("日期对象:" + date);
}
第二代日期类
Calendar类
java.util.Calendar类是一个抽象类
- 常见方法
序号 | 方法定义 | 描述 |
---|---|---|
1 | static getInstance() | 使用默认时区和语言环境获得一个日历 也可以通过getInstance(TimeZone time,Locale loc)指定时区和语言环境 |
2 | get(int field) | 获取指定的日历字段 |
3 | set( int year, int month, int date, int hourOfDay, int minute, int second) | 设置字段YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE和SECOND的值 |
@Test
void CalendarTest(){
Calendar calendar =
Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai"), Locale.CHINA);
System.out.println("年:" + calendar.get(Calendar.YEAR));
System.out.println("月:" + (calendar.get(Calendar.MONTH) + 1));//1月从0开始
System.out.println("日:" + calendar.get(Calendar.DAY_OF_MONTH));
System.out.println("小时:" + calendar.get(Calendar.HOUR));
System.out.println("分钟:" + calendar.get(Calendar.MINUTE));
System.out.println("秒:" + calendar.get(Calendar.SECOND));
}
第三代日期类
Java8中引入的java.time纠正了过去的缺陷。新的java.time中包含了所有关于本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类。历史悠久类Date类也新增了toInstant()方法
LocalDate
java.time.LocalDate类:代表一个只包含年、月、日的日期对象,如2007-12-03。
序号 | 方法定义 | 描述 |
---|---|---|
1 | static LocalDate now() | 返回默认时区下的当前日期对象 |
2 | int getYear() | 返回年份,从-999999999-01-01~+999999999-12-31 |
3 | int getMonth() | 返回月份,1~12 |
4 | int getDayOfMonth() | 返回日期,1~31 |
5 | LocalDate parse(CharSequence text) | 按默认格式解析字符串为LocalDate的日期对象 |
6 | LocalDate parse(CharSequence text,DateTimeFormatter formatter) | 按指定格式解析字符串为LocalDate的日期对象 |
LocalTime
java.time.LocalTime类:代表一个只包含小时、分钟、秒的日期对象,如13:45.30.123456789。
序号 | 方法定义 | 描述 |
---|---|---|
1 | static LocalTime now() | 返回默认时区下的当前时间对象 |
2 | int getHour() | 返回小时,0~23 |
3 | int getMinute() | 返回分钟,1~59 |
4 | int getSecond | 返回秒,1~59 |
5 | LocalTime parse(CharSequence text) | 按默认格式解析字符串为LocalTime的日期对象 |
6 | LocalDate parse(CharSequence text,DateTimeFormatter formatter) | 按指定格式解析字符串为LocalTime的日期对象 |
LocalDateTime
java.time.LocalDateTime类:代表一个包含年、月、日、小时、分钟、秒的日期对象,如2007-12-03T10:15:30
序号 | 方法定义 | 描述 |
---|---|---|
1 | static LocalDateTime now() | 返回默认时区下的当前日期对象 |
2 | int getYear() | 返回年份,从-999999999-01-01~+999999999-12-31 |
3 | int getMonth() | 返回月份,1~12 |
4 | int getDayOfMonth() | 返回日期,1~31 |
5 | int getHour() | 返回小时,0~23 |
6 | int getMinute() | 返回分钟,1~59 |
7 | int getSecond | 返回秒,1~59 |
8 | LocalDateTime parse(CharSequence text) | 按默认格式解析字符串为LocalDateTime的日期对象 |
9 | LocalDateTime parse(CharSequence text,DateTimeFormatter formatter) | 按指定格式解析字符串为LocalDateTime的日期对象 |
@Test
void LocalDateTimeTest(){
LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
System.out.println("年:" + now.getYear());
System.out.println("月:" + now.getMonth());
System.out.println("日:" + now.getDayOfMonth());
System.out.println("小时:" + now.getHour());
System.out.println("分钟:" + now.getMinute());
System.out.println("秒:" + now.getSecond());
}
Instant类
java.time包通过值类型Instant提供机器视图,Instant类表示时间线上的一点,他表示自1070年1月1日0是0分0秒(UTC)开始的秒数。java.time包基于纳秒计算的,Instant类的精度可以达到纳秒级别。1秒=1000毫秒=106微秒=109纳秒。
序号 | 方法定义 | 描述 |
---|---|---|
1 | satic Instant now() | 静态方法,返回默认UTC时区的Instant类的对象 |
2 | static Instant ofEpochMMilli(long epochMilli) | 静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类对象 |
3 | static OffsetDateTime atOffset(ZoneOffset offset) | 结合即时的偏移来创建一个OffsetDateTime |
4 | long toEpochMilli() | 返回1970-01-01 00:00:00到当前时间的毫秒数,即时间戳 |
@Test
void InstantTest(){
//1.创建一个Instant对象
Instant now = Instant.now();
System.out.println("now = " + now);
//2.转换方法
// 2.1 Instant->Date
Date date = Date.from(now);
System.out.println("date = " + date);
//2.2 Date->Instant
Instant instant = date.toInstant();
System.out.println("instant = " + instant);
}
DateTimeFormatter类
java.time.format.DateTimeFormatter类提供了格式化日期的方法,这个类和第一代日期的SimpleDateFormat类似,但SimpleDateFormat只能格式化Date类,对Calendar类无效。DateTimeFormatter可以格式化LocalDate、LocalTime、LocalDateTime及Instant类。
序号 | 方法定义 | 描述 |
---|---|---|
1 | static DateTimeFormatter ofPattern(String pattern) | 静态方法,返回一个DateTimeFormatter对象 |
2 | String format(TemporalAccessor t) | 格式化一个日期、时间、返回字符串 |
3 | TemporaAccessor parse(CharSequence text) | 将指定格式的字符序列解析为一个日期、时间 |
TemporalAccessor是java.time.temporal包下的接口,LocalDate、LocalTIme、LocalDateTime、Instant都是实现了该接口。
序号 | 标记 | 描述 |
---|---|---|
1 | y | 年,年份是4位数字,使用yyyy表示 |
2 | M | 年中的月份,月份是2位数字,使用MM表示 |
3 | d | 月中的天数,天数是2位数字,使用dd表示 |
4 | H | 一天中的小时数(24小时),小时是2位数字,使用HH表示 |
5 | m | 小时中的分钟数,分钟是2位数字,使用mm表示 |
6 | s | 分钟中的秒数,秒是2位数字,使用ss表示 |
7 | S | 毫秒数,毫秒数是3位数字,使用SSS表示(S表示一位) |
8 | a | am-pm-of-day(判断上午还是下午) |
@Test
void DateTimeFormatterTest(){
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd a hh小时mm分钟ss秒SS");
//格式化日期
String format = dateTimeFormatter.format(now);
System.out.println("format = " + format);
//解析字符串为日期
LocalDateTime parse = LocalDateTime.parse(format,dateTimeFormatter);
System.out.println("parse = " + parse);
}