Zmień format daty w ciągu Java

465

Mam Stringreprezentującą randkę.

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

Chciałbym przekonwertować go na Datei wydrukować w YYYY-MM-DDformacie.

18.01.2011

Jak mogę to osiągnąć?


Ok, w oparciu o odpowiedzi, które uzyskałem poniżej, oto coś, czego próbowałem:

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

Ale wyprowadza 02011-00-1zamiast pożądanego 2011-01-18. Co ja robię źle?

amit4444
źródło
163
rrrrr to nie to samo co rrrr. :)
Hovercraft Full Of Eels
2
Pytanie bumerangu. Jaki jest twój przypadek użycia? Ponieważ możliwe jest użycie wbudowanych wzorców (DateFormat.getDateTimeInstance ()).
Paweł Dyda
11
Miesiąc jest reprezentowany przez MM w ciągu formatu, a nie przez mm, jak w powyższych przykładach. mm oznacza minuty.
Mike
3
Zmieniłem rrrr-mm-dd na rrrr-MM-dd, ponieważ początkowa wersja nie działała
Pavlo Zvarych

Odpowiedzi:

506

Użyj LocalDateTime#parse()(lub ZonedDateTime#parse()jeśli łańcuch zawiera część strefy czasowej), aby parsować a Stringw określonym wzorze na aLocalDateTime .

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

Użyj LocalDateTime#format()(lub ZonedDateTime#format()), aby sformatować a LocalDateTimedo Stringokreślonego wzorca.

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

Lub , jeśli nie korzystasz jeszcze z Java 8, użyj SimpleDateFormat#parse()do przetworzenia Stringokreślonego wzorca na Date.

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

Służy SimpleDateFormat#format()do formatowania a Datedo Stringokreślonego wzorca.

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

Zobacz też:


Aktualizacja : zgodnie z nieudaną próbą: w wzorach rozróżniana jest wielkość liter . Przeczytaj java.text.SimpleDateFormatjavadoc, co oznaczają poszczególne części. Oznacza to na przykład Mmiesiące i mminuty. Ponadto istnieją lata czterocyfrowe yyyy, a nie pięć yyyyy. Przyjrzyj się bliżej fragmentom kodu, które opublikowałem tutaj powyżej.

BalusC
źródło
Co zrobić, jeśli chcesz, aby data wyglądała jak „poniedziałek 1 września 2012 r.”?
crmepham
11
@crm: Wystarczy kliknąć link javadoc, znaleźć potrzebne znaki wzorca i odpowiednio zmienić wzór.
BalusC
Jeśli nie korzystasz jeszcze z Java 8, rozważ użycie backportu, ThreeTen Backport , a następnie pierwszych przykładów z odpowiedzi. Lub dla Androida poniżej 26 poziomu API, ThreeTenABP .
Ole VV,
157

Formatowanie jest rozróżniana więc używać MM za miesiąc nie mm (jest to na minutę) i rrrr Dla odniesienia można użyć następujących Cheatsheet.

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

Przykłady:

"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
źródło
1
„rrrr-MM-dd'T'HH: mm: ss.SSSZ” powinno być „rrrr-MM-dd'T'HH: mm: ss.SSS'Z '”
uczciwy gracz
2
nie, jeśli umieścisz Z w pojedynczym cudzysłowie, da Z jako wynik, ale bez niego da Strefę Czasową. na przykład. 2014-08-14T01: 24: 57.236Z i bez niego 2014-08-14T01: 24: 57.236-0530 -> Próbowałem na jdk1.7
Dev
1
„rrrrr.MMMMM.dd GGG gg: mm aaa” 02001. lipca 04.04 12:08 Uwaga: dodatkowe M w miesiącu. Cztery, a nie pięć!
Stefano Mtangoo,
jeśli jest to 4 litery lub więcej, używana jest pełna forma. więc możesz użyć 4 razy m lub nawet 5 razy m to samo
Dev
Jest to w zasadzie kopia-wklej dokumentów. Nie podano żadnych dodatkowych wyjaśnień i nie ma linku do dokumentów, w których można uzyskać więcej informacji w razie potrzeby. -1. ( Oto link btw )
XenoRo
108

Odpowiedzią jest oczywiście utworzenie obiektu SimpleDateFormat i użycie go do parsowania ciągów do daty i formatowania dat do ciągów. Jeśli wypróbowałeś SimpleDateFormat i to nie działało, pokaż kod i ewentualne błędy.

