Itu cara yang sulit, dan java.util.Date
metode-metode setter telah ditinggalkan sejak Java 1.1 (1997). Cukup format tanggal menggunakan SimpleDateFormat
menggunakan pola format yang cocok dengan string input .
Dalam kasus spesifik Anda "2 Januari 2010" sebagai string input:
- "Januari" adalah bulan teks lengkap, jadi gunakan
MMMM
pola untuk itu
- "2" adalah hari yang singkat, jadi gunakan
d
pola untuk itu.
- "2010" adalah tahun 4-digit, jadi gunakan
yyyy
pola untuk itu.
String string = "January 2, 2010";
DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
Date date = format.parse(string);
System.out.println(date); // Sat Jan 02 00:00:00 GMT 2010
Perhatikan pentingnya Locale
argumen eksplisit . Jika Anda menghilangkannya, maka itu akan menggunakan lokal default yang belum tentu bahasa Inggris seperti yang digunakan dalam nama bulan dari string input. Jika lokal tidak cocok dengan string input, maka Anda akan bingung java.text.ParseException
meskipun pola format tampak valid.
Berikut adalah ekstrak relevansi dari javadoc , daftar semua pola format yang tersedia:
Letter Date or Time Component Presentation Examples
------ ---------------------- ------------------ -------------------------------------
G Era designator Text AD
y Year Year 1996; 96
Y Week year Year 2009; 09
M/L Month in year Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day in week Text Tuesday; Tue
u Day number of week Number 1
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800
X Time zone ISO 8601 time zone -08; -0800; -08:00
Perhatikan bahwa polanya peka huruf besar-kecil dan bahwa pola berbasis teks empat karakter atau lebih mewakili bentuk lengkap; jika tidak, formulir pendek atau disingkat digunakan jika tersedia. Jadi misal MMMMM
atau lebih tidak perlu.
Berikut adalah beberapa contoh SimpleDateFormat
pola yang valid untuk mengurai string yang diberikan hingga saat ini:
Input string Pattern
------------------------------------ ----------------------------
2001.07.04 AD at 12:08:56 PDT yyyy.MM.dd G 'at' HH:mm:ss z
Wed, Jul 4, '01 EEE, MMM d, ''yy
12:08 PM h:mm a
12 o'clock PM, Pacific Daylight Time hh 'o''clock' a, zzzz
0:08 PM, PDT K:mm a, z
02001.July.04 AD 12:08 PM yyyyy.MMMM.dd GGG hh:mm aaa
Wed, 4 Jul 2001 12:08:56 -0700 EEE, d MMM yyyy HH:mm:ss Z
010704120856-0700 yyMMddHHmmssZ
2001-07-04T12:08:56.235-0700 yyyy-MM-dd'T'HH:mm:ss.SSSZ
2001-07-04T12:08:56.235-07:00 yyyy-MM-dd'T'HH:mm:ss.SSSXXX
2001-W27-3 YYYY-'W'ww-u
Sebuah catatan penting adalah bahwa SimpleDateFormat
ini tidak thread aman. Dengan kata lain, Anda tidak boleh mendeklarasikan dan menetapkannya sebagai variabel statis atau instance dan kemudian menggunakannya kembali dari metode / utas berbeda. Anda harus selalu membuatnya baru dalam lingkup metode lokal.
Pembaruan Java 8
Jika Anda menggunakan Java 8 atau yang lebih baru, gunakan DateTimeFormatter
(juga di sini, klik tautan untuk melihat semua pemformat yang telah ditentukan dan pola format yang tersedia; tutorial tersedia di sini ). API baru ini terinspirasi oleh JodaTime .
String string = "January 2, 2010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date); // 2010-01-02
Catatan: jika pola format Anda mengandung bagian waktu juga, gunakan LocalDateTime#parse(text, formatter)
sebagai ganti LocalDate#parse(text, formatter)
. Dan, jika pola format Anda juga mengandung zona waktu, maka gunakanlah ZonedDateTime#parse(text, formatter)
.
Berikut adalah ekstrak relevansi dari javadoc , daftar semua pola format yang tersedia:
Symbol Meaning Presentation Examples
------ -------------------------- ------------ ----------------------------------------------
G era text AD; Anno Domini; A
u year year 2004; 04
y year-of-era year 2004; 04
D day-of-year number 189
M/L month-of-year number/text 7; 07; Jul; July; J
d day-of-month number 10
Q/q quarter-of-year number/text 3; 03; Q3; 3rd quarter
Y week-based-year year 1996; 96
w week-of-week-based-year number 27
W week-of-month number 4
E day-of-week text Tue; Tuesday; T
e/c localized day-of-week number/text 2; 02; Tue; Tuesday; T
F week-of-month number 3
a am-pm-of-day text PM
h clock-hour-of-am-pm (1-12) number 12
K hour-of-am-pm (0-11) number 0
k clock-hour-of-am-pm (1-24) number 0
H hour-of-day (0-23) number 0
m minute-of-hour number 30
s second-of-minute number 55
S fraction-of-second fraction 978
A milli-of-day number 1234
n nano-of-second number 987654321
N nano-of-day number 1234000000
V time-zone ID zone-id America/Los_Angeles; Z; -08:30
z time-zone name zone-name Pacific Standard Time; PST
O localized zone-offset offset-O GMT+8; GMT+08:00; UTC-08:00;
X zone-offset 'Z' for zero offset-X Z; -08; -0830; -08:30; -083015; -08:30:15;
x zone-offset offset-x +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z zone-offset offset-Z +0000; -0800; -08:00;
Perhatikan bahwa ia memiliki beberapa formatters yang telah ditentukan sebelumnya untuk pola yang lebih populer. Jadi, alih-alih misalnya DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
, Anda bisa menggunakan DateTimeFormatter.RFC_1123_DATE_TIME
. Ini dimungkinkan karena mereka, sebaliknya SimpleDateFormat
, aman dari utas. Dengan demikian, Anda juga dapat mendefinisikan sendiri, jika perlu.
Untuk format string input tertentu, Anda tidak perlu menggunakan eksplisit DateTimeFormatter
: tanggal standar ISO 8601 , seperti 2016-09-26T17: 44: 57Z, dapat diuraikan secara langsung LocalDateTime#parse(text)
karena sudah menggunakan ISO_LOCAL_DATE_TIME
formatter. Demikian pula, LocalDate#parse(text)
mem-parsing tanggal ISO tanpa komponen waktu (lihat ISO_LOCAL_DATE
), dan ZonedDateTime#parse(text)
mem-parsing tanggal ISO dengan offset dan zona waktu ditambahkan (lihat ISO_ZONED_DATE_TIME
).