String Java ke konversi tanggal

886

Apa cara terbaik untuk mengubah Stringdalam format '2 Januari 2010' ke dalam Datedi Jawa?

Pada akhirnya, saya ingin membagi bulan, hari, dan tahun sebagai bilangan bulat sehingga saya bisa menggunakannya

Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();

untuk mengubah tanggal menjadi waktu.

littleK
sumber
15
Perhatikan bahwa banyak jawaban yang mengabaikan seluk-beluk seperti lokal dan zona waktu. Saya akan merekomendasikan membaca dokumentasi untuk kelas Date, Calendar, TimeZone, Locale, dan SimpleDateFormat sebelum menggunakan salah satu dari mereka.
Kristopher Johnson
2
kemungkinan duplikat dari String Konversi ke java.util.Date
Ankur
7
Java 8 menyediakan API Tanggal / Waktu baru. Jika Anda menggunakan Java 8 (atau yang lebih baru), Anda harus melihat jawaban ini: stackoverflow.com/a/22180505/1115554
micha
2
Semua seter Datesudah usang.
Raedwald
5
FYI, merepotkan tua kelas tanggal-waktu seperti java.util.Date, java.util.Calendar, dan java.text.SimpleTextFormatsekarang warisan , digantikan oleh java.time kelas. Lihat Tutorial oleh Oracle .
Basil Bourque

Jawaban:

1641

Itu cara yang sulit, dan java.util.Datemetode-metode setter telah ditinggalkan sejak Java 1.1 (1997). Cukup format tanggal menggunakan SimpleDateFormatmenggunakan pola format yang cocok dengan string input .

Dalam kasus spesifik Anda "2 Januari 2010" sebagai string input:

  1. "Januari" adalah bulan teks lengkap, jadi gunakan MMMMpola untuk itu
  2. "2" adalah hari yang singkat, jadi gunakan dpola untuk itu.
  3. "2010" adalah tahun 4-digit, jadi gunakan yyyypola 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 Localeargumen 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.ParseExceptionmeskipun 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 MMMMMatau lebih tidak perlu.

Berikut adalah beberapa contoh SimpleDateFormatpola 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 SimpleDateFormatini 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_TIMEformatter. 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).

BalusC
sumber
Hai, dalam opsi O, bagaimana membiarkannya mencetak UTC+08:00alih-alih GMT+08:00. Saya tidak bisa mendapatkan contoh.
theGamblerRises
Ada banyak cara untuk menguraikan tanggal, berikut adalah berbagai kasus penggunaan DateFormat.parse
drorw
Halo BalusC, saya punya string 20-JUN-16 12.00.00.000000000 AM, butuh bantuan untuk mengonversi ini menjadi Date. Bantuan Anda sangat dihargai !!
pria dewasa
@mannedear oh maaf .. itu kesalahan saya. Pokoknya saya mendapat jawaban Anda bisa melihatnya di sini: stackoverflow.com/questions/50982310/...
Queendevelopers
74

Ah ya diskusi Java Date, lagi. Untuk menangani manipulasi tanggal, kami menggunakan Date , Calendar , GregorianCalendar , dan SimpleDateFormat . Misalnya menggunakan tanggal Januari Anda sebagai masukan:

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 memanipulasinya 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));
pn1 dude
sumber
17
Jangan lupa bahwa Januari adalah angka bulan ... 0
Nicolas Zozol
50
String str_date = "11-June-07";
DateFormat formatter;
Date date;
formatter = new SimpleDateFormat("dd-MMM-yy");
date = formatter.parse(str_date);
Ruthreshwar
sumber
13
Apa tujuan memisahkan deklarasi dan definisi (walaupun tidak dilakukan untuk variabel pertama)?
Peter Mortensen
43

Dengan Java 8 kami mendapatkan API Tanggal / Waktu baru ( JSR 310 ).

Cara berikut dapat digunakan untuk mengurai tanggal di Java 8 tanpa bergantung pada Joda-Time :

 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 kelas Java 8 standar untuk mewakili tanggal (tanpa waktu). Jika Anda ingin mengurai nilai yang berisi informasi tanggal dan waktu, Anda harus menggunakan LocalDateTime . Untuk nilai dengan zona waktu, gunakan ZonedDateTime . Keduanya menyediakan parse()metode yang mirip dengan LocalDate:

