0
点赞
收藏
分享

微信扫一扫

Java8新特性(三)新时间日期API


目录

​​一.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());
}

Java8新特性(三)新时间日期API_静态方法

 

四.日期的操纵

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);

}

Java8新特性(三)新时间日期API_默认方法_02

 

 

 

五.解析与格式化

      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);

}

Java8新特性(三)新时间日期API_lambda_03

//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);
}

Java8新特性(三)新时间日期API_默认方法_04

 

 

七.与传统日期处理的转换


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){

}




           

 

 

举报

相关推荐

0 条评论