Ubah format tanggal dalam string Java

465

Saya sudah Stringmewakili tanggal.

String date_s = "2011-01-18 00:00:00.0";

Saya ingin mengonversinya menjadi Datedan mengeluarkannya dalam YYYY-MM-DDformat.

2011-01-18

Bagaimana saya bisa mencapai ini?


Oke, berdasarkan jawaban yang saya ambil di bawah, inilah sesuatu yang saya coba:

String date_s = " 2011-01-18 00:00:00.0"; 
SimpleDateFormat dt = new SimpleDateFormat("yyyyy-mm-dd hh:mm:ss"); 
Date date = dt.parse(date_s); 
SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");
System.out.println(dt1.format(date));

Tetapi menghasilkan 02011-00-1bukannya yang diinginkan 2011-01-18. Apa yang saya lakukan salah?

amit4444
sumber
163
yyyyy tidak sama dengan yyyy. :)
Hovercraft Full Of Eels
2
Pertanyaan bumerang. Apa kasus penggunaan Anda? Karena mungkin Anda harus menggunakan pola bawaan (DateFormat.getDateTimeInstance ()).
Paweł Dyda
11
Bulan diwakili dengan MM dalam format string, bukan dengan mm seperti pada contoh di atas. mm berarti menit.
Mike
3
Saya mengubah yyyy-mm-dd ke yyyy-MM-dd, karena versi awal tidak berfungsi
Pavlo Zvarych

Jawaban:

506

Menggunakan LocalDateTime#parse() (atau ZonedDateTime#parse()jika string berisi bagian zona waktu) untuk menguraikan a Stringdalam pola tertentu menjadi a LocalDateTime.

