Saya mencoba mengonversi Instan menjadi String dengan format seperti "10 Jul 2021, 10:00 PM".

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd LLL yyyy, hh:mm a");
String formattedDate = formatter.withZone(ZoneId.from(ZoneOffset.UTC)).format(instant);

Ini berfungsi seperti yang diharapkan pada mesin saya, tetapi muncul sebagai "10 7 2021, 10:00 PM" di lingkungan lain.

0
James Kempf 18 Mei 2021, 18:58

2 jawaban

Jawaban Terbaik

Gunakan MMM untuk singkatan bulan dan tentukan lokal yang diinginkan

    Instant instant = Instant.ofEpochSecond(1_625_954_400);
    DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern("dd MMM uuuu, hh:mm a", Locale.US);
    String formattedDate = formatter.withZone(ZoneOffset.UTC).format(instant);
    System.out.println(formattedDate);

Keluaran:

10 Juli 2021, 22:00

Ini harus stabil di seluruh komputer kecuali bahwa secara teoritis mungkin berbeda dengan versi Java yang berbeda. Saya tidak mengharapkannya.

Apa yang salah dalam kode Anda?

Kemungkinan besar, hasil yang tidak konsisten yang Anda amati disebabkan oleh lokasi yang berbeda. Jika tidak diinstruksikan sebaliknya, one-arg DateTimeFormatter.ofPattern() memberi Anda formatter yang menggunakan lokal default JVM (biasanya mengambil dari pengaturan sistem operasi). Ini akan memberi Anda hasil yang sangat bervariasi pada komputer dan JVM dengan pengaturan bahasa dan wilayah yang berbeda. Untuk membingungkan hal-hal lebih lanjut, data lokal bervariasi dengan versi Java dan pengaturan penyedia lokal (properti sistem java.locale.providers). Di Java 8 saya, sangat banyak lokal yang memberi 7 sebagai bulan dari LLL dan hanya bahasa Jerman yang memiliki Jul. Di Java 11 saya hanya bahasa Vai di Liberia yang memberikan 7 sementara banyak yang memberikan Jul.

Format pola huruf L adalah untuk bentuk nama bulan atau singkatan yang berdiri sendiri dan umumnya tidak boleh digunakan jika bulan merupakan bagian dari tanggal seperti halnya dalam kasus Anda. Di sebagian besar lokal L dan M memberikan hasil yang sama, tetapi ada lokal yang memiliki perbedaan dan sengaja.

2
Ole V.V. 18 Mei 2021, 19:32

Coba kode ini: ini akan bekerja 100%

DateFormat df = new SimpleDateFormat("dd-MMMM-yyyy HH:mm a");
    Date date = new Date(System.currentTimeMillis());
    String infi = df.format(date);

Dan hasilnya seperti

18-Mei-2021 23:31

0
Vinit_Saini 18 Mei 2021, 18:02