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.
Dapatkan hari seperti Minggu pertama, Selasa kedua
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
- Tutorial Oracle: Tanggal Waktu menjelaskan cara menggunakan java.time.
- Permintaan Spesifikasi Java (JSR) 310, tempat
java.time
pertama kali dijelaskan. - Proyek ThreeTen Backport, backport
java.time
ke Java 6 dan 7 (ThreeTen untuk JSR-310). - ThreeTenABP, ThreeTen Backport edisi Android
- Pertanyaan: Cara menggunakan ThreeTenABP di Proyek Android, dengan sangat teliti penjelasan.
SimpleDateFormat
terkenal merepotkan dan sudah lama ketinggalan jaman. Dan meskipun dapat memberi Anda1 Sunday
dan2 Tuesday
, menurut saya ini tidak dapat memberi Anda1st Sunday
dan2nd Tuesday
dengan indikator ordinal. - person Ole V.V.   schedule 05.06.2019