Java 日期時(shí)間查詢

2018-03-12 14:52 更新

Java日期時(shí)間查詢


所有datetime類都支持查詢,查詢是對(duì)信息的請(qǐng)求。

我們可以從datetime對(duì)象獲取日期時(shí)間組件,例如,我們可以從LocalDate獲取年份。

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

TemporalQuery<R> 接口表示一個(gè)查詢。

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

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

如果datetime對(duì)象沒(méi)有查詢請(qǐng)求的信息,該查詢返回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é)果。

自定義查詢

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

  • 實(shí)現(xiàn)TemporalQuery接口
  • 使用方法引用作為查詢。該方法應(yīng)該接受一個(gè)TemporalAccessor并返回一個(gè)對(duì)象。
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)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)