日期和时间API
- 1、JDK8之前日期时间API
-
- 1.1 java.lang.System类
- 1.2、 java.util.Date类
-
- 子类:java.sql.Date类
- 1.3、java.text.SimpleDateFormat类
- 1.4、. java.util.Calendar(日历)类
- 2、JDK8中新日期时间API
-
- 2.1 LocalDate、LocalTime、LocalDateTime类
- 2.2、 瞬时:Instant类
- 2.3、java.time.format.DateTimeFormatter类
1、JDK8之前日期时间API
1.1 java.lang.System类
System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。也被称为时间戳。
1.2、 java.util.Date类
@Test
public void test1(){
//空参构造器:创建一个对应当前日期的date对象
Date date = new Date();
System.out.println(date.toString());//Tue Apr 07 09:48:30 CST 2020
System.out.println(date.getTime());//1586224110988 时间戳
//构造器:创建指定毫秒数的date对象
Date date1 = new Date(0L);
System.out.println(date1);
}
子类:java.sql.Date类
@Test
public void test2(){
//构造器
java.sql.Date date = new java.sql.Date(1262346934745L);
System.out.println(date);//2010-01-01
//将java.util.Date对象 转化成 java.sql.Date对象
Date date1 = new Date();
java.sql.Date date2 = new java.sql.Date(date1.getTime());
System.out.println(date2);//2020-04-07
}
1.3、java.text.SimpleDateFormat类
java.text.SimpleDateFormat类是对日期Date类的格式化和解析
格式化:日期—>字符串
解析:格式化的逆过程,字符串—>日期
日期和时间模式 结果
"yyyy.MM.dd G 'at' HH:mm:ss z"
2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy"
Wed, Jul 4, '01
"h:mm a"
12:08 PM
"hh 'o''clock' a, zzzz"
12 o'clock PM, Pacific Daylight Time
"K:mm a, z"
0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa"
02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z"
Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ"
010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"
2001-07-04T12:08:56.235-0700
@Test
public void test3() throws ParseException {
//实例化:空参构造器
SimpleDateFormat sdf = new SimpleDateFormat();
//格式化:日期--->字符串
Date date = new Date();
//System.out.println(date);//Tue Apr 07 12:43:16 CST 2020
//解析:格式化的逆过程,字符串--->日期
String format = sdf.format(date);
System.out.println(format);//20-4-7 下午12:44
//格式化:带参构造器
SimpleDateFormat sdf1 = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//通常使用该格式
String format1 = sdf1.format(date);
System.out.println(format1);//星期二, 7 四月 2020 12:52:12 +0800
String format2 = sdf2.format(date);
System.out.println(format2);//2020-04-07 12:54:51
//解析 字符串--->日期
Date date1 = sdf2.parse("2020-04-07 12:54:51");
System.out.println(date1);//Tue Apr 07 00:54:51 CST 2020
}
1.4、. java.util.Calendar(日历)类
Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能。
获取Calendar实例的方法
- 使用Calendar.getInstance()方法
- 调用它的子类GregorianCalendar的构造器。
@Test
public void test4(){
//实例化
Calendar calendar = Calendar.getInstance();
//常用方法
//1.get()
int days = calendar.get(Calendar.DAY_OF_MONTH);//返回当前日期是该月的第几天
System.out.println(days);
System.out.println(calendar.get(Calendar.DAY_OF_YEAR));//返回当前日期是该年的第几天
//2.set()
calendar.set(Calendar.DAY_OF_YEAR,1000);//设置当前日期为该年的第1000天
//3.add()
calendar.add(Calendar.DAY_OF_YEAR,2);//设置当前日期为该年的第几天 后 +2
//4.getTime():日历类--->Date
Date time = calendar.getTime();
//5.setTime():Date --->日历类
calendar.setTime(new Date());//无返回值
}
2、JDK8中新日期时间API
java.time – 包含值对象的基础包
java.time.chrono – 提供对不同的日历系统的访问
java.time.format – 格式化和解析时间和日期
java.time.temporal – 包括底层框架和扩展特性
java.time.zone – 包含时区支持的类
2.1 LocalDate、LocalTime、LocalDateTime类
这三个类的实例化对象时不可变的
- LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存储 生日、纪念日等日期。
- LocalTime表示一个时间,而不是日期。
- LocalDateTime是用来表示日期和时间的,这是一个最常用的类之一。
方法 | 描述 |
---|---|
now() | 静态方法,根据当前时间创建对象 |
of() | 静态方法,根据指定日期/时间创建对象 |
getDayOfMonth()/getDayOfYear() | 获得月份天数(1-31) /获得年份天数(1-366) |
getDayOfWeek() | 获得星期几(返回一个 DayOfWeek 枚举值) |
getMonth() | 获得月份, 返回一个 Month 枚举值 |
getMonthValue() / getYear() | 获得月份(1-12) /获得年份 |
getHour()/getMinute()/getSecond() | 获得当前对象对应的小时、分钟、秒 |
withDayOfMonth()/withDayOfYear()/ withMonth()/withYear() | 将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象 |
plusDays(), plusWeeks(), plusMonths(), plusYears(),plusHours() | 向当前对象添加几天、几周、几月、几年、几小时 |
minusMonths() / minusWeeks()/ minusDays()/minusYears()/minusHours() | 从当前对象减去几月、几周、几天、几年、几小时 |
@Test
public void test5() {
//实例化 now()
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(date);//2020-04-07
System.out.println(time);//13:58:53.467
System.out.println(dateTime);//2020-04-07T13:58:53.467
//实例化 of()
LocalDateTime localDateTime = LocalDateTime.of(2020, 2, 2, 2, 2, 2);
System.out.println(localDateTime);//2020-02-02T02:02:02
}
2.2、 瞬时:Instant类
Instant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳。
java.time包通过值类型Instant提供机器视图,不提供处理人类意义上的时间 单位。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。 概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒 数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级。
@Test
public void test6(){
//实例化 :now()
Instant instant = Instant.now();
System.out.println(instant);//2020-04-07T07:42:56.965Z 本初子午线时间
//加偏移量,表示东八区 北京时间
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);//2020-04-07T15:45:54.580+08:00
//方法 toEpochMilli()
long epochMilli = instant.toEpochMilli();//获取毫秒数
System.out.println(epochMilli);//1586245671819
//方法:ofEpochMilli():通过给定的毫秒数,获取Instant实例
Instant instant1 = Instant.ofEpochMilli(1586245671819L);
System.out.println(instant1.toString());//2020-04-07T07:47:51.819Z
}
2.3、java.time.format.DateTimeFormatter类
类似于java.text.SimpleDateFormat 用于格式化或解析日期、时间
@Test
public void test7(){
System.out.println(LocalDateTime.now());//2020-04-07T16:09:55.443
//实例化
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//格式化 自定义格式
String format = formatter.format(LocalDateTime.now());
System.out.println(format);//2020-04-07 04:09:55
//解析
TemporalAccessor parse = formatter.parse("2020-04-07 04:09:55");
System.out.println(parse);//{MicroOfSecond=0, SecondOfMinute=55, HourOfAmPm=4, MinuteOfHour=9, NanoOfSecond=0, MilliOfSecond=0},ISO resolved to 2020-04-07
}
注:本文章是根据哔哩哔哩公开课 Java -Java 学习- Java 基础到高级-宋红康-零基础自学Java-尚硅谷 整理所得
大爱康师傅!!