LocalDateTime dateWithTime = LocalDateTime.parse(strWithDateAndTime, dateTimeFormatter);
ZonedDateTime zoned = ZonedDateTime.parse(strWithTimeZone, zoneFormatter);

Daftar memformat 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;
micha
sumber
Bagaimana cara kerja fraksi detik? Jika saya menggunakan tanggal LocalDateTime = LocalDateTime.parse ("20140920111713000", Pola DateTimeFormatter.of‌ ("yyyyMMddHHm‌ mssSSS")); gagal tetapi jika saya menggunakan tanggal LocalDateTime = LocalDateTime.parse ("20140920111713.000", DateTimeFormatter.o‌ fPattern ("yyyyMMddHH‌ mmss.SSS")); itu bekerja
reos
27

Meskipun beberapa jawaban secara teknis benar, mereka tidak disarankan.

  • Kelas java.util.Date & Kalender terkenal menyusahkan. Karena kekurangan dalam desain dan implementasi, hindari itu. Untungnya, kami memiliki dua perpustakaan pilihan tanggal lainnya:
    • Joda-Time
      Pustaka open-source open-source populer ini dapat digunakan di beberapa versi Java. Banyak contoh penggunaannya dapat ditemukan di StackOverflow. Membaca beberapa di antaranya akan membantu Anda mempercepat dengan cepat.
    • java.time. * package
      Kumpulan kelas baru ini diinspirasi oleh Joda-Time dan didefinisikan oleh JSR 310. Kelas-kelas ini dibangun ke dalam Java 8. Sebuah proyek sedang berlangsung untuk mendukung kelas-kelas ini ke Java 7, tetapi bahwa backporting tidak didukung oleh Peramal.
  • Seperti yang dicatat dengan benar oleh Kristopher Johnson dalam komentarnya tentang pertanyaan itu, jawaban-jawaban lain mengabaikan masalah-masalah penting:
    • Time of Day
      Date memiliki porsi tanggal dan waktu tertentu)
    • Zona Waktu
      Awal hari tergantung pada zona waktu. Jika Anda gagal menentukan zona waktu, zona waktu default JVM diterapkan. Itu berarti perilaku kode Anda dapat berubah ketika dijalankan di komputer lain atau dengan pengaturan zona waktu yang dimodifikasi. Mungkin bukan yang Anda inginkan.
    • Lokal
      Bahasa Lokal menentukan bagaimana menafsirkan kata-kata (nama bulan dan hari) yang ditemukan selama parsing. ( Jawaban oleh BalusC menangani ini dengan benar.) Selain itu, Lokal mempengaruhi output beberapa formatters ketika menghasilkan representasi string dari tanggal-waktu Anda.

Joda-Time

Beberapa catatan tentang Joda-Time mengikuti.

Zona waktu

Dalam Joda-Time , objek DateTime benar-benar mengetahui zona waktu yang ditentukan. Ini kontras dengan kelas java.util.Date yang tampaknya memiliki zona waktu tetapi tidak.

Perhatikan dalam kode contoh di bawah ini bagaimana kita melewatkan objek zona waktu ke formatter yang mem-parsing string. Zona waktu itu digunakan untuk menafsirkan bahwa tanggal-waktu telah terjadi di zona waktu itu. Jadi, Anda perlu memikirkan dan menentukan zona waktu yang diwakili oleh input string itu.

Karena Anda tidak memiliki porsi waktu dalam string input Anda, Joda-Time menetapkan momen pertama hari dari zona waktu yang ditentukan sebagai waktu-hari. Biasanya ini berarti 00:00:00tetapi tidak selalu, karena Daylight Saving Time (DST) atau anomali lainnya. Omong-omong, Anda dapat melakukan hal yang sama pada instance DateTime dengan meneleponwithTimeAtStartOfDay .

Pola Formatter

Karakter yang digunakan dalam pola formatter mirip dalam Joda-Time dengan yang ada di java.util.Date/Calendar tetapi tidak persis sama. Baca dengan cermat dok.

Kekekalan

Kami biasanya menggunakan kelas yang tidak dapat diubah di Joda-Time. Daripada memodifikasi objek Date-Time yang ada, kami memanggil metode yang membuat instance baru berdasarkan objek lain dengan sebagian besar aspek disalin kecuali di mana perubahan yang diinginkan. Contohnya adalah panggilan withZonemasuk pada baris terakhir di bawah ini. Kekekalan membantu membuat Joda-Time sangat aman, dan juga bisa membuat beberapa pekerjaan lebih jelas.