String oldstring = "2011-01-18 00:00:00.0";
LocalDateTime datetime = LocalDateTime.parse(oldstring, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"));

Menggunakan LocalDateTime#format() (atau ZonedDateTime#format()) untuk memformat a LocalDateTimeke Stringdalam pola tertentu.

String newstring = datetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println(newstring); // 2011-01-18

Atau , saat Anda belum berada di Java 8, gunakan SimpleDateFormat#parse()untuk mem-parsing Stringdalam pola tertentu menjadi a Date.

String oldstring = "2011-01-18 00:00:00.0";
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").parse(oldstring);

Gunakan SimpleDateFormat#format()untuk memformat a Dateke Stringdalam pola tertentu.

String newstring = new SimpleDateFormat("yyyy-MM-dd").format(date);
System.out.println(newstring); // 2011-01-18

Lihat juga:


Pembaruan : sesuai upaya Anda yang gagal: polanya peka terhadap huruf besar-kecil . Baca java.text.SimpleDateFormatjavadoc apa kepanjangan dari masing-masing bagian. Jadi berdiri misalnya Mselama berbulan-bulan dan mbeberapa menit. Juga, tahun ada empat digit yyyy, bukan lima yyyyy. Lihat lebih dekat pada cuplikan kode yang saya posting di sini di atas.

BalusC
sumber
Bagaimana jika Anda ingin tanggalnya terlihat seperti "Senin 1 September 2012"?
crmepham
11
@ crm: Cukup klik tautan javadoc, cari karakter pola yang diperlukan di sana dan ubah polanya.
BalusC
Saat Anda belum berada di Java 8, pertimbangkan untuk menggunakan backport, ThreeTen Backport , dan kemudian contoh pertama dari jawabannya. Atau untuk Android di bawah API level 26, ThreeTenABP .
Ole VV
157

Pemformatan bersifat SENSITIF KASUS jadi GUNAKAN MM untuk bulan bukan mm (ini untuk menit) dan yyyy Untuk Referensi Anda dapat menggunakan cheatsheet berikut.

G   Era designator  Text    AD
y   Year    Year    1996; 96
Y   Week year   Year    2009; 09
M   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 name in week    Text    Tuesday; Tue
u   Day number of week (1 = Monday, ..., 7 = Sunday)    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

Contoh:

"yyyy.MM.dd G 'at' HH:mm:ss z"  2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy"  Wed, Jul 4, '01
"h:mm a"    12:08 PM
"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
"K:mm a, z" 0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa"  02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z"    Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ" 010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"   2001-07-04T12:08:56.235-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX"   2001-07-04T12:08:56.235-07:00
"YYYY-'W'ww-u"  2001-W27-3
Dev
sumber
1
"yyyy-MM-dd'T'HH: mm: ss.SSSZ" harus "yyyy-MM-dd'T'HH: mm: ss.SSS'Z '"
pemain yang adil
2
tidak jika Anda memasukkan Z dalam tanda kutip tunggal ia akan memberikan Z sebagai output tetapi tanpa itu ia akan memberikan Timezone. misalnya. 2014-08-14T01: 24: 57.236Z dan dari tanpa itu 2014-08-14T01: 24: 57.236-0530 -> Saya mencoba jdk1.7
Dev
1
"yyyyy.MMMMM.dd GGG hh: mm aaa" 02001.July.04 AD 12:08 PM Catat M ekstra dalam sebulan. Empat bukan lima!
Stefano Mtangoo
jika 4 huruf atau lebih, maka formulir lengkap digunakan. sehingga Anda dapat menggunakan 4 kali m atau bahkan 5 kali m sama
Dev
Ini cukup banyak Copy-Paste dari dokumen. Tidak ada penjelasan tambahan yang diberikan, dan tidak ada tautan ke dokumen di mana lebih banyak informasi dapat diperoleh jika diperlukan. -1. ( Inilah tautannya )
XenoR
108

Jawabannya tentu saja untuk membuat objek SimpleDateFormat dan menggunakannya untuk mem-parsing Strings to Date dan untuk memformat Dates to Strings. Jika Anda sudah mencoba SimpleDateFormat dan itu tidak berhasil, maka tunjukkan kode Anda dan kesalahan yang mungkin Anda terima.

Tambahan: "mm" dalam format String tidak sama dengan "MM". Gunakan MM selama berbulan-bulan dan mm untuk menit. Juga, yyyyy tidak sama dengan yyyy. misalnya,:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FormateDate {

    public static void main(String[] args) throws ParseException {
        String date_s = "2011-01-18 00:00:00.0";

        // *** note that it's "yyyy-MM-dd hh:mm:ss" not "yyyy-mm-dd hh:mm:ss"  
        SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date date = dt.parse(date_s);

        // *** same for the format String below
        SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(dt1.format(date));
    }

}
Hovercraft Penuh Belut
sumber
impor java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; formateDate kelas publik {/ ** * @param args * @throws ParseException * / public static void main (String [] args) melempar ParseException {// TODO Metode yang dihasilkan secara otomatis rintisan String date_s = "2011-01-18 00:00 : 00.0 "; SimpleDateFormat dt = new SimpleDateFormat ("yyyyy-mm-dd jj: mm: ss"); Tanggal tanggal = dt.parse (date_s); SimpleDateFormat dt1 = new SimpleDateFormat ("yyyyy-mm-dd"); System.out.println (dt1.format (date)); }} saya ingin out put harus "2011-01-18" tetapi out put adalah 02011-00-1
amit4444
Posting kode apa pun yang Anda miliki sebagai tambahan untuk pertanyaan asli (indentasi empat spasi). Dengan cara ini ia akan mempertahankan formatnya dan kita bisa membacanya.
Hovercraft Full Of Belut
1
Lihat edit untuk jawaban saya di atas. Anda menggunakan "mm" dalam format String Anda di mana Anda seharusnya menggunakan "MM"
Hovercraft Full Of Eels
hhakan memberi Anda waktu dalam kisaran 1-12, Anda harus menggunakan aselain untuk mencetak / mengurai AMatau PM. Untuk mencetak / mengurai jam di kisaran 0-23, gunakan HH.
Andre Holzner
22

Mengapa tidak menggunakan ini saja

Date convertToDate(String receivedDate) throws ParseException{
        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
        Date date = formatter.parse(receivedDate);
        return date;
    }

Juga, ini cara lain:

DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
String requiredDate = df.format(new Date()).toString();

atau

Date requiredDate = df.format(new Date());

Bersulang!

89n3ur0n
sumber
2
Kenapa tidak menggunakan ini? Karena (a) ia mengabaikan masalah zona waktu. Menentukan tanggal tergantung pada zona waktu. Kode ini tergantung pada zona waktu default JVM. Jadi, hasilnya dapat bervariasi secara tidak sengaja. Dan (b) karena kelas java.util.Date dan SimpleDateFormat terkenal merepotkan dan harus dihindari.
Basil Bourque
2
selalu kembali strin, Tanggal diperlukanDate = df.format (Tanggal baru ());
delive
15

Menggunakan java.timepaket di Java 8 dan yang lebih baru:

String date = "2011-01-18 00:00:00.0";
TemporalAccessor temporal = DateTimeFormatter
    .ofPattern("yyyy-MM-dd HH:mm:ss.S")
    .parse(date); // use parse(date, LocalDateTime::from) to get LocalDateTime
String output = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(temporal);
Vitalii Fedorenko
sumber
9

[diedit untuk memasukkan koreksi BalusC] Kelas SimpleDateFormat harus melakukan trik:

String pattern = "yyyy-MM-dd HH:mm:ss.S";
SimpleDateFormat format = new SimpleDateFormat(pattern);
try {
  Date date = format.parse("2011-01-18 00:00:00.0");
  System.out.println(date);
} catch (ParseException e) {
  e.printStackTrace();
}
Bryan
sumber
DDsingkatan dari "day in year", bukan "day in month". hhsingkatan dari "hour in am / pm (1-12)", bukan "hour in day (0-23)".
BalusC
9

Jawaban lain benar, pada dasarnya Anda memiliki jumlah karakter "y" yang salah dalam pola Anda.

Zona waktu

Namun satu masalah lagi ... Anda tidak membahas zona waktu. Jika Anda bermaksud UTC , maka Anda seharusnya mengatakannya. Jika tidak, jawabannya tidak lengkap. Jika semua yang Anda inginkan adalah bagian tanggal tanpa waktu, maka tidak ada masalah. Tetapi jika Anda melakukan pekerjaan lebih lanjut yang mungkin melibatkan waktu, maka Anda harus menentukan zona waktu.

Joda-Time

Berikut adalah jenis kode yang sama tetapi menggunakan perpustakaan open-source Joda-Time 2.3 pihak ketiga

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.

String date_s = "2011-01-18 00:00:00.0";

org.joda.time.format.DateTimeFormatter formatter = org.joda.time.format.DateTimeFormat.forPattern( "yyyy-MM-dd' 'HH:mm:ss.SSS" );
// By the way, if your date-time string conformed strictly to ISO 8601 including a 'T' rather than a SPACE ' ', you could
// use a formatter built into Joda-Time rather than specify your own: ISODateTimeFormat.dateHourMinuteSecondFraction().
// Like this:
//org.joda.time.DateTime dateTimeInUTC = org.joda.time.format.ISODateTimeFormat.dateHourMinuteSecondFraction().withZoneUTC().parseDateTime( date_s );

// Assuming the date-time string was meant to be in UTC (no time zone offset).
org.joda.time.DateTime dateTimeInUTC = formatter.withZoneUTC().parseDateTime( date_s );
System.out.println( "dateTimeInUTC: " + dateTimeInUTC );
System.out.println( "dateTimeInUTC (date only): " + org.joda.time.format.ISODateTimeFormat.date().print( dateTimeInUTC ) );
System.out.println( "" ); // blank line.

// Assuming the date-time string was meant to be in Kolkata time zone (formerly known as Calcutta). Offset is +5:30 from UTC (note the half-hour).
org.joda.time.DateTimeZone kolkataTimeZone = org.joda.time.DateTimeZone.forID( "Asia/Kolkata" );
org.joda.time.DateTime dateTimeInKolkata = formatter.withZone( kolkataTimeZone ).parseDateTime( date_s );
System.out.println( "dateTimeInKolkata: " + dateTimeInKolkata );
System.out.println( "dateTimeInKolkata (date only): " + org.joda.time.format.ISODateTimeFormat.date().print( dateTimeInKolkata ) );
// This date-time in Kolkata is a different point in the time line of the Universe than the dateTimeInUTC instance created above. The date is even different.
System.out.println( "dateTimeInKolkata adjusted to UTC: " + dateTimeInKolkata.toDateTime( org.joda.time.DateTimeZone.UTC ) );

Saat dijalankan ...

dateTimeInUTC: 2011-01-18T00:00:00.000Z
dateTimeInUTC (date only): 2011-01-18

dateTimeInKolkata: 2011-01-18T00:00:00.000+05:30
dateTimeInKolkata (date only): 2011-01-18
dateTimeInKolkata adjusted to UTC: 2011-01-17T18:30:00.000Z
Basil Bourque
sumber
9

Silakan merujuk "Pola Tanggal dan Waktu" di sini. http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

import java.text.SimpleDateFormat;
import java.util.Date;
import java.text.ParseException;

public class DateConversionExample{

  public static void main(String arg[]){

    try{

    SimpleDateFormat sourceDateFormat = new SimpleDateFormat("yyyy-MM-DD HH:mm:ss");

    Date date = sourceDateFormat.parse("2011-01-18 00:00:00.0");


    SimpleDateFormat targetDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    System.out.println(targetDateFormat.format(date));

    }catch(ParseException e){
        e.printStackTrace();
    }
  } 

}
Batu ujian
sumber
8
try
 {
    String date_s = "2011-01-18 00:00:00.0";
    SimpleDateFormat simpledateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
    Date tempDate=simpledateformat.parse(date_s);
    SimpleDateFormat outputDateFormat = new SimpleDateFormat("yyyy-MM-dd");           
    System.out.println("Output date is = "+outputDateFormat.format(tempDate));
  } catch (ParseException ex) 
  {
        System.out.println("Parse Exception");
  }
Fathah Rehman P
sumber
7
public class SystemDateTest {

    String stringDate;

    public static void main(String[] args) {
        SystemDateTest systemDateTest = new SystemDateTest();
        // format date into String
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
        systemDateTest.setStringDate(simpleDateFormat.format(systemDateTest.getDate()));
        System.out.println(systemDateTest.getStringDate());
    }

    public Date getDate() {
        return new Date();
    }

    public String getStringDate() {
        return stringDate;
    }

    public void setStringDate(String stringDate) {
        this.stringDate = stringDate;
    }
}
Neeraj Gahlawat
sumber
3
Harap tambahkan beberapa informasi ke jawaban Anda untuk menjelaskan kode Anda.
Kursad Gulseven
ada nama metode getDate () di mana Anda bisa mendapatkan objek tanggal setelah itu menerapkan SimpleDateFormat sehingga Anda dapat mengonversi tanggal sesuai dengan format Anda yang didefinisikan dalam konstruktor SimpleDateFormat dan diatur dalam metode StringDate yang dapat Anda buat dalam cache
Neeraj Gahlawat
6
   String str = "2000-12-12";
   Date dt = null;
   SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

    try 
    {
         dt = formatter.parse(str);
    }
    catch (Exception e)
    {
    }

    JOptionPane.showMessageDialog(null, formatter.format(dt));
Eren
sumber
6

Anda bisa menggunakan:

Date yourDate = new Date();

SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
String date = DATE_FORMAT.format(yourDate);

Itu bekerja dengan sempurna!

cнŝdk
sumber
5

Anda juga dapat menggunakan substring ()

String date_s = "2011-01-18 00:00:00.0";
date_s.substring(0,10);

Jika Anda ingin ruang di depan tanggal, gunakan

String date_s = " 2011-01-18 00:00:00.0";
date_s.substring(1,11);
Martin
sumber
5

Anda dapat mencoba Java 8 baru date, informasi lebih lanjut dapat ditemukan pada dokumentasi Oracle .

Atau Anda dapat mencoba yang lama

public static Date getDateFromString(String format, String dateStr) {

    DateFormat formatter = new SimpleDateFormat(format);
    Date date = null;
    try {
        date = (Date) formatter.parse(dateStr);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    return date;
}

public static String getDate(Date date, String dateFormat) {
    DateFormat formatter = new SimpleDateFormat(dateFormat);
    return formatter.format(date);
}
Ran Adler
sumber
4
private SimpleDateFormat dataFormat = new SimpleDateFormat("dd/MM/yyyy");

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    if(value instanceof Date) {
        value = dataFormat.format(value);
    }
    return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
};
pengguna2632575
sumber
3

hapus satu formulir y SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");seharusnyaSimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");

Pankaj Sharma
sumber
Tidak persis. Anda juga perlu case yang benar (tidak masalah jika Anda menggunakan yang modern DateTimeFormatteratau berpegang teguh pada yang sudah usang SimpleDateFormat).
Ole VV
0

SimpleDateFormat dt1 = new SimpleDateFormat ("yyyy-mm-dd");

Soumya Mahapatra
sumber
Kelas tanggal ini digantikan tahun yang lalu oleh kelas java.time modern . Secara khusus DateTimeFormatterdan DateTimeFormatterBuilder. Menyarankan SimpleDateFormatpada 2019 adalah saran yang buruk.
Basil Bourque
Kode pemformatan Anda salah di sini salah. hhadalah untuk jam.
Basil Bourque
Biasanya kami mengharapkan diskusi atau penjelasan. Stack Overflow dimaksudkan lebih dari sekadar pustaka cuplikan.
Basil Bourque
0

Katakanlah Anda ingin mengubah 2019-12-20 10:50 GMT +6: 00 hingga 2019-12-20 10:50 pertama-tama Anda harus memahami format tanggal terlebih dahulu format satu tanggal adalah yyyy-MM-dd hh : mm a zzz dan format tanggal yang kedua adalah yyyy-MM-hh: mm a

hanya mengembalikan sebuah string dari fungsi ini seperti.

public String convertToOnlyDate(String currentDate) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm a ");
    Date date;
    String dateString = "";
    try {
        date = dateFormat.parse(currentDate);
        System.out.println(date.toString()); 

        dateString = dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return dateString;
}

Fungsi ini akan mengembalikan jawaban keinginan Anda. Jika Anda ingin menyesuaikan lebih banyak, cukup tambahkan atau hapus komponen dari format tanggal.

pavel
sumber