Apa cara terbaik untuk mengkonversi String
dalam format 'januari 2, 2010' untuk Date
di Jawa?
Pada akhirnya, saya ingin keluar bulan, hari, dan tahun sebagai bilangan bulat sehingga saya dapat menggunakan
Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();
untuk mengubah tanggal ke waktu.
Yang's cara yang keras, dan orang-orang jawa.util.Tanggal
penyetel telah usang karena Java 1.1 (1997). Hanya format tanggal menggunakan SimpleDateFormat
menggunakan format pola pencocokan string masukan.
Dalam kasus tertentu "januari 2, 2010" sebagai masukan string:
MMMM
pola untuk itud
pola untuk itu.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
Catatan pentingnya eksplisit Lokal
argumen. Jika anda mengabaikan hal ini, maka akan menggunakan default locale yang belum tentu bahasa inggris seperti yang digunakan di bulan nama dari string masukan. Jika lokal doesn't cocok dengan string masukan, maka anda akan membingungkan mendapatkan jawa.teks.ParseException
meskipun ketika format pola tampaknya berlaku.
Berikut ini's ekstrak relevansi dari awal, daftar semua tersedia format pola:
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 pola ini adalah hal sensitif dan bahwa teks berdasarkan pola dari empat karakter atau lebih yang mewakili bentuk penuh; jika tidak, pendek atau disingkat bentuk ini digunakan jika tersedia. Jadi misal MMMMM
atau lebih yang tidak perlu.
Berikut ini adalah beberapa contoh yang valid SimpleDateFormat
pola untuk mengurai string tertentu untuk upload:
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
Catatan penting adalah bahwa SimpleDateFormat
adalah tidak thread yang aman. Dengan kata lain, anda harus tidak pernah menyatakan dan menetapkan sebagai static atau instance variabel dan kemudian kembali dari metode yang berbeda/benang. Anda harus selalu menciptakan hal baru dalam metode lingkup lokal.
Jika anda kebetulan berada di Jawa 8 atau yang lebih baru, kemudian gunakan DateTimeFormatter
(juga di sini, klik link untuk melihat semua yang telah ditetapkan formatters dan tersedia format pola; 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 anda format pola cepat berisi waktu paruh juga, kemudian gunakan LocalDateTime#parse(teks, formatter)
dan bukan LocalDate#parse(teks, formatter)
. Dan, jika anda format pola yang terjadi untuk mengandung zona waktu juga, kemudian gunakan ZonedDateTime#parse(teks, formatter)
sebagai gantinya.
Berikut ini's ekstrak relevansi dari awal, daftar semua tersedia format pola:
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;
Apakah dicatat bahwa ia memiliki beberapa yang telah ditetapkan formatters untuk lebih populer pola. Jadi, bukannya misal DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Lokal.INGGRIS);
, anda bisa menggunakan DateTimeFormatter.RFC_1123_DATE_TIME
. Hal ini dimungkinkan karena mereka, sebaliknya untuk SimpleDateFormat
, benang yang aman. Anda bisa jadi juga menentukan sendiri, jika diperlukan.
Untuk suatu input string format, anda don't perlu menggunakan eksplisit DateTimeFormatter
: standar ISO 8601 saat ini, seperti 2016-09-26T17:44:57Z, dapat diurai secara langsung dengan LocalDateTime#parse(teks)
karena sudah menggunakan ISO_LOCAL_DATE_TIME
formatter. Demikian pula, LocalDate#parse(teks)
mem-parsing ISO tanggal tanpa waktu komponen (lihat ISO_LOCAL_DATE
), dan ZonedDateTime#parse(teks)
mem-parsing tanggal ISO dengan offset zona waktu dan ditambahkan (lihat ISO_ZONED_DATE_TIME
).
Ah ya Jawa Tanggal diskusi, lagi. Untuk berurusan dengan tanggal manipulasi yang kita gunakan Tanggal, Kalender, GregorianCalendar, dan SimpleDateFormat. Misalnya dengan menggunakan januari date input:
Calendar mydate = new GregorianCalendar();
String mystring = "January 2, 2010";
Date thedate = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH).parse(mystring);
mydate.setTime(thedate);
//breakdown
System.out.println("mydate -> "+mydate);
System.out.println("year -> "+mydate.get(Calendar.YEAR));
System.out.println("month -> "+mydate.get(Calendar.MONTH));
System.out.println("dom -> "+mydate.get(Calendar.DAY_OF_MONTH));
System.out.println("dow -> "+mydate.get(Calendar.DAY_OF_WEEK));
System.out.println("hour -> "+mydate.get(Calendar.HOUR));
System.out.println("minute -> "+mydate.get(Calendar.MINUTE));
System.out.println("second -> "+mydate.get(Calendar.SECOND));
System.out.println("milli -> "+mydate.get(Calendar.MILLISECOND));
System.out.println("ampm -> "+mydate.get(Calendar.AM_PM));
System.out.println("hod -> "+mydate.get(Calendar.HOUR_OF_DAY));
Kemudian anda dapat memanipulasi dengan sesuatu seperti:
Calendar now = Calendar.getInstance();
mydate.set(Calendar.YEAR,2009);
mydate.set(Calendar.MONTH,Calendar.FEBRUARY);
mydate.set(Calendar.DAY_OF_MONTH,25);
mydate.set(Calendar.HOUR_OF_DAY,now.get(Calendar.HOUR_OF_DAY));
mydate.set(Calendar.MINUTE,now.get(Calendar.MINUTE));
mydate.set(Calendar.SECOND,now.get(Calendar.SECOND));
// or with one statement
//mydate.set(2009, Calendar.FEBRUARY, 25, now.get(Calendar.HOUR_OF_DAY), now.get(Calendar.MINUTE), now.get(Calendar.SECOND));
System.out.println("mydate -> "+mydate);
System.out.println("year -> "+mydate.get(Calendar.YEAR));
System.out.println("month -> "+mydate.get(Calendar.MONTH));
System.out.println("dom -> "+mydate.get(Calendar.DAY_OF_MONTH));
System.out.println("dow -> "+mydate.get(Calendar.DAY_OF_WEEK));
System.out.println("hour -> "+mydate.get(Calendar.HOUR));
System.out.println("minute -> "+mydate.get(Calendar.MINUTE));
System.out.println("second -> "+mydate.get(Calendar.SECOND));
System.out.println("milli -> "+mydate.get(Calendar.MILLISECOND));
System.out.println("ampm -> "+mydate.get(Calendar.AM_PM));
System.out.println("hod -> "+mydate.get(Calendar.HOUR_OF_DAY));
Dengan Java 8 kita mendapatkan yang baru, Tanggal / Waktu API (JSR 310).
Berikut cara yang dapat digunakan untuk mengurai tanggal di Java 8 tanpa bergantung pada Joda-Waktu:
String str = "January 2nd, 2010";
// if we 2nd even we have changed in pattern also it is not working please workout with 2nd
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM Q, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(str, formatter);
// access date fields
int year = date.getYear(); // 2010
int day = date.getDayOfMonth(); // 2
Month month = date.getMonth(); // JANUARY
int monthAsInt = month.getValue(); // 1
LocalDate adalah standar Jawa 8 kelas untuk mewakili tanggal (tanpa waktu). Jika anda ingin mengurai nilai-nilai yang berisi informasi tanggal dan waktu anda harus menggunakan LocalDateTime. Untuk nilai-nilai dengan menggunakan zona waktu ZonedDateTime. Keduanya memberikan parse()
metode yang mirip dengan LocalDate
:
LocalDateTime dateWithTime = LocalDateTime.parse(strWithDateAndTime, dateTimeFormatter);
ZonedDateTime zoned = ZonedDateTime.parse(strWithTimeZone, zoneFormatter);
Daftar format karakter dari DateTimeFormatter Javadoc:
All letters 'A' to 'Z' and 'a' to 'z' are reserved as pattern letters.
The following pattern letters are defined:
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;
Sementara beberapa jawaban yang tepat secara teknis, mereka tidak dianjurkan.
Beberapa catatan tentang Joda-Waktu mengikuti.
Di Joda-Waktu, a DateTime objek benar-benar tahu sendiri ditugaskan zona waktu. Hal ini berbeda dengan jawa.util.Tanggal kelas yang sepertinya memiliki zona waktu tapi tidak.
Catatan dalam contoh kode di bawah ini bagaimana kita melewati zona waktu objek untuk formatter yang mem-parsing string. Bahwa zona waktu yang digunakan untuk menafsirkan bahwa tanggal-waktu bisa terjadi di zona waktu tersebut. Jadi, anda perlu untuk memikirkan dan menentukan zona waktu yang diwakili oleh string masukan.
Karena anda tidak memiliki waktu bagian dalam input string, Joda-Waktu menetapkan pertama saat hari dari waktu yang ditentukan sebagai zona waktu-dari-hari. Biasanya ini berarti 00:00:00
, tapi tidak selalu, karena Daylight Saving Time (DST) atau anomali lainnya. By the way, anda bisa melakukan hal yang sama untuk setiap DateTime misalnya dengan memanggil withTimeAtStartOfDay
.
Karakter yang digunakan dalam formatter's pola serupa dalam Joda-Waktu untuk orang-orang di jawa.util.Tanggal/Kalender tapi tidak persis sama. Hati-hati membaca doc.
Biasanya kita gunakan abadi kelas dalam Joda-Waktu. Daripada memodifikasi yang sudah ada Saat-Saat objek, kita memanggil metode yang membuat segar baru contoh yang didasarkan pada objek lain dengan sebagian besar aspek disalin kecuali apabila perubahan yang diinginkan. Contohnya adalah panggilan untuk withZone
di baris terakhir di bawah ini. Ketetapan membantu untuk membuat Joda-Waktu yang sangat thread-safe, dan juga dapat membuat beberapa pekerjaan yang lebih jelas.
Anda akan perlu jawa.util.Saat benda-benda untuk digunakan dengan kelas-kelas lain/kerangka yang tidak tahu tentang Joda-Waktu benda-benda. Untungnya, sangat mudah untuk beralih kembali dan sebagainya.
Dari jawa.util.Tanggal obyek (di sini bernama tanggal
) untuk Joda-Time DateTime...
org.joda.time.DateTime dateTime = new DateTime( date, timeZone );
Akan arah lain dari Joda-Time ke jawa.util.Objek tanggal...
java.util.Date date = dateTime.toDate();
String input = "January 2, 2010";
java.util.Locale locale = java.util.Locale.US;
DateTimeZone timeZone = DateTimeZone.forID( "Pacific/Honolulu" ); // Arbitrarily chosen for example.
DateTimeFormatter formatter = DateTimeFormat.forPattern( "MMMM d, yyyy" ).withZone( timeZone ).withLocale( locale );
DateTime dateTime = formatter.parseDateTime( input );
System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTime in UTC/GMT: " + dateTime.withZone( DateTimeZone.UTC ) );
Ketika menjalankan...
dateTime: 2010-01-02T00:00:00.000-10:00
dateTime in UTC/GMT: 2010-01-02T10:00:00.000Z
Sementara pada berurusan dengan SimpleDateFormat kelas, it's penting untuk diingat bahwa Saat ini tidak thread-safe dan anda tidak dapat berbagi satu objek Tanggal dengan beberapa benang.
Juga ada perbedaan besar antara "m" dan "M" di mana kasus kecil ini digunakan untuk menit dan modal hal ini digunakan untuk sebulan. Sama dengan "d" dan "D". Hal ini dapat menyebabkan halus bug yang seringkali diabaikan. Lihat Awal Panduan untuk Mengkonversi String ke Date di Jawa untuk rincian lebih lanjut.
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date;
try {
date = dateFormat.parse("2013-12-4");
System.out.println(date.toString()); // Wed Dec 04 00:00:00 CST 2013
String output = dateFormat.format(date);
System.out.println(output); // 2013-12-04
}
catch (ParseException e) {
e.printStackTrace();
}
Itu bekerja dengan baik bagi saya.
Sederhana dua formatters kami telah digunakan:
Kita mengurai tanggal penuh untuk waktu format:
date="2016-05-06 16:40:32";
public static String setDateParsing(String date) throws ParseException {
// This is the format date we want
DateFormat mSDF = new SimpleDateFormat("hh:mm a");
// This format date is actually present
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-mm-dd hh:mm");
return mSDF.format(formatter.parse(date));
}
Juga, SimpleDateFormat tidak tersedia dengan beberapa klien-sisi teknologi, seperti GWT.
It's merupakan ide yang baik untuk pergi untuk Kalender.getInstance(), dan kebutuhan anda adalah untuk membandingkan dua tanggal; pergi untuk tanggal yang lama.
Saya yang sederhana menguji program. Saya menggunakannya untuk bermain-main dengan formatter dan melihat-up lama tanggal yang saya temukan di log-file (tapi siapa yang telah menempatkan mereka di sana...).
Saya tes program:
package be.test.package.time;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
public class TimeWork {
public static void main(String[] args) {
TimeZone timezone = TimeZone.getTimeZone("UTC");
List<Long> longs = new ArrayList<>();
List<String> strings = new ArrayList<>();
//Formatting a date needs a timezone - otherwise the date get formatted to your system time zone.
//Use 24h format HH. In 12h format hh can be in range 0-11, which makes 12 overflow to 0.
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss.SSS");
formatter.setTimeZone(timezone);
Date now = new Date();
//Test dates
strings.add(formatter.format(now));
strings.add("01-01-1970 00:00:00.000");
strings.add("01-01-1970 00:00:01.000");
strings.add("01-01-1970 00:01:00.000");
strings.add("01-01-1970 01:00:00.000");
strings.add("01-01-1970 10:00:00.000");
strings.add("01-01-1970 12:00:00.000");
strings.add("01-01-1970 24:00:00.000");
strings.add("02-01-1970 00:00:00.000");
strings.add("01-01-1971 00:00:00.000");
strings.add("01-01-2014 00:00:00.000");
strings.add("31-12-1969 23:59:59.000");
strings.add("31-12-1969 23:59:00.000");
strings.add("31-12-1969 23:00:00.000");
//Test data
longs.add(now.getTime());
longs.add(-1L);
longs.add(0L); //Long date presentation at - midnight 1/1/1970 UTC - The timezone is important!
longs.add(1L);
longs.add(1000L);
longs.add(60000L);
longs.add(3600000L);
longs.add(36000000L);
longs.add(43200000L);
longs.add(86400000L);
longs.add(31536000000L);
longs.add(1388534400000L);
longs.add(7260000L);
longs.add(1417706084037L);
longs.add(-7260000L);
System.out.println("===== String to long =====");
//Show the long value of the date
for (String string: strings) {
try {
Date date = formatter.parse(string);
System.out.println("Formated date : " + string + " = Long = " + date.getTime());
} catch (ParseException e) {
e.printStackTrace();
}
}
System.out.println("===== Long to String =====");
//Show the date behind the long
for (Long lo : longs) {
Date date = new Date(lo);
String string = formatter.format(date);
System.out.println("Formated date : " + string + " = Long = " + lo);
}
}
}
Hasil tes:
===== String to long =====
Formated date : 05-12-2014 10:17:34.873 = Long = 1417774654873
Formated date : 01-01-1970 00:00:00.000 = Long = 0
Formated date : 01-01-1970 00:00:01.000 = Long = 1000
Formated date : 01-01-1970 00:01:00.000 = Long = 60000
Formated date : 01-01-1970 01:00:00.000 = Long = 3600000
Formated date : 01-01-1970 10:00:00.000 = Long = 36000000
Formated date : 01-01-1970 12:00:00.000 = Long = 43200000
Formated date : 01-01-1970 24:00:00.000 = Long = 86400000
Formated date : 02-01-1970 00:00:00.000 = Long = 86400000
Formated date : 01-01-1971 00:00:00.000 = Long = 31536000000
Formated date : 01-01-2014 00:00:00.000 = Long = 1388534400000
Formated date : 31-12-1969 23:59:59.000 = Long = -1000
Formated date : 31-12-1969 23:59:00.000 = Long = -60000
Formated date : 31-12-1969 23:00:00.000 = Long = -3600000
===== Long to String =====
Formated date : 05-12-2014 10:17:34.873 = Long = 1417774654873
Formated date : 31-12-1969 23:59:59.999 = Long = -1
Formated date : 01-01-1970 00:00:00.000 = Long = 0
Formated date : 01-01-1970 00:00:00.001 = Long = 1
Formated date : 01-01-1970 00:00:01.000 = Long = 1000
Formated date : 01-01-1970 00:01:00.000 = Long = 60000
Formated date : 01-01-1970 01:00:00.000 = Long = 3600000
Formated date : 01-01-1970 10:00:00.000 = Long = 36000000
Formated date : 01-01-1970 12:00:00.000 = Long = 43200000
Formated date : 02-01-1970 00:00:00.000 = Long = 86400000
Formated date : 01-01-1971 00:00:00.000 = Long = 31536000000
Formated date : 01-01-2014 00:00:00.000 = Long = 1388534400000
Formated date : 01-01-1970 02:01:00.000 = Long = 7260000
Formated date : 04-12-2014 15:14:44.037 = Long = 1417706084037
Formated date : 31-12-1969 21:59:00.000 = Long = -7260000
Anda dapat menggunakan SimpleDateformat untuk mengubah string ke date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String strDate = "2000-01-01";
Date date = new Date(sdf.parse(strDate).getTime());
Sumber Link
Untuk Android ****
Kalender.getInstance().getTime() memberikan
Thu Jul 26 15:54:13 GMT+05:30 2018
Gunakan ****
String oldDate = "Thu Jul 26 15:54:13 GMT+05:30 2018";
DateFormat format = new SimpleDateFormat("EEE LLL dd HH:mm:ss Z yyyy");
Date updateLast = format.parse(oldDate);