JDK8中新的日期类api。在之前虽然也有Date和Calendar日历类,但是处理日期有一定不方便,而且有偏移性(从0开始),并且不是线程安全的,所以JDK8中的新特性之一就是新的日期类,这简化了日期时间的管理。
格式化:日期——>字符串
解析:字符串——>日期
@Test
public void test1(){
Date date = new Date();
System.out.println(date);//Sun Feb 28 04:57:46 CST 2021 格式化
System.out.println(date.getTime());//时间戳,当前日期的毫秒数,1614459466456
//y 代表年
//M 代表月
//d 代表日
//H 代表24进制的小时
//h 代表12进制的小时
//m 代表分钟
//s 代表秒
//S 代表毫秒
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss SSS");
String s = simpleDateFormat.format(date);
System.out.println(s);//2021-02-28 04-57-46 456
try {
Date parse = simpleDateFormat.parse("2021-02-28 04-56-08 504"); 解析
System.out.println(parse);//Sun Feb 28 04:56:08 CST 2021
} catch (ParseException e) {
e.printStackTrace();
}
}
JDK8
一般使用now或者of方法实例化local日期时间对象。
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
@Test
public void TestDate1(){
//now()获取当前日期时间
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();//使用频率更高
System.out.println(localDate);//2021-02-27
System.out.println(localTime);//22:07:09.125
System.out.println(localDateTime);//2021-02-27T22:07:09.125
}
指定时间日期
@Test
public void TestDate2(){
//of()指定日期,没有偏移量
LocalDateTime localDateTime = LocalDateTime.of(2021,1,1,12,12,12);
System.out.println(localDateTime);//2021-01-01T12:12:12
}
获取相关属性
@Test
public void TestDate3(){
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);//2021-02-27T22:22:52.143
System.out.println(localDateTime.getYear());//2021
System.out.println(localDateTime.getDayOfYear());//58
}
设置相关属性
@Test
public void TestDate4(){
//不可变性,不影响本身时间
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);//2021-02-27T22:35:09.096
LocalDateTime localDateTime1 = localDateTime.withDayOfMonth(13);//修改为本月的多少天
System.out.println(localDateTime1);//2021-02-13T22:35:09.096
// LocalDateTime localDateTime1 = localDateTime.withDayOfMonth(40);
// System.out.println(localDateTime1);
// java.time.DateTimeException: 不能超过范围
// Invalid value for DayOfMonth (valid values 1 - 28/31): 40
LocalDateTime localDateTime2 = localDateTime.withDayOfYear(35);//修改为本年的多少天
System.out.println(localDateTime2);//2021-02-04T22:35:09.096
LocalDateTime localDateTime3 = localDateTime.withHour(2);//修改小时
System.out.println(localDateTime3);//2021-02-04T02:35:09.096
}
在原有基础上,添加、减去时间日期。
@Test
public void TestDate5(){
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);//2021-02-27T22:44:33.848
LocalDateTime localDateTime1 = localDateTime.plusHours(2);
System.out.println(localDateTime1);//2021-02-28T00:44:33.848
LocalDateTime localDateTime2 = localDateTime.minusDays(5);
System.out.println(localDateTime2);//2021-02-22T22:46:27.612
}
时间戳,类似于java.util.Date类
@Test
public void test1(){
//时间戳
Instant instant = Instant.now();
System.out.println(instant);//2021-02-27T15:41:40.496Z,标准时间
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8)); //添加偏移量
System.out.println(offsetDateTime);//2021-02-27T23:41:40.496+08:00,东八区
long milli = instant.toEpochMilli();//获取自1970/1/1/00:00:00 开始的毫秒数
System.out.println(milli);//1614440500496
Instant instant1 = Instant.ofEpochMilli(1614439220460L); //通过给定毫秒数,返回时间
System.out.println(instant1);//2021-02-27T15:20:20.460Z
}
格式化或者解析日期时间,类似于SImpleDateFormat,但是这是一个不可变且线程安全的
格式化:日期——>字符串 —— format方法
解析:字符串——>日期 ——parse方法
@Test
public void test3(){
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
String s = dateTimeFormatter.format(LocalDateTime.now());
System.out.println(s);//2021-02-28 04:39:49
TemporalAccessor parse = dateTimeFormatter.parse("2021-02-28 04:37:01");
System.out.println(parse);//{SecondOfMinute=1, MinuteOfHour=37, NanoOfSecond=0, MicroOfSecond=0, MilliOfSecond=0, HourOfAmPm=4},ISO resolved to 2021-02-28
}
@Test
public void test1(){
//预定义的标准格式
DateTimeFormatter isoLocalDate = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
LocalDateTime now = LocalDateTime.now();
String s = isoLocalDate.format(now);//格式化,类型改变 日期——>字符串
System.out.println(now);//2021-02-28T04:41:18.110
System.out.println(s);//2021-02-28T04:41:18.11
TemporalAccessor parse = isoLocalDate.parse("2021-02-28T04:09:40.075");//解析:字符串——>日期
System.out.println(parse);//{},ISO resolved to 2021-02-28T04:09:40.075
}
FUll是LocalDate形式,不能使用LocalDateTime,否则报错
@Test
public void test2(){
//本地化相关
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
LocalDateTime now = LocalDateTime.now();
System.out.println(now);//2021-02-28T04:42:11.793
String s = dateTimeFormatter.format(now);
System.out.println(s);//2021-2-28 4:42:11
String s1 = dateTimeFormatter1.format(now);
System.out.println(s1);//2021年2月28日 上午04时42分11秒
String s2 = dateTimeFormatter2.format(now);
System.out.println(s2);//21-2-28 上午4:42
System.out.println("----------");
DateTimeFormatter dateTimeFormatter3 = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);
LocalDate now1 = LocalDate.now();
System.out.println(now1);//2021-02-28
String format = dateTimeFormatter3.format(now1);
System.out.println(format);//2021年2月28日 星期日
TemporalAccessor parse = dateTimeFormatter3.parse("2021年2月28日 星期日");
System.out.println(parse);//{},ISO resolved to 2021-02-28
//一般使用自定义,除非有要求
}