Java 日期時間查詢

2018-03-12 14:52 更新

Java日期時間查詢


所有datetime類都支持查詢,查詢是對信息的請求。

我們可以從datetime對象獲取日期時間組件,例如,我們可以從LocalDate獲取年份。

查詢請求不可用作組件的信息。 例如,我們可以查詢LocalDate以查看它是否為星期一。 查詢的結(jié)果可以是任何類型。

TemporalQuery<R> 接口表示一個查詢。

所有datetime類都有一個query()方法,TemporalQuery作為參數(shù)。

TemporalQueries 類包含幾個預(yù)定義的查詢。

如果datetime對象沒有查詢請求的信息,該查詢返回null。

以下代碼顯示如何使用預(yù)定義的查詢。

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.ZonedDateTime;
import java.time.temporal.TemporalQueries;
import java.time.temporal.TemporalQuery;
import java.time.temporal.TemporalUnit;

public class Main {

  public static void main(String[] args) {
    TemporalQuery<TemporalUnit> precisionQuery = TemporalQueries.precision();
    TemporalQuery<LocalDate> localDateQuery = TemporalQueries.localDate();

    // Query a LocalDate
    LocalDate ld = LocalDate.now();
    TemporalUnit precision = ld.query(precisionQuery);
    LocalDate queryDate = ld.query(localDateQuery);
    System.out.println("Precision of  LocalDate: " + precision);
    System.out.println("LocalDate of  LocalDate: " + queryDate);

    // Query a LocalTime
    LocalTime lt = LocalTime.now();
    precision = lt.query(precisionQuery);
    queryDate = lt.query(localDateQuery);
    System.out.println("Precision of  LocalTime: " + precision);
    System.out.println("LocalDate of  LocalTime: " + queryDate);

    // Query a ZonedDateTime
    ZonedDateTime zdt = ZonedDateTime.now();
    precision = zdt.query(precisionQuery);
    queryDate = zdt.query(localDateQuery);
    System.out.println("Precision of  ZonedDateTime:  " + precision);
    System.out.println("LocalDate of  ZonedDateTime:  " + queryDate);

  }
}

上面的代碼生成以下結(jié)果。

自定義查詢

我們可以通過兩種方式創(chuàng)建自定義查詢。

  • 實現(xiàn)TemporalQuery接口
  • 使用方法引用作為查詢。該方法應(yīng)該接受一個TemporalAccessor并返回一個對象。
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.TemporalQuery;

public class Main {

  public static void main(String[] args) {
    LocalDate ld1  = LocalDate.of(2013, 12,1);
    Boolean  is = ld1.query(new Monday1Query()); 
    System.out.println(is);

  }
}

class Monday1Query implements TemporalQuery<Boolean> {
  @Override
  public Boolean queryFrom(TemporalAccessor temporal) {
    if (temporal.isSupported(ChronoField.DAY_OF_MONTH)
        && temporal.isSupported(ChronoField.DAY_OF_WEEK)) {
      int dayOfMonth = temporal.get(ChronoField.DAY_OF_MONTH);
      int weekDay = temporal.get(ChronoField.DAY_OF_WEEK);
      DayOfWeek dayOfWeek = DayOfWeek.of(weekDay);
      if (dayOfMonth == 1 && dayOfWeek == DayOfWeek.MONDAY) {
        return Boolean.TRUE;
      }
    }
    return Boolean.FALSE;
  }
}

上面的代碼生成以下結(jié)果。



例2

以下代碼使用方法引用重寫上面的代碼。

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAccessor;

public class Main {

  public static void main(String[] args) {
    LocalDate ld1  = LocalDate.of(2013, 12,   1);
    Boolean  is = ld1.query(Main::queryFrom);
    System.out.println(is);
  }
  public static Boolean queryFrom(TemporalAccessor temporal) {
    if (temporal.isSupported(ChronoField.DAY_OF_MONTH)
        && temporal.isSupported(ChronoField.DAY_OF_WEEK)) {
      int dayOfMonth = temporal.get(ChronoField.DAY_OF_MONTH);
      int weekDay = temporal.get(ChronoField.DAY_OF_WEEK);
      DayOfWeek dayOfWeek = DayOfWeek.of(weekDay);
      if (dayOfMonth == 1 && dayOfWeek == DayOfWeek.MONDAY) {
        return Boolean.TRUE;
      }
    }
    return Boolean.FALSE;
  }
}

上面的代碼生成以下結(jié)果。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號