Java8 新的日期和时间API(笔记)

java

  • LocalDate LocalTime Instant duration以及Period
  • 使用LocalDate和LocalTime

//2017-03-20

LocalDate date = LocalDate.of(2017, 3, 20);

int year = date.getYear();//2017 返回年份

Month month = date.getMonth();//MARCH 返回月份 3月

int dayOfMonth = date.getDayOfMonth();//20 返回月中的第几天

DayOfWeek dayOfWeek = date.getDayOfWeek();//MONDAY 返回星期几

int len = date.lengthOfMonth();//31 返回这个月有多少天

boolean leapYear = date.isLeapYear(); //false 是否是闰年

//获取系统时间

LocalDate now = LocalDate.now(); //相当于 new Date()

//14:33:45

LocalTime time = LocalTime.of(14, 33, 45);

int hour = time.getHour();//时

int minute = time.getMinute();//分

int second = time.getSecond();//秒

//还可以通过解析代表他们的字符串创建.

LocalDate date = LocalDate.parse("2017-03-20");

LocalDate dateTime = LocalDate.parse("14:33:20");

  • 合并日期和时间

LocalDate date = LocalDate.of(2017, 3, 20);

LocalTime time = LocalTime.of(14, 33, 45);

LocalDateTime dateTime = LocalDateTime.of(2017, 3, 20, 14, 41, 40);

LocalDateTime dateTime1 = LocalDateTime.of(date, time);

LocalDateTime dateTime2 = date.atTime(14, 33, 45);

LocalDateTime dateTime3 = date.atTime(time);

LocalDateTime dateTime4 = time.atDate(date);

//从LocalDateTime装换为LocalDate和LocalTime

LocalDate localDate = dateTime.toLocalDate();

LocalTime localTime = dateTime.toLocalTime();

  • 机器的日期和时间格式
  • 操纵,解析和格式化日期

//以直观的方式操作LocalDate属性

LocalDate date = LocalDate.of(2017, 3, 20);//2017-3-20

LocalDate localDate = date.withYear(2011);//2011-3-20

LocalDate localDate1 = localDate.withDayOfMonth(25);//2011-3-25

LocalDate with = localDate1.with(ChronoField.MONTH_OF_YEAR, 9);//2011-9-25

//以相对的方式操作LocalDate属性

LocalDate localDate2 = date.plusWeeks(1);//一周后 2017-03-27

LocalDate localDate3 = localDate2.minusYears(3);//3年前 2014-03-27

LocalDate plus = localDate3.plus(6, ChronoUnit.MONTHS);//6个月后 2014-09-27

下面介绍LocalDate LocalTime LocalDateTime Instant的通用方法:

//Temporal是接口 所有的日期时间类 实现了该接口

//from 依据传入的Temporal对象创建对象实例

//now 依据系统时钟创建Temporal对象

//of 有Temporal对象的某个部分创建该对象的实例

//parse 由字符串创建Temporal对象的实例

//atOffset 将Temporal对象和某个时区偏移相结合

//atZone 将Temporal对象和某个时区相结合

//format 使用某个指定的格式器将Temporal对象转换为字符串(Instant类不提供该方法)

//get 读取Temporal对象的某一部分

//minus 创建Temporal对象的一个副本,通过将当前Temporal对象的值减去一定的时长创建该副本

//plus 创建Temporal对象的一个副本,通过将当前Temporal对象的值加上一定的时长创建该副本

//with 以该Temporal对象为模板,对某些状态进行修改创建该对象的副本

  • 使用TemporalAdjuster 

import java.time.LocalDate;

import static java.time.temporal.TemporalAdjusters.*;

/**

* @author Darcy

* Created by Administrator on 2017/3/20.

*/

public class TestTemporalAdjuster {

public static void main(String[] args) {

LocalDate date = LocalDate.of(2017, 3, 20);

LocalDate date1 = date.with(nextOrSame(DayOfWeek.SUNDAY));//下一个周日 2017-03-26

LocalDate date3 = date1.with(lastDayOfMonth());//当月最后一天 2017-03-31

System.out.println(date3);

}

}

下面是工厂方法介绍:

//dayOfWeekInMonth 创建一个新的日期,它的值为同一个月中每一周的第几天,

//firstDayOfMonth 创建一个新的日期,它的值为当月的第一天

//firstDayOfNextMonth 创建一个新的日期,它的值为下个月的第一天

//firstDayOfNextYear 创建一个新的日期,它的值为明年的第一天

//firstDayOfYear 创建一个新的日期,它的值为当年的第一天

//firstInMonth 创建一个新的日期 它的值同一个月中,第一个符合星期几要求的值

//lastDayOfMonth 创建一个新的日期,它的值为当月的最后一天

//lastDayOfNextMonth 创建一个新的日期,它的值为下个月的最后一天

//lastDayOfNextYear 创建一个新的日期,它的值为明年的最后一天

