Hướng dẫn và ví dụ Java TemporalQueries
1. TemporalQueries
Lớp TemporalQueries cung cấp các phương thức tĩnh để có được các đối tượng TemporalQuery thông dụng và hữu ích. Các thông tin nhận được từ các TemporalQuery này có thể là:
- Chronology
- LocalDate
- LocalTime
- ZoneOffset
- Precision
- Zone
- ZoneId
Xem thêm bài viết về interface TemporalQuery với các ví dụ cơ bản và tuỳ biến TemporalQuery:
Có 2 cách để truy vấn một đối tượng TemporalAccessor, cách tiếp cận thứ hai được khuyến nghị sử dụng.
// These two lines are equivalent, but the second approach is recommended
information = temporalQuery.queryFrom(temporalAccessor); // (1)
information = temporalAccessor.query(temporalQuery); // (2)
2. TemporalQueries methods
Tất cả các phương thức được cung cấp bởi TemporalQueries đều là tĩnh và trả về một đối tượng TemporalQuery.
public static TemporalQuery<ZoneId> zoneId()
public static TemporalQuery<Chronology> chronology()
public static TemporalQuery<TemporalUnit> precision()
public static TemporalQuery<ZoneId> zone()
public static TemporalQuery<ZoneOffset> offset()
public static TemporalQuery<LocalDate> localDate()
public static TemporalQuery<LocalTime> localTime()
3. precision()
Trả về TemporalQuery<TemporalUnit> để truy vấn đơn vị tính (unit) nhỏ nhất được hỗ trợ bởi một TemporalAcccessor.
public static TemporalQuery<TemporalUnit> precision()
Bảng các lớp thi hành interface TemporalAccessor sẵn có trong JDK và đơn vị tính nhỏ nhất được hỗ trợ.
TemporalAccessor | Precision | isTimeBased() | isDateBased() |
Instant | NANOS | true | false |
LocalDate | DAYS | false | true |
LocalTime | NANOS | true | false |
LocalDateTime | NANOS | true | false |
ZonedDateTime | NANOS | true | false |
OffsetTime | NANOS | true | false |
OffsetDateTime | NANOS | true | false |
ChronoLocalDate | DAYS | false | true |
ChronoLocalDateTime | NANOS | true | false |
ChronoZonedDateTime | NANOS | true | false |
Era | ERAS | false | true |
DayOfWeek | DAYS | false | true |
Month | MONTHS | false | true |
Year | YEARS | false | true |
YearMonth | MONTHS | false | true |
MonthDay | null | ||
ZoneOffset | null |
Ví dụ:
TemporalQueries_precision_ex1.java
LocalDate localDate = LocalDate.now();
TemporalQuery<TemporalUnit> query = TemporalQueries.precision();
TemporalUnit smallestUnit = localDate.query(query); // Can cast to ChronoUnit
ChronoUnit smallestChronoUnit = (ChronoUnit) smallestUnit; // ChronoUnit.DAYS
System.out.println("localDate support smallest unit: " + smallestChronoUnit); // Days
System.out.println(" >> Name: " + smallestChronoUnit.name()); // DAYS
System.out.println(" >> isTimeBased()?: " + smallestChronoUnit.isTimeBased()); // false
System.out.println(" >> isDateBased()?: " + smallestChronoUnit.isDateBased()); // true
Output:
localDate support smallest unit: Days
>> Name: DAYS
>> isTimeBased()?: false
>> isDateBased()?: true
- TemporalAccessor
- TemporalUnit
- ChronoUnit
4. chronology()
Trả về TemporalQuery<Chronology> để lấy thông tin về Chronology (Niên đại) liên hợp với một TemporalAccessor.
public static TemporalQuery<Chronology> chronology()
TemporalAccessor | Return | Note |
ChronoLocalDate | Returns the associated chronology | |
ChronoLocalDateTime | Returns the associated chronology | |
ChronoZonedDateTime | Returns the associated chronology | |
Era | Returns the associated chronology | |
LocalDate |
Return
IsoChronology.INSTANCE | |
LocalDateTime |
Return
IsoChronology.INSTANCE | |
ZonedDateTime |
Return
IsoChronology.INSTANCE | |
OffsetDateTime |
Return
IsoChronology.INSTANCE | |
Month |
Return
IsoChronology.INSTANCE | |
Year |
Return
IsoChronology.INSTANCE | |
YearMonth |
Return
IsoChronology.INSTANCE | |
MonthDay |
Return
IsoChronology.INSTANCE | |
LocalTime | null | Does not represent a date |
OffsetTime | null | Does not represent a date |
ZoneOffset | null | Does not represent a date |
Instant | null | Does not represent a date |
DayOfWeek | null | Shared across chronologies |
TemporalQueries_chronology_ex1.java
TemporalAccessor localDateTime = LocalDateTime.now();
Chronology chronology = localDateTime.query(TemporalQueries.chronology());
System.out.println(chronology.getClass().getName()); // java.time.chrono.IsoChronology
System.out.println(chronology.getId()); // ISO
Tham chiếu của phương thức tĩnh Chronology.from(TemporalAccessor) có thể được sử dụng như một TemporalQuery, nó tương ứng với phương thức này, ngoại trừ nó có thể ném ra ngoại lệ khi việc truy vấn không thu được kết quả.
TemporalQueries_chronology_ex2.java
TemporalQuery<Chronology> query = Chronology::from; // Method reference
// TemporalAccessor object:
TemporalAccessor temporalAccessor = MonthDay.now();
// Throw exception if Chronology cannot be obtained.
Chronology chronology = temporalAccessor.query(query);
System.out.println(chronology.getClass().getName()); // java.time.chrono.IsoChronology
System.out.println(chronology.getId()); // ISO
Output:
java.time.chrono.IsoChronology
ISO
- Chronology
- IsoChronology
- TemporalAccessor
5. localDate()
Trả về một TemporalQuery<LocalDate> để lấy ra thành phần LocalDate từ một đối tượng TemporalAccessor, kết quả truy vấn là null nếu thành phần này không tồn tại.
public static TemporalQuery<LocalDate> localDate()
Ví dụ:
TemporalQueries_localDate_ex1.java
TemporalQuery<LocalDate> query = TemporalQueries.localDate();
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println("zonedDateTime: " + zonedDateTime);
LocalDate localDate = zonedDateTime.query(query);
System.out.println("localDate: " + localDate);
System.out.println();
//
LocalTime localTime = LocalTime.now();
System.out.println("localTime: " + localTime);
localDate = localTime.query(query);
System.out.println("localDate: " + localDate);
Output:
zonedDateTime: 2021-07-10T01:26:20.194520+06:00[Asia/Bishkek]
localDate: 2021-07-10
localTime: 01:26:20.195471
localDate: null
Tham chiếu của phương thức tĩnh LocalDate.from(TemporalAccessor) có thể được sử dụng như một TemporalQuery, nó tương ứng với phương thức này, ngoại trừ nó có thể ném ra ngoại lệ khi việc truy vấn không thu được kết quả.
TemporalQueries_localDate_ex2.java
// Method reference
TemporalQuery<LocalDate> query = LocalDate::from; // Same as: TemporalQueries.localDate();
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println("zonedDateTime: " + zonedDateTime);
LocalDate localDate = zonedDateTime.query(query); // Throw exception if the result cannot be obtained.
System.out.println("localDate: " + localDate);
System.out.println();
//
LocalTime localTime = LocalTime.now();
System.out.println("localTime: " + localTime);
localDate = localTime.query(query); // Throw exception if the result cannot be obtained.
System.out.println("localDate: " + localDate);
6. localTime()
Trả về một TemporalQuery<LocalTime> để lấy ra thành phần LocalTime từ một đối tượng TemporalAccessor, kết quả truy vấn là null nếu thành phần này không tồn tại.
public static TemporalQuery<LocalTime> localTime()
Ví dụ:
TemporalQueries_localTime_ex1.java
TemporalQuery<LocalTime> query = TemporalQueries.localTime();
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println("zonedDateTime: " + zonedDateTime);
LocalTime localTime = zonedDateTime.query(query);
System.out.println("localTime: " + localTime);
System.out.println();
//
LocalDate localDate = LocalDate.now();
System.out.println("localDate: " + localDate);
localTime = localDate.query(query);
System.out.println("localTime: " + localTime);
Output:
zonedDateTime: 2021-07-10T01:45:18.694232+06:00[Asia/Bishkek]
localTime: 01:45:18.694232
localDate: 2021-07-10
localTime: null
Tham chiếu của phương thức tĩnh LocalTime.from(TemporalAccessor) có thể được sử dụng như một TemporalQuery, nó tương ứng với phương thức này, ngoại trừ nó có thể ném ra ngoại lệ khi việc truy vấn không thu được kết quả.
TemporalQueries_localTime_ex2.java
// Method reference
TemporalQuery<LocalTime> query = LocalTime::from; // Same as: TemporalQueries.localTime();
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println("zonedDateTime: " + zonedDateTime);
LocalTime localTime = zonedDateTime.query(query); // Throw exception if the result cannot be obtained.
System.out.println("localTime: " + localTime);
System.out.println();
//
LocalDate localDate = LocalDate.now();
System.out.println("localDate: " + localDate);
localTime = localDate.query(query); // Throw exception if the result cannot be obtained.
System.out.println("localTime: " + localTime);
7. zoneId()
Trả về một TemporalQuery<ZoneId> để lấy thông tin ID múi giờ từ một đối tượng TemporalAccessor. Kết quả của truy vấn này là nghiêm ngặt, nghĩa là nó trả về một ID múi giờ của một khu vực (region), chẳng hạn "Europe/Paris", "GMT-10", "UTC+7", "UT+05:30". Các ID múi giờ dựa trên độ lệch (offset) không được coi là nghiêm ngặt, chẳng hạn "+08:30", "-07".
public static TemporalQuery<ZoneId> zoneId()
Đối tượng TemporalQuery<ZoneId> được trả về từ phương thức này chỉ được sử dụng để truy vấn đối tượng ZonedDateTime hoặc ChroneZonedDateTime và nhận được ZoneId liên hợp với nó. Các truy vấn với các TemporalAccessor khác như OffsetDateTime, LocalDateTime,.. sẽ nhận được kết quả là null.
Nếu bạn cần một truy vấn múi giờ ít nghiêm ngặt hơn, chấp nhận tất cả các loại ID múi giờ bao gồm cả ID múi giờ dựa trên độ lệch (offset), hãy sử dụng phương thức TemporalQueries.zone().
TemporalQueries_zoneId_ex1.java
TemporalQuery<ZoneId> query = TemporalQueries.zoneId();
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println("zonedDateTime: " + zonedDateTime);
ZoneId zoneId = zonedDateTime.query(query);
System.out.println("zoneId: " + zoneId);
System.out.println();
//
OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneId.of("Europe/Paris"));
System.out.println("offsetDateTime: " + offsetDateTime);
zoneId = offsetDateTime.query(query);
System.out.println("zoneId: " + zoneId);
Output:
zonedDateTime: 2021-07-09T23:10:49.446493+06:00[Asia/Bishkek]
zoneId: Asia/Bishkek
offsetDateTime: 2021-07-09T19:10:49.448945+02:00
zoneId: null
- ZoneId
- ZoneOffset
- ChronoZonedDateTime
- ZonedDateTime
- OffsetDateTime
8. offset()
Trả về một TemporalQuery<ZoneOffset> để lấy thông tin độ lệch múi giờ từ một đối tượng TemporalAccessor.
public static TemporalQuery<ZoneOffset> offset()
Ví dụ:
TemporalQueries_offset_ex1.java
TemporalQuery<ZoneOffset> query = TemporalQueries.offset();
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println("zonedDateTime: " + zonedDateTime);
ZoneOffset zoneOffset = zonedDateTime.query(query);
System.out.println("zoneOffset: " + zoneOffset);
System.out.println();
//
OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneId.of("Europe/Paris"));
System.out.println("offsetDateTime: " + offsetDateTime);
zoneOffset = offsetDateTime.query(query);
System.out.println("zoneOffset: " + zoneOffset);
Output:
zonedDateTime: 2021-07-10T00:52:36.066446+06:00[Asia/Bishkek]
zoneOffset: +06:00
offsetDateTime: 2021-07-09T20:52:36.068898+02:00
zoneOffset: +02:00
Tham chiếu của phương thức tĩnh ZoneOffset.from(TemporalAccessor) có thể được sử dụng như một TemporalQuery, nó tương ứng với phương thức này, ngoại trừ nó có thể ném ra ngoại lệ khi việc truy vấn không thu được kết quả.
TemporalQueries_offset_ex2.java
// Method reference
TemporalQuery<ZoneOffset> query = ZoneOffset::from; // Same as: TemporalQueries.offset()
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println("zonedDateTime: " + zonedDateTime);
ZoneOffset zoneOffset = zonedDateTime.query(query); // Throw exception if the result cannot be obtained.
System.out.println("zoneOffset: " + zoneOffset);
System.out.println();
//
OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneId.of("Europe/Paris"));
System.out.println("offsetDateTime: " + offsetDateTime);
zoneOffset = offsetDateTime.query(query); // Throw exception if the result cannot be obtained.
System.out.println("zoneOffset: " + zoneOffset);
- ZoneId
- ZoneOffset
- ChronoZonedDateTime
- ZonedDateTime
- OffsetDateTime
9. zone()
Trả về một TemporalQuery<ZoneId> để lấy thông tin ID múi giờ từ một đối tượng TemporalAccessor. Kết quả của truy vấn này là ôn hoà (lenient), nghĩa là nó chấp nhận tất cả các loại ZoneId. Chẳng hạn: "Europe/Paris", "GMT-10", "UTC+7", "UT+05:30", "+9:30", "-08".
public static TemporalQuery<ZoneId> zone()
TemporalQuery này truy vấn một đối tượng temporalAccessor theo nguyên tắc sau:
- Trả về TemporalQueries.zoneId().queryFrom(temporalAccessor) nếu nó khác null.
- Ngược lại, trả về TemporalQueries.offset().queryFrom(temporalAccessor).
Như vậy, truy vấn một đối tượng ZonedDateTime sẽ trả về zonedDateTime.getZone(), trong khi đó, truy vấn đối tượng OffsetDateTime sẽ trả về offsetDateTime.getOffset().
TemporalQueries_zone_ex1.java
TemporalQuery<ZoneId> query = TemporalQueries.zone();
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println("zonedDateTime: " + zonedDateTime);
ZoneId zoneId = zonedDateTime.query(query);
System.out.println("zoneId: " + zoneId);
System.out.println();
//
OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneId.of("Europe/Paris"));
System.out.println("offsetDateTime: " + offsetDateTime);
zoneId = offsetDateTime.query(query);
System.out.println("zoneId: " + zoneId);
Output:
zonedDateTime: 2021-07-10T00:45:45.503914+06:00[Asia/Bishkek]
zoneId: Asia/Bishkek
offsetDateTime: 2021-07-09T20:45:45.506205+02:00
zoneId: +02:00
Tham chiếu của phương thức tĩnh ZoneId.from(TemporalAccessor) có thể được sử dụng như một TemporalQuery, nó tương ứng với phương thức này, ngoại trừ nó ném ra ngoại lệ khi việc truy vấn không thu được kết quả.
TemporalQueries_zone_ex2.java
// Method referene
TemporalQuery<ZoneId> query = ZoneId::from; // Same as: TemporalQueries.zone()
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println("zonedDateTime: " + zonedDateTime);
ZoneId zoneId = zonedDateTime.query(query); // Throw exception if the result cannot be obtained.
System.out.println("zoneId: " + zoneId);
System.out.println();
//
OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneId.of("Europe/Paris"));
System.out.println("offsetDateTime: " + offsetDateTime);
zoneId = offsetDateTime.query(query); // Throw exception if the result cannot be obtained.
System.out.println("zoneId: " + zoneId);
Output:
zonedDateTime: 2021-07-10T00:45:45.503914+06:00[Asia/Bishkek]
zoneId: Asia/Bishkek
offsetDateTime: 2021-07-09T20:45:45.506205+02:00
zoneId: +02:00
- ZoneId
- ZoneOffset
- ChronoZonedDateTime
- ZonedDateTime
- OffsetDateTime
Các hướng dẫn Java Date Time
- Hướng dẫn và ví dụ Java ZoneId
- Hướng dẫn và ví dụ Java Temporal
- Hướng dẫn và ví dụ Java Period
- Hướng dẫn và ví dụ Java TemporalAdjusters
- Hướng dẫn và ví dụ Java MinguoDate
- Hướng dẫn và ví dụ Java TemporalAccessor
- Hướng dẫn và ví dụ Java JapaneseEra
- Hướng dẫn và ví dụ Java HijrahDate
- UTC, UT và GMT là gì?
- Hướng dẫn và ví dụ Date Time trong Java
- Giờ Tiết kiệm ánh sáng ban ngày (DST) là gì?
- Hướng dẫn và ví dụ Java LocalDate
- Hướng dẫn và ví dụ Java LocalTime
- Hướng dẫn và ví dụ Java LocalDateTime
- Hướng dẫn và ví dụ Java ZonedDateTime
- Hướng dẫn và ví dụ Java ZoneOffset
- Hướng dẫn và ví dụ Java JapaneseDate
- Hướng dẫn và ví dụ Java Duration
- Hướng dẫn và ví dụ Java TemporalQuery
- Hướng dẫn và ví dụ Java TemporalAdjuster
- Hướng dẫn và ví dụ Java ChronoUnit
- Hướng dẫn và ví dụ Java TemporalQueries
Show More
- Các hướng dẫn Java Web Services
- Hướng dẫn lập trình Java Servlet/JSP
- Các hướng dẫn lập trình JavaFX
- Các hướng dẫn lập trình Java SWT
- Các hướng dẫn Java Oracle ADF
- Java cơ bản
- Các hướng dẫn Java Collections Framework
- Các hướng dẫn Java IO
- Các hướng dẫn Struts2 Framework
- Các hướng dẫn Spring Boot
- Các hướng dẫn Spring Cloud
- Các hướng dẫn Maven
- Các hướng dẫn Gradle