นี่คือการอัปเดต Java 8 พร้อมรหัสบางส่วนเนื่องจาก GregorianCalendar อาจถูกเลิกใช้หรือลบออกจากเวอร์ชัน JDK ในอนาคต
รหัสใหม่ได้รับการจัดการในWeekFields
คลาสและโดยเฉพาะสำหรับตัวพิมพ์เล็กy
/ ตัวพิมพ์ใหญ่Y
ด้วยตัวเข้าถึงweekBasedYear()
ฟิลด์
ส่งคืนเขตข้อมูลเพื่อเข้าถึงปีของปีที่อิงตามสัปดาห์ตาม WeekFields นี้ นี่แสดงถึงแนวคิดของปีที่สัปดาห์เริ่มต้นในวันของสัปดาห์ที่กำหนดเช่นวันจันทร์และแต่ละสัปดาห์เป็นของหนึ่งปี โดยทั่วไปฟิลด์นี้จะใช้กับ dayOfWeek () และ weekOfWeekBasedYear ()
สัปดาห์ที่หนึ่ง (1) คือสัปดาห์ที่เริ่มต้นใน getFirstDayOfWeek () ซึ่งมีอย่างน้อย getMinimalDaysInFirstWeek () วันในปีนั้น ดังนั้นสัปดาห์ที่หนึ่งอาจเริ่มก่อนต้นปี หากสัปดาห์แรกเริ่มต้นหลังจากต้นปีระยะเวลาก่อนหน้าจะอยู่ในสัปดาห์สุดท้ายของปีก่อนหน้า
ฟิลด์นี้สามารถใช้กับระบบปฏิทินใดก็ได้
ในขั้นตอนการแก้ไขปัญหาของการแยกวิเคราะห์สามารถสร้างวันที่จากสัปดาห์ตามปีสัปดาห์ของปีและวันในสัปดาห์
ในโหมดเข้มงวดช่องทั้งสามจะได้รับการตรวจสอบความถูกต้องตามช่วงของค่าที่ถูกต้อง ช่องสัปดาห์ของปีได้รับการตรวจสอบเพื่อให้แน่ใจว่าปีที่อิงตามสัปดาห์ที่เป็นผลลัพธ์เป็นปีที่ขอตามสัปดาห์
ในโหมดสมาร์ทฟิลด์ทั้งสามช่องจะถูกตรวจสอบเทียบกับช่วงของค่าที่ถูกต้อง ช่องสัปดาห์ตามสัปดาห์มีการตรวจสอบความถูกต้องตั้งแต่ 1 ถึง 53 ซึ่งหมายความว่าวันที่ผลลัพธ์อาจอยู่ในปีที่อิงตามสัปดาห์ถัดไปตามที่ระบุไว้
ในโหมดผ่อนปรนปีและวันในสัปดาห์จะถูกตรวจสอบเทียบกับช่วงของค่าที่ถูกต้อง วันที่ที่เป็นผลลัพธ์จะถูกคำนวณเทียบเท่ากับแนวทางสามขั้นตอนต่อไปนี้ ขั้นแรกให้สร้างวันที่ในวันแรกของสัปดาห์แรกในปีตามสัปดาห์ที่ขอ จากนั้นใช้สัปดาห์ของสัปดาห์ตามปีลบหนึ่งและเพิ่มจำนวนเป็นสัปดาห์ในวันที่ สุดท้ายให้ปรับเปลี่ยนวันในสัปดาห์ที่ถูกต้องภายในสัปดาห์ที่แปล
การตั้งค่าWeekFields
อินสแตนซ์นี้ขึ้นอยู่กับสถานที่และอาจมีการตั้งค่าที่แตกต่างกันขึ้นอยู่กับประเทศในสหรัฐอเมริกาและยุโรปเช่นฝรั่งเศสอาจมีวันที่แตกต่างกันเมื่อเริ่มต้นสัปดาห์
ตัวอย่างเช่นDateFormatterBuilder
Java 8 ให้สร้างอินสแตนซ์ตัววิเคราะห์ด้วยโลแคลและใช้โลแคลนี้สำหรับY
สัญลักษณ์:
public final class DateTimeFormatterBuilder {
...
private void parsePattern(String pattern) {
...
} else if (cur == 'Y') {
appendInternal(new WeekBasedFieldPrinterParser(cur, count));
} else {
...
static final class WeekBasedFieldPrinterParser implements DateTimePrinterParser {
...
private DateTimePrinterParser printerParser(Locale locale) {
WeekFields weekDef = WeekFields.of(locale);
TemporalField field = null;
switch (chr) {
case 'Y':
field = weekDef.weekBasedYear();
if (count == 2) {
return new ReducedPrinterParser(field, 2, 2, 0, ReducedPrinterParser.BASE_DATE, 0);
} else {
return new NumberPrinterParser(field, count, 19,
(count < 4) ? SignStyle.NORMAL : SignStyle.EXCEEDS_PAD, -1);
}
case 'e':
case 'c':
field = weekDef.dayOfWeek();
break;
case 'w':
field = weekDef.weekOfWeekBasedYear();
break;
case 'W':
field = weekDef.weekOfMonth();
break;
default:
throw new IllegalStateException("unreachable");
}
return new NumberPrinterParser(field, (count == 2 ? 2 : 1), 2, SignStyle.NOT_NEGATIVE);
}
...
}
...
}
นี่คือตัวอย่างบางส่วน
System.out.format("Conundrum : %s%n",
ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC"))
.format(DateTimeFormatter.ofPattern("YYYYMMdd'T'HHmms'S'")));
System.out.format("Solution : %s%n",
ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC"))
.format(DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmms'S'")));
System.out.format("JVM Locale first day of week : %s%n",
WeekFields.of(Locale.getDefault()).getFirstDayOfWeek());
System.out.format("US first day of week : %s%n",
WeekFields.of(Locale.US).getFirstDayOfWeek());
System.out.format("France first day of week : %s%n",
WeekFields.of(Locale.FRANCE).getFirstDayOfWeek());
System.out.format("JVM Locale min days in 1st week : %s%n",
WeekFields.of(Locale.getDefault()).getMinimalDaysInFirstWeek());
System.out.format("US min days in 1st week : %s%n",
WeekFields.of(Locale.US).getMinimalDaysInFirstWeek());
System.out.format("JVM Locale min days in 1st week : %s%n",
WeekFields.of(Locale.FRANCE).getMinimalDaysInFirstWeek());
System.out.format("JVM Locale week based year (big Y): %s%n",
ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC")).get(WeekFields.of(Locale.FRANCE).weekBasedYear()));
System.out.format("France week based year (big Y) : %s%n",
ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC")).get(WeekFields.of(Locale.FRANCE).weekBasedYear()));
System.out.format("US week based year (big Y) : %s%n",
ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC")).get(WeekFields.of(Locale.US).weekBasedYear()));
และในเรื่องของสถานที่และกรณีบนY
คุณสามารถเล่นกับตัวเลือกบรรทัดคำสั่ง-Duser.language=
( fr
, en
, es
ฯลฯ ) หรือบังคับให้สถานที่เกิดเหตุในเวลาภาวนา:
System.out.format("English localized : %s%n",
ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC"))
.format(DateTimeFormatter.ofPattern("YYYYMMdd'T'HHmms'S'", Locale.ENGLISH)));
System.out.format("French localized : %s%n",
ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC"))
.format(DateTimeFormatter.ofPattern("YYYYMMdd'T'HHmms'S'", Locale.FRENCH)));