Dapatkan hari seperti Minggu pertama, Selasa kedua

Saya ingin mendapatkan hari (misalnya Minggu pertama, Selasa kedua) bulan ini sebagai Kalender. Bagaimana saya bisa mencapai ini dengan Kalender kelas di Android? Terima kasih.


person CauCuKien    schedule 04.06.2019    source sumber
comment
Apa yang sudah kamu coba sejauh ini?   -  person twenk11k    schedule 04.06.2019
comment
Anda dapat menggunakan java.text.SimpleDateFormat untuk mendapatkan formatnya   -  person Rahul Khurana    schedule 04.06.2019
comment
Lihat stackoverflow.com/questions/39528331/   -  person Naitik Soni    schedule 04.06.2019
comment
@RahulKhurana SimpleDateFormat terkenal merepotkan dan sudah lama ketinggalan jaman. Dan meskipun dapat memberi Anda 1 Sunday dan 2 Tuesday, menurut saya ini tidak dapat memberi Anda 1st Sunday dan 2nd Tuesday dengan indikator ordinal.   -  person Ole V.V.    schedule 05.06.2019


Jawaban (1)


Java.time dan ThreeTenABP

Sunting: Solusi elegan menggunakan 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);

Saat saya menjalankan cuplikan ini tadi, hasilnya adalah:

05-06-2019 adalah hari Rabu pertama setiap bulan

Tentunya Anda dapat memasukkan tanggal mana pun yang Anda inginkan selain tanggal hari ini di Selandia Baru.

Konsep minggu selaras bulan mendefinisikan minggu pertama setiap bulan sebagai hari 1 sampai 7, minggu ke 2 adalah hari 8 sampai 14, dst. Jadi ketika hari Rabu berada di minggu 1 menurut skema ini, kita juga tahu bahwa itu pasti hari Rabu pertama setiap bulannya. Argumen yang sama untuk nomor lainnya.

Saya tidak menggunakan kelas Calendar yang Anda sebutkan karena dirancang dengan buruk dan sudah lama ketinggalan jaman. Sebagai gantinya saya menggunakan java.time, API tanggal dan waktu Java modern.

Kode asli (sedikit lebih pendek, namun lebih berfungsi dengan tangan):

    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);

Outputnya sama seperti di atas.

Ada elemen ke-0 yang tidak terpakai dari array ordinalNumber saya. Saya hanya meletakkannya di sana karena array berbasis 0 di Java dan saya ingin string lainnya sejajar dengan angka.

Pertanyaan: Bisakah saya menggunakan java.time di Android?

Ya, java.time berfungsi dengan baik pada perangkat Android lama dan baru. Ini hanya memerlukan setidaknya Java 6.

  • Di Java 8 dan yang lebih baru serta pada perangkat Android yang lebih baru (dari API level 26), API modern sudah ada di dalamnya.
  • Di Java 6 dan 7 dapatkan ThreeTen Backport, backport kelas modern (ThreeTen untuk JSR 310; lihat tautan di bawah).
  • Di Android (yang lebih lama), gunakan ThreeTen Backport edisi Android. Namanya ThreeTenABP. Dan pastikan Anda mengimpor kelas tanggal dan waktu dari org.threeten.bp dengan subpaket.

Tautan

person Ole V.V.    schedule 05.06.2019