Java IsoFields 类
最后修改时间:2025 年 4 月 16 日
java.time.temporal.IsoFields 类为 ISO-8601 日历系统提供了字段。它实现了基于周的字段,如年中的周和年中的季度。这些字段遵循 ISO 标准定义。
IsoFields 是一个实用程序类,具有静态字段和方法。它与时间对象(如 LocalDate 和 LocalDateTime)一起使用。该类帮助处理基于周和基于季度的日期计算。
IsoFields 类概述
IsoFields 定义了几个表示 ISO 字段的常量。这些包括年中的周、年中的季度和季度中的天。该类提供了访问和操作这些字段的方法。
public final class IsoFields {
public static final TemporalField WEEK_OF_WEEK_BASED_YEAR;
public static final TemporalField WEEK_BASED_YEAR;
public static final TemporalField QUARTER_OF_YEAR;
public static final TemporalField DAY_OF_QUARTER;
public static TemporalUnit WEEK_BASED_YEARS;
public static TemporalUnit QUARTER_YEARS;
}
代码显示了在 IsoFields 中定义的关键字段和单位。这些使您能够使用 ISO 周日期和季度。这些字段可用于 Java.time API 中的各种时间对象。
获取年中的周
ISO 年中的周与标准周编号不同。周从星期一开始,第 1 周包含一年中的第一个星期四。此示例显示了如何获取 ISO 周数。
package com.zetcode;
import java.time.LocalDate;
import java.time.temporal.IsoFields;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2025, 1, 1);
int weekOfYear = date.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);
int weekBasedYear = date.get(IsoFields.WEEK_BASED_YEAR);
System.out.println("Date: " + date);
System.out.println("ISO Week of Year: " + weekOfYear);
System.out.println("ISO Week-Based Year: " + weekBasedYear);
// Edge case - date in different ISO year
LocalDate edgeDate = LocalDate.of(2024, 12, 31);
System.out.println("\nEdge case - Dec 31, 2024:");
System.out.println("ISO Week of Year: " +
edgeDate.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR));
System.out.println("ISO Week-Based Year: " +
edgeDate.get(IsoFields.WEEK_BASED_YEAR));
}
}
此示例演示了 ISO 周编号。请注意,2025 年 1 月 1 日可能属于上一个 ISO 年的第 52 或 53 周。输出显示了正确的 ISO 周和年值。
使用季度
IsoFields 提供了与季度相关的字段。季度编号为 1 到 4,每个季度包含 3 个月。此示例显示了季度操作。
package com.zetcode;
import java.time.LocalDate;
import java.time.temporal.IsoFields;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2025, 5, 15);
int quarter = date.get(IsoFields.QUARTER_OF_YEAR);
long dayOfQuarter = date.get(IsoFields.DAY_OF_QUARTER);
System.out.println("Date: " + date);
System.out.println("Quarter: " + quarter);
System.out.println("Day of Quarter: " + dayOfQuarter);
// Calculate quarter start and end
LocalDate quarterStart = date.with(IsoFields.DAY_OF_QUARTER, 1);
LocalDate quarterEnd = quarterStart.plus(2, IsoFields.QUARTER_YEARS)
.minusDays(1);
System.out.println("Quarter starts: " + quarterStart);
System.out.println("Quarter ends: " + quarterEnd);
}
}
该示例显示了特定日期的季度信息。它计算季度的开始和结束日期。请注意,QUARTER_YEARS 单位用于时间算术。
添加和减去周
基于 ISO 周的年份可用于时间计算。此示例显示了如何在保持 ISO 周编号的同时添加和减去周。
package com.zetcode;
import java.time.LocalDate;
import java.time.temporal.IsoFields;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2025, 1, 1);
System.out.println("Original date: " + date);
// Add 2 weeks
LocalDate plusWeeks = date.plus(2, IsoFields.WEEK_BASED_YEARS);
System.out.println("After adding 2 weeks: " + plusWeeks);
// Subtract 1 week
LocalDate minusWeeks = date.minus(1, IsoFields.WEEK_BASED_YEARS);
System.out.println("After subtracting 1 week: " + minusWeeks);
// Week-based year difference
LocalDate nextYear = LocalDate.of(2026, 1, 1);
long weeksBetween = IsoFields.WEEK_BASED_YEARS.between(date, nextYear);
System.out.println("Week-based years between: " + weeksBetween);
}
}
此示例演示了基于周的计算。这些操作在跨年边界时保持正确的 ISO 周编号。between 方法计算基于周的年之间的差异。
使用 ISO 字段解析日期
ISO 字段可用于日期解析和格式化。此示例显示了如何使用 ISO 周字段创建格式化程序。
package com.zetcode;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.IsoFields;
public class Main {
public static void main(String[] args) {
// Formatter with ISO week fields
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
"YYYY-'W'ww-e");
LocalDate date = LocalDate.of(2025, 1, 1);
String formatted = date.format(formatter);
System.out.println("Formatted date: " + formatted);
// Parsing back
LocalDate parsed = LocalDate.parse("2025-W01-3", formatter);
System.out.println("Parsed date: " + parsed);
// Verify fields
System.out.println("ISO Week: " +
parsed.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR));
System.out.println("Day of Week: " + parsed.getDayOfWeek());
}
}
该示例使用 ISO 周模式格式化和解析日期。模式 'YYYY-'W'ww-e' 代表 ISO 年、周数和星期几。请注意大写 'W' 表示字面量,小写 'w' 表示周数。
计算季度日期
此示例演示了使用 IsoFields 的高级季度计算。它显示了如何查找季度边界并执行基于季度的算术运算。
package com.zetcode;
import java.time.LocalDate;
import java.time.temporal.IsoFields;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2025, 8, 15);
int currentQuarter = date.get(IsoFields.QUARTER_OF_YEAR);
System.out.println("Current quarter: Q" + currentQuarter);
// First day of quarter
LocalDate quarterStart = date.with(IsoFields.DAY_OF_QUARTER, 1);
System.out.println("Quarter starts: " + quarterStart);
// Last day of quarter
LocalDate nextQuarterStart = quarterStart.plus(1, IsoFields.QUARTER_YEARS);
LocalDate quarterEnd = nextQuarterStart.minusDays(1);
System.out.println("Quarter ends: " + quarterEnd);
// Days remaining in quarter
long daysRemaining = quarterEnd.toEpochDay() - date.toEpochDay();
System.out.println("Days remaining in quarter: " + daysRemaining);
// Add two quarters
LocalDate futureDate = date.plus(2, IsoFields.QUARTER_YEARS);
System.out.println("Date after two quarters: " + futureDate);
}
}
该示例显示了全面的季度计算。它查找季度边界,计算剩余天数,并执行基于季度的算术运算。QUARTER_YEARS 单位确保了正确的季度过渡。
将 ISO 字段与其他时间字段组合
ISO 字段可以与标准时间字段组合以进行复杂的查询。此示例显示了混合字段的使用。
package com.zetcode;
import java.time.LocalDate;
import java.time.temporal.IsoFields;
import java.time.temporal.ChronoField;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2025, 12, 31);
// Mixed field access
int year = date.get(ChronoField.YEAR);
int isoWeekYear = date.get(IsoFields.WEEK_BASED_YEAR);
int month = date.get(ChronoField.MONTH_OF_YEAR);
int quarter = date.get(IsoFields.QUARTER_OF_YEAR);
System.out.println("Date: " + date);
System.out.println("Standard year: " + year);
System.out.println("ISO week year: " + isoWeekYear);
System.out.println("Month: " + month);
System.out.println("Quarter: " + quarter);
// Adjust date using mixed fields
LocalDate adjusted = date.with(IsoFields.QUARTER_OF_YEAR, 2)
.with(ChronoField.DAY_OF_MONTH, 15);
System.out.println("Adjusted date: " + adjusted);
// Complex query
boolean isLastWeekOfQuarter =
date.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR) % 13 == 0;
System.out.println("Is last week of quarter: " + isLastWeekOfQuarter);
}
}
此示例将 ISO 字段与标准时间字段结合使用。它演示了如何在查询和调整中混合不同的字段类型。复杂的查询显示了多个字段的实际用法。
来源
在本文中,我们涵盖了 Java IsoFields 类的基本方法和功能。了解这些概念对于在 Java 应用程序中使用 ISO 周日期和季度至关重要。
作者
列出所有Java教程。