目录
一.LocalDate,LocalTime,LocalDateTime
二.Instant时间戳
三. Duration和Period
四.日期的操纵
五.解析与格式化
六.时区的处理
七.与传统日期处理的转换
八.接口中默认方法与静态方法
九.其他新特性
十.重复注解与类型注解
一.LocalDate,LocalTime,LocalDateTime
LocalDate,LocalTime,LocalDateTime类的实例是不可变的对象,分别表示使用ISO-8601日历系统的日期,时间,日期和时间
他们提供了简单的日期或时间,并不包含前面的时间信息。也不包含与时区相关的信息。
注:ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法
方法 | 描述 | 示例 |
now() | 静态方法,根据当前时间创建对象 | LocalDate localDate=LoclaDate.now(); LocalTime localTime=LocalTime.Date();
LocalDateTime localDateTime=LocalDateTime.now(); |
of() | 静态方法,根据指定日期/时间创建对象 | LocalDate localDate=LocalDate.of(2021,03,06); LocalTime localTime=LocalTime.of(16,49,55); LocalDateTime localDateTime=LocalDateTime.of(2021,03,06,16,54,58); |
plusDays plusWeeks plusMonths, plusYears | 向当前的LocalDate对象添加几天,几周,几个月,几年 | |
minusDays minusWeeks minusMonths minusYearss | 从当前LocalDate对象减去几天,几周,几个月几年 | |
plus,minus | 添加或减少一个Duration或Period | |
withDayOfMonth withDayOfYear withMonth withYear
| 将月份天数,年份天数,月份,年数修改为指定的值并返回新的LocalDate对象 | |
getDayOfMonth | 获取月份天数(1-31) | |
getDayOfYear | 获取年份天数(1-366) | |
getDayOfWeek | 获取星期几(返回一个DayOfWeek) | |
getMonth | 获取月份,返回一个Month枚举值 | |
getMonthValue | 获取月份(1-12) | |
getYear | 获取年份 | |
until | 获取两个日期之间的period对象 | |
isBefore,isAfter | 比较两个LocalDate | |
isLeapYear | 判断是否是闰年 | |
相关练习代码
//1.LocalDate LocalTime LocalDatetime
@Test
public void test1() {
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
LocalDateTime ld2 = LocalDateTime.of(2021, 03, 17, 19, 10, 10);
System.out.println("ld2 = " + ld2);
LocalDateTime ld3 = ld2.plusYears(20);
System.out.println("ld3 = " + ld3);
LocalDateTime ld4 = ld3.minusMonths(2);
System.out.println("ld4 = " + ld4);
System.out.println("ld1 = " + ldt.getYear());
System.out.println("ld1 = " + ldt.getMonthValue());
System.out.println("ld1 = " + ldt.getDayOfMonth());
System.out.println("ld1 = " + ldt.getHour());
System.out.println("ld1 = " + ldt.getMinute());
System.out.println("ld1 = " + ldt.getSecond());
}
二.Instant时间戳
用于"时间戳"的运算。它是以Unix元年(传统的设定为UTC时区19071月1日午夜时分),开始所经历的描述进行运算。
@Test
public void test2() {
Instant ins = Instant.now();//默认使用UTC时区
System.out.println("ins = " + ins);
OffsetDateTime odt = ins.atOffset(ZoneOffset.ofHours(8));
System.out.println(odt);
System.out.println(ins.getNano());
Instant ins2 = Instant.ofEpochMilli(5);
System.out.println("ins2 = " + ins2);
}
三. Duration和Period
Duration:用于计算两个"时间"间隔
Period:用于计算两个日期间隔
//Duration:用于计算两个时间间隔
//Period:用于计算日期间隔
@Test
public void test3(){
Instant ins1=Instant.now();
System.out.println("-----------------");
try {
Thread.sleep(1000);
} catch (Exception e) {
}
Instant ins2=Instant.now();
System.out.println("所耗费的时间为:"+Duration.between(ins1,ins2));
System.out.println("--------------------------");
LocalDate ld1=LocalDate.now();
LocalDate ld2=LocalDate.of(2011,1,1);
Period period=Period.between(ld1,ld2);
System.out.println("period.getYears() = " + period.getYears());
System.out.println("period.getMonths() = " + period.getMonths());
System.out.println("period.getDays() = " + period.getDays());
}
四.日期的操纵
TemporalAdjuster:时间校正器。有时候我们可能需要获取例如:将日期调整到"下个周日"等操作
TemporalAdjusters:该类通过静态方法提供了大量的常用TemporalAdjuster的实现。
例如获取下个周日:
LocalDate nextSunday=LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
//4.TemporalAdjuster:时间校正器
@Test
public void test4(){
LocalDateTime ldt=LocalDateTime.now();
System.out.println(ldt);
LocalDateTime ldt2=ldt.withDayOfMonth(10);
System.out.println(ldt2);
LocalDateTime ldt3=ldt2.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
System.out.println(ldt3);
//自定义:下一个工作日
LocalDateTime ldt5 = ldt.with(
l -> {
LocalDateTime ldt4 = (LocalDateTime) l;
DayOfWeek dow = ldt4.getDayOfWeek();
if (dow.equals(DayOfWeek.FRIDAY)) {
return ldt4.plusDays(3);
} else if (dow.equals(DayOfWeek.SATURDAY)) {
return ldt4.plusDays(2);
} else {
return ldt4.plusDays(1);
}
}
);
System.out.println(ldt5);
}
五.解析与格式化
java.Time.format.DateTimeFormatter类,该类提供三种格式化的方法:
预定义的标准格式
语言环境相关的格式
自定义的格式
六.时区的处理
Java8中加入了对时区的支持,带时区的时间分别为: ZonedDate,Zonedtime,ZonedDateTime
其中每个时区都对应着ID,地区ID都为"{区域}/{城市}"的格式 例如:Asia/Shanghai等
ZoneId:该类包含了所有的时区信息
getAvailableZoneIds():可以获取所有时区时区信息
of(id):用于指定时区信息获取ZoneId对象
//获取所有的时区
@Test
public void test6(){
Set<String> set=ZoneId.getAvailableZoneIds();
set.forEach(System.out::println);
}
//ZonedDate ZonedTime ZonedDateTime :带时区的时间或日期
@Test
public void test7(){
LocalDateTime ldt=LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
System.out.println(ldt);
ZonedDateTime zdt=ZonedDateTime.now(ZoneId.of("US/Pacific"));
System.out.println("zdt = " + zdt);
}
七.与传统日期处理的转换
类 | To遗留类 | From遗留类 |
java.time.Instant java.util.Date | Date.from(instant) | date.toInsatnt() |
java.time.Instant java.sql.Timestamp | Timestamp.from(instant) | timestamp.toInsatnt() |
java.time.Zoned.DateTime java.Util.GregorianCalendar | GregorianCalendar.from(zonedDate.Time) | date.toLocalDate() |
java.time.LocalDate java.sql.Timestamp | Date.value(localDate) | date.toLocalTime() |
java.time.LocalDateTime java.sql.Timestamp | Timestamp.valueOf(localDateTime) | timestamp.toLocalDateTime() |
java.time.Zoneid java.util.TimeZone | Timezone.getTimeZone(id) | timeZone.toZoneId() |
java.time.format.DateTimeFormatter java.text.DateFormat | formatter.toFormat() | 无 |
| | |
八.接口中默认方法与静态方法
接口中的默认方法
java 8允许接口中包含具有具体实现的方法,该方法称为"默认方法",默认方法使用default关键子修饰
例如:
interface MyFun<T>{
T func(int a);
default String getName(){
return "Hello Java8";
}
}
接口中的默认方法
接口中默认方法的"类优先"原则
若一个接口定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时
选择父类中的方法,如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略。
接口冲突。如果一个父类接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法),那么必须
覆盖该方法来解决冲突
接口默认方法的“类优先”原则
interface Myfunc{
default String getName(){
return "Hello Java8!"
}
}
interface Named{
default String getName(){
return "Hello atguigu!"
}
}
class MyClass implements MyFunc,Nmaed{
public String getName(){
return Named.super.getName();
}
}
接口中的静态方法
Java8,接口中允许,添加静态方法
例如:
interface Named{
public Inter myFun();
default String getName(){
return "Hello atguigu!";
}
static void show(){
System.out.println("Hello Lambda");
}
}
九.其他新特性
Optional类
Optional<T>类(Java.util.Optional)是一个容器类,代表一个值存在或者不存在。
原来用null表示一个值不存在,现在Optional可以更好的表达这个概念。并且可以避免空指针异常
常用方法:
Optional.of(T t) :创建一个Optional实例
Optional.empty():创建一个空的Optional实例
Optional.ofNullable(T t):若t不为null,创建Optional实例,否则创建空实例
isPresent():判断是否包含
orElse(T t):如果调用对象包含值,返回该值,否则返回t
orElseGet(Supplier s):如果调用对象包含值,返回该值,否则返回s获取的值
map(Function f):如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty();
flatMap(Function mapper):与map 类似,要求返回值必须是Optional
十.重复注解与类型注解
Java 8对注解处理提供了两点改进:可重复注解及可用于类型的注解
@Target({TYPE,FIELD,METHED,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotations{
MyAnnotation[] value();
}
@Repeatable(MyAnnotations.class)
@Target({TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE,ElementType.TYPE_PARAMTER})
@Retention(Retention.RUNTIME)
public @interface MyAnnotations{
String value();
}
@MyAnnotation("Hello")
@MyAnnotation("World")
public void show( @MyAnnotation("abc")String str){
}