Bagaimana saya bisa mendapatkan tahun, bulan, hari, jam, menit, detik dan milidetik dari momen saat ini di Java? Saya ingin mereka sebagai Strings
.
104
Anda dapat menggunakan getter dari java.time.LocalDateTime
untuk itu.
LocalDateTime now = LocalDateTime.now();
int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
int millis = now.get(ChronoField.MILLI_OF_SECOND); // Note: no direct getter available.
System.out.printf("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);
Atau, jika Anda belum menggunakan Java 8, manfaatkan java.util.Calendar
.
Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH) + 1; // Note: zero based!
int day = now.get(Calendar.DAY_OF_MONTH);
int hour = now.get(Calendar.HOUR_OF_DAY);
int minute = now.get(Calendar.MINUTE);
int second = now.get(Calendar.SECOND);
int millis = now.get(Calendar.MILLISECOND);
System.out.printf("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);
Bagaimanapun, ini mencetak seperti yang sekarang:
2010-04-16 15: 15: 17.816
Untuk mengkonversi int
ke String
, membuat penggunaan String#valueOf()
.
Jika tujuan Anda adalah setelah semua untuk mengatur dan menampilkan mereka dalam format string ramah manusia, maka lebih baik digunakan baik Java8 ini java.time.format.DateTimeFormatter
( tutorial disini ),
LocalDateTime now = LocalDateTime.now();
String format1 = now.format(DateTimeFormatter.ISO_DATE_TIME);
String format2 = now.atZone(ZoneId.of("GMT")).format(DateTimeFormatter.RFC_1123_DATE_TIME);
String format3 = now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss", Locale.ENGLISH));
System.out.println(format1);
System.out.println(format2);
System.out.println(format3);
atau jika Anda belum menggunakan Java 8, gunakan java.text.SimpleDateFormat
:
Date now = new Date(); // java.util.Date, NOT java.sql.Date or java.sql.Timestamp!
String format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH).format(now);
String format2 = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH).format(now);
String format3 = new SimpleDateFormat("yyyyMMddHHmmss", Locale.ENGLISH).format(now);
System.out.println(format1);
System.out.println(format2);
System.out.println(format3);
Bagaimanapun, ini menghasilkan:
2010-04-16T15: 15: 17.816 Jum, 16 Apr 2010 15:15:17 GMT 20100416151517
SimpleDateFormat
atauDateTimeFormatter
untuk tugas khusus itu :)new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date());
Ganti ke joda-time dan Anda dapat melakukannya dalam tiga baris
Anda juga memiliki akses langsung ke setiap bidang tanggal tanpa menggunakan Kalender.
Outputnya adalah sebagai berikut:
Menurut http://www.joda.org/joda-time/
sumber
sumber
Dengan Java 8 dan yang lebih baru, gunakan paket java.time .
ZonedDateTime.now()
adalah metode statis yang mengembalikan tanggal-waktu saat ini dari jam sistem di zona waktu default. Semua metode get mengembalikanint
nilai.sumber
LocalDateTime
adalah kelas yang salah untuk ini. Karena tidak memiliki konsep zona waktu atau offset-dari-UTC, ini tidak dapat digunakan untuk melacak momen tertentu, ini bukan titik pada garis waktu. GunakanInstant
,,ZonedDateTime
atauOffsetDateTime
sebagai gantinya.ZonedDateTime
.tl; dr
ZonedDateTime
Untuk menangkap momen saat ini seperti yang terlihat pada waktu jam dinding yang digunakan oleh orang-orang di wilayah tertentu (zona waktu), gunakan
ZonedDateTime
.Zona waktu sangat penting dalam menentukan tanggal. Untuk saat tertentu, tanggal bervariasi di seluruh dunia menurut zona. Misalnya, beberapa menit setelah tengah malam di Paris Prancis adalah hari baru sementara masih "kemarin" di Montréal Québec .
Jika tidak ada zona waktu yang ditentukan, JVM secara implisit menerapkan zona waktu default saat ini. Default tersebut dapat berubah setiap saat selama runtime (!), Jadi hasil Anda mungkin berbeda. Lebih baik menentukan zona waktu yang Anda inginkan / diharapkan secara eksplisit sebagai argumen.
Tentukan nama zona waktu yang tepat dalam format
continent/region
, sepertiAmerica/Montreal
,Africa/Casablanca
, atauPacific/Auckland
. Jangan pernah menggunakan singkatan 3-4 huruf sepertiEST
atauIST
karena itu bukan zona waktu yang sebenarnya, tidak standar, dan bahkan tidak unik (!).Panggil salah satu dari banyak pengambil untuk menarik bagian dari tanggal-waktu.
The java.time kelas memutuskan untuk nanodetik . Pertanyaan Anda menanyakan sepersekian detik dalam milidetik . Jelas, Anda dapat membagi dengan satu juta untuk memotong nanodetik menjadi milidetik, dengan mengorbankan kemungkinan kehilangan data. Atau gunakan
TimeUnit
enum untuk konversi tersebut.DateTimeFormatter
Untuk menghasilkan
String
untuk menggabungkan potongan teks, gunakanDateTimeFormatter
class. Cari Stack Overflow untuk info lebih lanjut tentang ini.Instant
Biasanya paling baik untuk melacak momen dalam UTC. Untuk menyesuaikan dari tanggal-waktu yang dikategorikan ke UTC, ekstrak a
Instant
.Dan kembali lagi.
LocalDateTime
Beberapa Jawaban lainnya menggunakan
LocalDateTime
kelas. Kelas tersebut tidak sesuai untuk tujuan melacak momen aktual, momen spesifik di timeline, karena kelas tersebut secara sengaja tidak memiliki konsep zona waktu atau offset-from-UTC.Jadi apa
LocalDateTime
gunanya? GunakanLocalDateTime
jika Anda ingin menerapkan tanggal & waktu ke suatu tempat atau semua tempat , bukan di satu tempat tertentu.Misalnya, Natal tahun ini dimulai pada
LocalDateTime.parse( "2018-12-25T00:00:00" )
. Nilai itu tidak ada artinya sampai Anda menerapkan zona waktu (aZoneId
) untuk mendapatkan aZonedDateTime
. Natal pertama kali terjadi di Kiribati , kemudian di Selandia Baru dan Asia Timur Jauh. Beberapa jam kemudian, Natal dimulai di India. Lebih jam kemudian di Afrika & Eropa. Dan masih belum Natal di Amerika sampai beberapa jam kemudian. Natal yang dimulai di satu tempat harus diwakili denganZonedDateTime
. Natal dimana - mana diwakili dengan aLocalDateTime
.Tentang java.time
The java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan tua merepotkan warisan kelas tanggal-waktu seperti
java.util.Date
,Calendar
, &SimpleDateFormat
.Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .
Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasinya adalah JSR 310 .
Anda dapat bertukar objek java.time langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu string, tidak perlu
java.sql.*
kelas.Dimana mendapatkan kelas java.time?
sumber
Atau gunakan java.sql.Timestamp. Kalender agak berat, saya sarankan untuk tidak menggunakannya dalam kode produksi. Joda lebih baik.
sumber
new Date()
sini. Tetapi bagaimana Anda bisa mendapatkan bagian-bagian terpisah darinya dengan mudah seperti yang diminta?java.sql.Timestamp
digantikan olehjava.time.Instant
kedatangan JDBC 4.2.di java 7 Kalender satu baris
sumber
Lihat dokumentasi API untuk kelas java.util.Calendar dan turunannya (Anda mungkin tertarik secara khusus pada kelas GregorianCalendar).
sumber
java.util.Date
,java.util.Calendar
, danjava.text.SimpleDateFormat
sekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 dan kemudian. Lihat Tutorial oleh Oracle .Kalender sekarang = Kalender baru () // atau GregorianCalendar () baru, atau rasa apa pun yang Anda butuhkan
sekarang.MONTH sekarang.JAM
dll.
sumber
MONTH
danHOUR
merupakan konstanta statisCalendar
, bukan properti instance.