JDK8之前的API:
表示特定的瞬间,精确到毫秒。
@Test
public void test(){
Date date = new Date();//创建一个基于当前系统时间的date实例
System.out.println(date);
long millisTime = date.getTime();//使用getTime方法得到long型的毫秒数
System.out.println("对应的毫秒数为:"+millisTime);
Date date2 = new Date(1732867401688L);
System.out.println(date2.toString());//Fri Nov 29 16:08:06 CST 2024
}
java.sql.Data属于java.util.Data类的一个子类,重写了toStirng方法,专门用于与数据库交互,它只包含日期信息,没有时间部分,格式为”yyyy-MM-dd”。
java.sql.Data只有一个带参的构造器,必须传入long类型的实参进行构造。
@Test
public void test1(){
java.sql.Date date = new java.sql.Date(1732867401688L);//只有一个带参的构造器,必须传入实参
System.out.println(date.toString());//2024-11-29
}
java.text.SimpleDateFormat类是一个不与语言环境有关的方式来格式化和解析日期的具体类。
可以进行格式化:日期 --> 文本
可以进行解析:文本 --> 日期
@Test
public void test3() throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
Date date = new Date();
//格式化:日期-->字符串
String str = simpleDateFormat.format(date);
System.out.println(str);//2024/11/29 下午4:10
//解析:字符串-->日期
Date date1 = simpleDateFormat.parse(str);
//产生编译时异常,运用throws抛出
System.out.println(date1);//Fri Nov 29 16:10:00 CST 2024
}
@Test
public void test5(){
Calendar calendar = Calendar.getInstance();//calendar为抽象类,创建抽象类的实例
//调用类中的静态方法getInstance()
System.out.println(calendar.get(Calendar.DAY_OF_WEEK));//6
//在Calendar中,周五为每周第六天、周六为每周第七天,周日为每周第一天
System.out.println(calendar.get(Calendar.MONTH));
//一月为0,...十二月为11
//set方法
calendar.set(Calendar.DAY_OF_WEEK,2);
System.out.println(calendar.get(Calendar.DAY_OF_WEEK));//修改后可以得到结果为2
//add
calendar.add(Calendar.DAY_OF_WEEK,3);
System.out.println(calendar.get(Calendar.DAY_OF_WEEK));//5
calendar.add(Calendar.DAY_OF_WEEK,-2);
System.out.println(calendar.get(Calendar.DAY_OF_WEEK));//3
//getTime
Date date = calendar.getTime();//getTime方法返回一个代表Calendar时间值的Date对象
System.out.println(date);//Tue Nov 26 20:07:57 CST 2024
Date date1 = new Date();
calendar.setTime(date1);
System.out.println(calendar.get(Calendar.DAY_OF_WEEK));//6
}
而Calendar并不比Date好多少。它们面临的问题是:
Java 8 以一个新的开始为 Java 创建优秀的 API。新的日期时间API包含:
说明:新的 java.time 中包含了所有关于时钟(Clock),本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类。
尽管有68个新的公开类型,但是大多数开发者只会用到基础包和format包,大概占总数的三分之一。
因为此三类中没有提供公共的构造器,所以无法用new 的方法创建实例对象。
可以通过如下三种方式创建实例对象:now()、of()、parse()
now:获取当前时间
of:获取特定时间
parse:传入字符串,进行解析,获取实例对象
@Test
public void test2(){
//now()
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDate);//2024-11-29
System.out.println(localTime);//18:07:15.187258600
System.out.println(localDateTime);//2024-11-29T18:07:15.187258600
//of 获取指定日期时间
LocalDate localDate1 = localDate.of(2000,11,8);
LocalDateTime localDateTime1 =
localDateTime.of(2000,11,8,5,20,13);
System.out.println(localDate1);
System.out.println(localDateTime1);
//parse
String STR = "2022-01-01T12:00:00";
LocalDateTime localDateTime2 = LocalDateTime.parse(STR);
System.out.println(localDateTime2);
}
LocalDate 日期;LocalTime 毫秒值;LocalDaeTime 既有日期又有毫秒值。
具有不可变性
@Test
public void test3(){
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.getDayOfMonth());
LocalDateTime localDateTime1 = localDateTime.withDayOfMonth(15);
System.out.println(localDateTime);//体现不可变性
System.out.println(localDateTime1);
}
此时不改变原有对象,而是另外创建新的对象。
now() |
静态方法,返回默认UTC时区的Instant类的对象 |
ofEpochMilli(long epochMilli) |
静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象 |
atOffset(ZoneOffset offset) |
结合即时的偏移来创建一个 OffsetDateTime |
toEpochMilli() |
返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳 |
@Test
public void test4(){
//instant test
//now()
Instant instant = Instant.now();
System.out.println(instant);//2024-11-29T10:20:04.466606300Z
//offset方法,进行时区的偏移
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));//+8
System.out.println(offsetDateTime);//当前时区
//ofEpochMillis(long Millis) 传入毫秒数,得到对应的日期值
Instant instant1 = Instant.ofEpochMilli(1732867401688L);
System.out.println(instant1);//2024-11-29T08:03:21.688Z
//ofEpochMillis()无参时返回以1970-01-01-00:00:00的毫秒数,与Date类中的getTime方法大体相同
long millisTime = instant.toEpochMilli();
long date = new Date().getTime();
System.out.println(millisTime);
System.out.println(date);
}
方 法 |
描 述 |
ofPattern(String pattern) |
静态方法,返回一个指定字符串格式的DateTimeFormatter |
format(TemporalAccessor t) |
格式化一个日期、时间,返回字符串 |
parse(CharSequence text) |
将指定格式的字符序列解析为一个日期、时间 |
@Test
public void test5(){
//格式化
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//自定义pattern模式
LocalDateTime localDateTime = LocalDateTime.now();//创建LocalDateTime实例
String strDateTime = dateTimeFormatter.format(localDateTime);//日期-->字符串,格式化
System.out.println(strDateTime);
TemporalAccessor temporalAccessor = dateTimeFormatter.parse("2022-01-01 12:00:00");
LocalDateTime localDateTime1 = LocalDateTime.from(temporalAccessor);
//字符串-->日期,解析
System.out.println(localDateTime1);
}
}
1、指定时区日期时间:ZondId和ZonedDateTime
、持续日期/时间:Period和Duration
3、Clock:使用时区提供对当前即时、日期和时间的访问的时钟。
4、TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整到“下一个工作日”等操作。 TemporalAdjusters : 该类通过静态方法(firstDayOfXxx()/lastDayOfXxx()/nextXxx())提供了大量的常用 TemporalAdjuster 的实现。