//lastDayOfYear 创建一个新的日期,它的值为当年的最后一天

//lastInMonth 创建一个新的日期 它的值同一个月中,最后一个符合星期几要求的值

//next/previous 创建一个新的日期 并将其值设定为日期调整后或者调整前,第一个符合指定星期几要求的日期

//nextOrSame/previousOrSame 创建一个新的日期 并将其值设定为日期调整后或者调整前,第一个符合指定星期几要求的日期 如果该日期符合要求,直接返回改对象

定制TemporalAdjuster实现自定义的日期操作

/**

* 定制TemporalAdjuster 能计算明天的日期,同时过滤掉周六和周日

*

* @author Darcy

* Created by Administrator on 2017/3/20.

*/

public class NextWorkingDay implements TemporalAdjuster {

@Override

public Temporal adjustInto(Temporal temporal) {

//读取当天日期

DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));

int dayToAdd = 1;//正常情况下增加一天

if (dow == DayOfWeek.FRIDAY) dayToAdd = 3;

if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;

return temporal.plus(dayToAdd, ChronoUnit.DAYS);

}

}

使用方式:

LocalDate date = LocalDate.of(2017, 3, 20);

LocalDate with = date.with(new NextWorkingDay());

还有2中实现方式:

//或者用lambda表达式 但是这种不利于复用

LocalDate with1 = date.with(temporal -> {

DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));

int dayToAdd = 1;//正常情况下增加一天

if (dow == DayOfWeek.FRIDAY) dayToAdd = 3;

if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;

return temporal.plus(dayToAdd, ChronoUnit.DAYS);

});

//便于复用

TemporalAdjuster nextWorkingDay = TemporalAdjusters.ofDateAdjuster(temporal -> {

//读取当天日期

DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));

int dayToAdd = 1;//正常情况下增加一天

if (dow == DayOfWeek.FRIDAY) dayToAdd = 3;

if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;

return temporal.plus(dayToAdd, ChronoUnit.DAYS);

});

date.with(nextWorkingDay);

  • 打印输出及解析日期-时间对象

LocalDate date = LocalDate.of(2017, 3, 20);

String format = date.format(DateTimeFormatter.BASIC_ISO_DATE);//20170320

String format2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE);//2017-03-20

LocalDate.parse("20170320", DateTimeFormatter.BASIC_ISO_DATE);

LocalDate.parse("2017-03-20", DateTimeFormatter.ISO_LOCAL_DATE);

//按照某种格式创建DateTimeFormatter

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");

String format1 = date.format(dateTimeFormatter);

LocalDate parse = LocalDate.parse(format1, dateTimeFormatter);

//如果需要更加细粒度的控制,DateTimeFormatterBuilder类提供了更复杂的格式器,可以使用 一步一步的构造自己的格式器

DateTimeFormatter formatter = new DateTimeFormatterBuilder()

.appendText(ChronoField.DAY_OF_MONTH)

.appendLiteral(". ")

.appendText(ChronoField.MONTH_OF_YEAR)

.appendLiteral(" ")

.appendText(ChronoField.YEAR)

.parseCaseInsensitive()//对大小写不敏感

.toFormatter(Locale.CHINA);

LocalDate date3 = LocalDate.of(2017, 3, 20);

String format3 = date3.format(formatter); //20. 三月 2017

  • 处理不同时区的历法

//地区ID都为{区域}/{城市}的格式,这些地区集合的设定都由英特网编号分配机构(IANA)的市区数据库提供

ZoneId romeZone = ZoneId.of("Europe/Rome");

//可以通过Java8的新方法 将老的时区装换为ZoneId

ZoneId zoneId = TimeZone.getDefault().toZoneId();

LocalDate date = LocalDate.of(2017, 3, 20);

ZonedDateTime zonedDateTime = date.atStartOfDay(romeZone);

LocalDateTime dateTime = LocalDateTime.of(2017, 3, 20, 14, 41, 40);

ZonedDateTime zonedDateTime1 = dateTime.atZone(romeZone);

Instant now = Instant.now();

ZonedDateTime zonedDateTime2 = now.atZone(romeZone);

//使用别的日历系统

//java8 另外提供了4中其他的日历系统 ThaiBuddhistDate MinguoDate JapaneseDate HijrahDate

ThaiBuddhistDate now1 = ThaiBuddhistDate.now();//ThaiBuddhist BE 2560-03-20

MinguoDate now2 = MinguoDate.now();//Minguo ROC 106-03-20

JapaneseDate now3 = JapaneseDate.now();//Japanese Heisei 29-03-20

HijrahDate now4 = HijrahDate.now();//Hijrah-umalqura AH 1438-06-21

JapaneseDate from = JapaneseDate.from(date); //Japanese Heisei 29-03-20

 

以上是 Java8 新的日期和时间API(笔记) 的全部内容, 来源链接: utcz.com/z/393784.html

回到顶部