Java常用类—jdk8新日期API
JDK8的新日期API的背景
- LocalDate、LocalTime、LocalDateTime的使用
@Test
public void test1(){
/*
LocalDate、LocalTime、LocalDateTime的使用
说明:
1.LocalDateTime相对于LocalDate、LocalTime,使用频率更高
2.类似于Calendar的使用
*/
//now()获取当前时间的生成对象
LocalTime localTime1=LocalTime.now();
LocalDate localDate1=LocalDate.now();
LocalDateTime localDateTime1=LocalDateTime.now();
System.out.println(localDateTime1.toString());
//of()设置某个时间的生成对象,没有偏移量
LocalDateTime localDateTime2=
LocalDateTime.of
(2022,2,19,11,56,10);
LocalDate.of(2022,2,19);
LocalTime.of(11,56,10);
//getXxx(),这里仅展示不做输出
System.out.println(localDate1.getDayOfMonth());//获取月当中第几天
System.out.println(localDate1.getDayOfYear());//获取一年当中第几天
System.out.println(localDate1.getDayOfWeek());//获取一周中的星期几,ps:枚举类
//不可变性的修改方法,即localDate1的时间不变,仍是当前时间,而变的是返回值
//withXxx():设置相关的属性
LocalDate localDate2=localDate1.withDayOfMonth(22);
System.out.println(localDate1);
System.out.println(localDate2);
System.out.println("************************ ");
}
- 瞬时:Instant的使用
@Test
public void test2(){
/*
Instant的使用
类似于java.util.Date类
*/
//now()获取的是本初子午线的时间
Instant instant=Instant.now(); //返回一个实例
System.out.println(instant); //2022-05-07T12:20:01.310Z
//(可以根据时区)添加时间的偏移量
OffsetDateTime offsetDateTime=instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime); //2022-05-07T20:20:01.310+08:00
//toEpochMilli():获取自1970年1月1日0时0分0秒开始的毫秒数
long milli=instant.toEpochMilli(); //类似System.currentTimeMillis(),但这是本初子午线的时间
long milli2=System.currentTimeMillis();
System.out.println(milli); //上下两个不太一样
System.out.println(milli2); //
//ofEpochMilli():通过给定的毫秒数获得Instant实例
Instant instant1 =Instant.ofEpochMilli(1651926239941L); //类似于Date(Long milli)
System.out.println(instant1);
}
- DateTimeFormatter的使用
@Test
public void test3(){
/*
对于LocalDate、localTime、LocalDateTime
格式化类 DateTimeFormatter ,类似于SimpleDateFormat
预定义,3种:
1.ISO_LOCAL_DATE_TIME、ISO_LOCAL_DATE、ISO_DATE_TIME
DateTimeFormatter formatterDateTime=DateTimeFormatter.ISO_LOCAL_DATE_TIME;
2.本地化
-FormatStyle.LONG//MEDIUM//SHORT,适用LocalDateTime
DateTimeFormatter formatterDateTime=DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
-FormatStyle.Full//LONG//MEDIUM//SHORT,适用LocalDate
DateTimeFormatter formatterDate=DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);
3.自定义
自定义格式(可以格式化LocalDateTime,也可以LocalDate)
DateTimeFormatter formatterDateTime1=DateTimeFormatter.ofPattern("yyyy_MM_dd hh:mm:ss,这是我自己的时间");
格式化:日期-->字符串
formatterDateTime.format(localDateTime)
解析: 字符串-->日期
TemporalAccessor parse = formatterDateTime.parse("2022-02-19T10:55:48.914");
*/
//标准格式
DateTimeFormatter formatterDateTime=DateTimeFormatter.ISO_LOCAL_DATE_TIME;
LocalDateTime localDateTime=LocalDateTime.now();
LocalDate localDate=LocalDate.now();
String stringDateTime=formatterDateTime.format(localDateTime);
System.out.println(localDateTime); //2022-05-07T20:49:22.545
System.out.println(stringDateTime); //2022-05-07T20:49:22.545
//解析:字符串-->日期
TemporalAccessor parse = formatterDateTime.parse("2022-02-19T10:55:48.914");
System.out.println(parse.getClass()); //{},ISO resolved to 2022-02-19T10:55:48.914
//没法向下转型,以下均会报错
// localDateTime=(LocalDateTime) parse;
// System.out.println(localDateTime);
// LocalDate localDate= (LocalDate) parse;
// System.out.println(localDate);
// LocalTime localTime= (LocalTime) parse;
// System.out.println(localTime);
//本地化相关格式
//FormatStyle.LONG//MEDIUM//SHORT,适用LocalDateTime
formatterDateTime=DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
System.out.println(formatterDateTime.format(localDateTime)); //2022年5月7日 下午08时49分22秒
formatterDateTime=DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
System.out.println(formatterDateTime.format(localDateTime)); //2022-5-7 20:49:22
formatterDateTime=DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
System.out.println(formatterDateTime.format(localDateTime)); //22-5-7 下午8:49
//FormatStyle.Full//LONG//MEDIUM//SHORT,适用LocalDate
DateTimeFormatter formatterDate=DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);
System.out.println(formatterDate.format(LocalDate.now())); //2022年5月7日 星期六
formatterDate=DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG);
System.out.println(formatterDate.format(LocalDate.now())); //2022年5月7日
formatterDate=DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
System.out.println(formatterDate.format(LocalDate.now())); //2022-5-7
formatterDate=DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT);
System.out.println(formatterDate.format(LocalDate.now())); //22-5-7
//自定义格式(可以格式化LocalDateTime,也可以LocalDate)
DateTimeFormatter formatterDateTime1=DateTimeFormatter.ofPattern("yyyy_MM_dd hh:mm:ss,这是我自己的时间");
DateTimeFormatter formatterDateTime2=DateTimeFormatter.ofPattern("yyyy_MM_dd,这是我自己的时间2");
//格式化
String str1 = formatterDateTime1.format(localDateTime);
String str2 = formatterDateTime2.format(localDate);
System.out.println(str1); //2022_05_07 09:06:40,这是我自己的时间
System.out.println(str2); //2022_05_07,这是我自己的时间2
//解析
TemporalAccessor parse1 = formatterDateTime1.parse("2022_02_19 11:33:31,这是我自己的时间");
System.out.println(parse1); //{MicroOfSecond=0, SecondOfMinute=31, HourOfAmPm=11, MilliOfSecond=0, NanoOfSecond=0, MinuteOfHour=33},ISO resolved to 2022-02-19
TemporalAccessor parse2 = formatterDateTime2.parse("2022_02_19,这是我自己的时间2");
System.out.println(parse2); //{},ISO resolved to 2022-02-19
}
PS:DateTimeFormatter适合格式化,但解析的话不太好用,因为很解析得到LocalDate或者LocalDateTime
解析更适合用LocalDateTime.parse()...
LocalDate date = LocalDate.parse("2022_02_19,这是我自己的时间2", formatterDateTime2);
System.out.println(date);