รับวันเช่นวันอาทิตย์ที่ 1 วันอังคารที่ 2

ฉันต้องการให้วัน (เช่น วันอาทิตย์ที่ 1 วันอังคารที่ 2) ของเดือนนี้เป็นปฏิทิน ฉันจะบรรลุเป้าหมายนี้ด้วยปฏิทินชั้นเรียนใน Android ได้อย่างไร ขอบคุณ.


person CauCuKien    schedule 04.06.2019    source แหล่งที่มา
comment
คุณได้ลองอะไรไปแล้วบ้าง?   -  person twenk11k    schedule 04.06.2019
comment
คุณสามารถใช้ java.text.SimpleDateFormat เพื่อรับรูปแบบ   -  person Rahul Khurana    schedule 04.06.2019
comment
ดู stackoverflow.com/questions/39528331/   -  person Naitik Soni    schedule 04.06.2019
comment
@RahulKhurana SimpleDateFormat มีปัญหาและล้าสมัยอย่างฉาวโฉ่ และถึงแม้ว่ามันสามารถให้ 1 Sunday และ 2 Tuesday แก่คุณได้ แต่ฉันไม่คิดว่ามันสามารถให้ 1st Sunday และ 2nd Tuesday แก่คุณได้ด้วยตัวบ่งชี้ลำดับ   -  person Ole V.V.    schedule 05.06.2019


คำตอบ (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 พร้อมแพ็คเกจย่อย

ลิงค์

person Ole V.V.    schedule 05.06.2019