Dodatek: „mm” w formacie String nie jest tym samym co „MM”. Użyj MM na miesiące, a mm na minuty. Ponadto rrrrr to nie to samo co rrrr. na przykład,:

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

}
Poduszkowiec pełen węgorzy
źródło
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class formateDate {/ ** * @param args * @throw ParseException * / public static void main (String [] args) zgłasza ParseException {// TODO Metoda generowana automatycznie Tod String String_s = "2011-01-18 00:00 : 00.0 ”; SimpleDateFormat dt = nowy SimpleDateFormat ("rrrrr-mm-dd gg: mm: ss"); Data data = dt.parse (data_s); SimpleDateFormat dt1 = nowy SimpleDateFormat („rrrrr-mm-dd”); System.out.println (dt1.format (data)); }} Chcę, aby wyjście było „2011-01-18”, ale wyjście jest 02011–00–1
amit4444,
Opublikuj dowolny kod, który masz jako dodatek do pierwotnego pytania (wcięte cztery spacje). W ten sposób zachowa formatowanie i będziemy mogli go przeczytać.
Hovercraft Full Of Eels
1
Zobacz edycję mojej odpowiedzi powyżej. Używasz „mm” w swoim formacie Ciąg, w którym powinieneś używać „MM”
Hovercraft Full Of Eels
hhda ci godzinę w przedziale 1-12, musisz użyć aoprócz drukowania / parsowania AMlub PM. Aby wydrukować / parsować godzinę w zakresie 0–23, użyj HH.
Andre Holzner,
22

Dlaczego po prostu tego nie użyć?

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

Jest to również inny sposób:

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

lub

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

Twoje zdrowie!

89n3ur0n
źródło
2
Dlaczego tego nie użyć? Ponieważ (a) ignoruje kwestię strefy czasowej. Określenie daty zależy od strefy czasowej. Ten kod zależy od domyślnej strefy czasowej maszyny JVM. Dlatego wyniki mogą się nieumyślnie różnić. I (b) ponieważ klasy java.util.Date i SimpleDateFormat są niezwykle kłopotliwe i należy ich unikać.
Basil Bourque,
2
zawsze zwracaj strin, wymagana data Data = df.format (nowa data ());
wyślij
15

Korzystanie z java.timepakietu w Javie 8 i nowszych:

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
źródło
9

[edytowany w celu uwzględnienia poprawek BalusC] Klasa SimpleDateFormat powinna załatwić sprawę :

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
źródło
DDoznacza „dzień w roku”, a nie „dzień w miesiącu”. hhoznacza „godzinę rano / wieczorem (1-12)”, a nie „godzinę dziennie (0–23)”.
BalusC
9

Inne odpowiedzi są poprawne, w zasadzie miałeś niepoprawną liczbę znaków „y” we wzorcu.

Strefa czasowa

Jeszcze jeden problem… Nie adresowałeś stref czasowych. Jeśli miałeś zamiar UTC , powinieneś to powiedzieć. Jeśli nie, odpowiedzi nie są kompletne. Jeśli wszystko, czego chcesz, to porcja daty bez czasu, to nie ma problemu. Ale jeśli wykonasz dalszą pracę, która może wymagać czasu, powinieneś określić strefę czasową.

Joda-Time

Oto ten sam rodzaj kodu, ale z wykorzystaniem biblioteki Joda-Time 2.3 innej firmy

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

Po uruchomieniu…

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
źródło
9

Zobacz „Wzorce daty i godziny” tutaj. 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();
    }
  } 

}
Kamień probierczy
źródło
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.
źródło
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
źródło
3
Dodaj informacje do swoich odpowiedzi, aby wyjaśnić swój kod.
Kursad Gulseven
istnieje metoda getDate (), za pomocą której można uzyskać datę obj po zastosowaniu SimpleDateFormat, dzięki czemu można przekonwertować datę zgodnie z formatem zdefiniowanym w konstruktorze SimpleDateFormat i ustawić w metodzie StringDate, aby można ją było buforować
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
źródło
6

Możesz po prostu użyć:

Date yourDate = new Date();

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

Działa idealnie!

cнŝdk
źródło
5

Możesz także użyć substring ()

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

Jeśli chcesz wstawić spację przed datą, użyj

String date_s = " 2011-01-18 00:00:00.0";
date_s.substring(1,11);
Jaskółka oknówka
źródło
5

Możesz wypróbować nową Javę 8date , więcej informacji można znaleźć w dokumentacji Oracle .

Lub możesz wypróbować stary

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
źródło
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);
};
użytkownik2632575
źródło
3

usuń jeden y SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");powinien byćSimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");

Pankaj Sharma
źródło
Nie dokładnie. Potrzebujesz także właściwej skrzynki (bez względu na to, czy korzystasz z nowoczesnego, czy trzymasz DateTimeFormattersię przestarzałego SimpleDateFormat).
Ole VV
0

SimpleDateFormat dt1 = nowy SimpleDateFormat („rrrr-mm-dd”);

Soumya Mahapatra
źródło
Ta klasa daty i czasu została wyparta wiele lat temu przez nowoczesne klasy java.time . W szczególności DateTimeFormatteri DateTimeFormatterBuilder. Sugerowanie SimpleDateFormatw 2019 roku to kiepska rada.
Basil Bourque,
Niepoprawne Kody formatujące tutaj są nieprawidłowe. hhjest na godzinę.
Basil Bourque,
Zwykle oczekujemy dyskusji lub wyjaśnienia. Przepełnienie stosu ma być czymś więcej niż biblioteką fragmentów.
Basil Bourque,
0

Powiedz, że chcesz zmienić 2019-12-20 10:50 GMT + 6: 00 na 2019-12-20 10:50 przede wszystkim musisz zrozumieć format daty. Pierwszy format daty to rrrr-MM-dd hh : mm a zzz i format drugiej daty to rrrr-MM-dd gg: mm a

po prostu zwróć ciąg z tej funkcji jak.

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

Ta funkcja zwróci twoją pożądaną odpowiedź. Jeśli chcesz dostosować więcej, po prostu dodaj lub usuń składnik z formatu daty.

pavel
źródło