Java8 新的日期和時間API(筆記)


  • 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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM