ฉันต้องการให้วัน (เช่น วันอาทิตย์ที่ 1 วันอังคารที่ 2) ของเดือนนี้เป็นปฏิทิน ฉันจะบรรลุเป้าหมายนี้ด้วยปฏิทินชั้นเรียนใน Android ได้อย่างไร ขอบคุณ.
รับวันเช่นวันอาทิตย์ที่ 1 วันอังคารที่ 2
คำตอบ (1)
java.time และ ThreeTenABP
แก้ไข: โซลูชันที่หรูหราใช้ DateTimeFormatter
:
Locale language = Locale.ENGLISH;
Map<Long, String> ordinalNumber = new HashMap<>(8);
ordinalNumber.put(1L, "1st");
ordinalNumber.put(2L, "2nd");
ordinalNumber.put(3L, "3rd");
ordinalNumber.put(4L, "4th");
ordinalNumber.put(5L, "5th");
DateTimeFormatter dayFormatter = new DateTimeFormatterBuilder()
.appendText(ChronoField.ALIGNED_WEEK_OF_MONTH, ordinalNumber)
.appendPattern(" EEEE 'of the month'")
.toFormatter(language);
LocalDate date = LocalDate.now(ZoneId.of("Pacific/Auckland"));
String dayString = date.format(dayFormatter);
System.out.println("" + date + " is the " + dayString);
เมื่อฉันรันตัวอย่างนี้ ผลลัพธ์ที่ได้คือ:
2019-06-05 เป็นวันพุธที่ 1 ของเดือน
แน่นอนว่าคุณสามารถใส่วันที่ใดก็ได้ที่คุณต้องการ ยกเว้นวันที่วันนี้ในนิวซีแลนด์
แนวคิดเรื่องสัปดาห์ที่ตรงกันของเดือนกำหนดสัปดาห์แรกของเดือนเป็นวันที่ 1 ถึง 7 สัปดาห์ที่ 2 คือ 8 ถึง 14 เป็นต้น ดังนั้นเมื่อวันพุธอยู่ในสัปดาห์ที่ 1 ตามแบบแผนนี้ เราก็รู้ด้วยว่าจะต้องเป็น วันพุธที่ 1 ของเดือน อาร์กิวเมนต์เดียวกันสำหรับตัวเลขอื่น
ฉันไม่ได้ใช้คลาส Calendar
ที่คุณพูดถึงเนื่องจากได้รับการออกแบบมาไม่ดีและล้าสมัยไปนานแล้ว ฉันใช้ java.time ซึ่งเป็น API วันที่และเวลาของ Java ที่ทันสมัยแทน
รหัสต้นฉบับ (สั้นกว่าเล็กน้อย แต่ยังคงใช้งานได้จริงเพิ่มขึ้นอีกเล็กน้อย):
String[] ordinalNumber = { "0th", "1st", "2nd", "3rd", "4th", "5th" };
LocalDate date = LocalDate.now(ZoneId.of("Pacific/Auckland"));
DayOfWeek day = date.getDayOfWeek();
int numberDowOfMonth = date.get(ChronoField.ALIGNED_WEEK_OF_MONTH);
String dayString = String.format(language, "%s %s of the month",
ordinalNumber[numberDowOfMonth],
day.getDisplayName(TextStyle.FULL_STANDALONE, language));
System.out.println("" + date + " is the " + dayString);
เอาต์พุตเหมือนกับด้านบน
มีองค์ประกอบที่ 0 ที่ไม่ได้ใช้ของอาร์เรย์ ordinalNumber
ของฉัน ฉันใส่ไว้ตรงนั้นเพราะว่าอาร์เรย์เป็นแบบ 0 ใน Java และฉันต้องการให้สตริงอื่นๆ สอดคล้องกับตัวเลข
คำถาม: ฉันสามารถใช้ java.time บน Android ได้หรือไม่
ใช่ java.time ทำงานได้ดีบนอุปกรณ์ Android รุ่นเก่าและใหม่กว่า ต้องการเพียง Java 6 เป็นอย่างน้อย
- ใน Java 8 และใหม่กว่า และบนอุปกรณ์ Android รุ่นใหม่ (จาก API ระดับ 26) API สมัยใหม่จะมีมาให้ในตัว
- ใน Java 6 และ 7 รับ ThreeTen Backport ซึ่งเป็น backport ของคลาสสมัยใหม่ (ThreeTen สำหรับ JSR 310 ดูลิงก์ที่ด้านล่าง)
- บน Android (เก่ากว่า) ให้ใช้ ThreeTen Backport รุ่น Android เรียกว่า ThreeTenABP และตรวจสอบให้แน่ใจว่าคุณนำเข้าคลาสวันที่และเวลาจาก
org.threeten.bp
พร้อมแพ็คเกจย่อย
ลิงค์
- บทช่วยสอนของ Oracle: วันที่ เวลา อธิบายวิธีใช้ java.time
- Java Specification Request (JSR) 310 โดยที่
java.time
ถูกอธิบายไว้เป็นครั้งแรก - โครงการ ThreeTen Backport ซึ่งเป็น backport ของ
java.time
ถึง Java 6 และ 7 (ThreeTen สำหรับ JSR-310) - ThreeTenABP ThreeTen Backport เวอร์ชัน Android
- คำถาม: วิธีใช้ ThreeTenABP ใน Android Project อย่างละเอียดถี่ถ้วน คำอธิบาย.
SimpleDateFormat
มีปัญหาและล้าสมัยอย่างฉาวโฉ่ และถึงแม้ว่ามันสามารถให้1 Sunday
และ2 Tuesday
แก่คุณได้ แต่ฉันไม่คิดว่ามันสามารถให้1st Sunday
และ2nd Tuesday
แก่คุณได้ด้วยตัวบ่งชี้ลำดับ - person Ole V.V.   schedule 05.06.2019