Konversi

Anda akan membutuhkan objek java.util.Date untuk digunakan dengan kelas / kerangka kerja lain yang tidak tahu tentang objek Joda-Time. Untungnya, sangat mudah untuk bergerak maju mundur.

Pergi dari objek java.util.Date (di sini bernama date) ke Joda-Time DateTime ...

org.joda.time.DateTime dateTime = new DateTime( date, timeZone );

Pergi ke arah lain dari Joda-Time ke objek java.util.Date ...

java.util.Date date = dateTime.toDate();

Kode sampel

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 ) );

Saat dijalankan ...

dateTime: 2010-01-02T00:00:00.000-10:00
dateTime in UTC/GMT: 2010-01-02T10:00:00.000Z
Basil Bourque
sumber
20

Saat berurusan dengan kelas SimpleDateFormat, penting untuk diingat bahwa Date tidak aman untuk thread dan Anda tidak bisa berbagi objek Date tunggal dengan banyak utas.

Juga ada perbedaan besar antara "m" dan "M" di mana kasing kecil digunakan untuk menit dan kasing besar digunakan untuk bulan. Sama dengan "d" dan "D". Ini dapat menyebabkan bug halus yang sering terabaikan. Lihat Javadoc atau Panduan untuk Mengonversi String ke Tanggal di Java untuk detail lebih lanjut.

Jim
sumber
1
Perbedaan m / M ini membuat saya frustrasi 5 menit, terima kasih sudah menunjukkannya :)
Buffalo
Saya terkejut tidak ada orang lain yang menyebutkan ini. Menggunakan SimpleDateFormat dalam aplikasi Web (atau aplikasi multi-utas lainnya) adalah hal yang tidak boleh. Melalui Java 7, saya telah menggunakan "FastDateFormat".
JackLThornton
18
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();
}

Ini bekerja dengan baik untuk saya.

Luna Kong
sumber
5
Ini akan mengembalikan Rabu 04 Des 00:00:00 GST 2013 sebagai output tidak 2013-12-04
Shams
harus dibungkus dalam percobaan ParseException / catch
svarog
Ini tidak akan mengembalikan nilai seperti yang diharapkan. Silakan tes sebelum memberi saran
Lifemoveson
7

Anda dapat menggunakan SimpleDateformat untuk mengubah string hingga saat ini

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String strDate = "2000-01-01";
Date date = new Date(sdf.parse(strDate).getTime());

harun ugur
sumber
1
Metode parse SimpleDateFormat mengembalikan objek tanggal. Lalu mengapa menggunakan konstruktor Tanggal?
nespapu
6

Selain itu, SimpleDateFormat tidak tersedia dengan beberapa teknologi sisi klien, seperti GWT .

Sebaiknya gunakan Calendar.getInstance (), dan persyaratan Anda adalah membandingkan dua tanggal; pergi untuk kencan lama.

Vaishali Kulkarni
sumber
6

Dua format sederhana yang telah kami gunakan:

  1. Tanggal format mana yang kita inginkan?
  2. Tanggal format mana yang sebenarnya ada?

Kami mem-parsing format tanggal hingga waktu penuh:

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));
}
siddharth patel
sumber
5

Program uji kerendahan hati saya. Saya menggunakannya untuk bermain-main dengan formatter dan mencari-cari tanggal panjang yang saya temukan di file log (tapi siapa yang meletakkannya di sana ...).

Program pengujian saya:

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
Dimitri Dewaele
sumber
2

Tautan Sumber

Untuk Android

Calendar.getInstance (). GetTime () memberi

Thu Jul 26 15:54:13 GMT+05:30 2018

Menggunakan

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);
Kode Mata-mata
sumber
0

Konversi string ke Tanggal:

private Date StringtoDate(String date) throws Exception {
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
            java.sql.Date sqlDate = null;
            if( !date.isEmpty()) {

                try {
                    java.util.Date normalDate = sdf1.parse(date);
                    sqlDate = new java.sql.Date(normalDate.getTime());
                } catch (ParseException e) {
                    throw new Exception("Not able to Parse the date", e);
                }
            }
            return sqlDate;
        }
Shashidhar Reddy
sumber
-1

Coba ini

String date = get_pump_data.getString("bond_end_date");
DateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
Date datee = (Date)format.parse(date);
Madhuka Dilhan
sumber