Ändern Sie das Datumsformat in einer Java-Zeichenfolge

465

Ich habe Stringein Datum dargestellt.

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

Ich möchte es in a konvertieren Dateund im YYYY-MM-DDFormat ausgeben .

2011-01-18

Wie kann ich das erreichen?


Okay, basierend auf den Antworten, die ich unten abgerufen habe, habe ich Folgendes versucht:

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

Es wird aber 02011-00-1anstelle des gewünschten ausgegeben 2011-01-18. Was mache ich falsch?

amit4444
quelle
163
JJJJJ ist nicht dasselbe wie JJJJ. :)
Luftkissenfahrzeug voller Aale
2
Eine Bumerangfrage. Was ist Ihr Anwendungsfall? Weil es möglich ist, dass Sie integrierte Muster verwenden sollten (DateFormat.getDateTimeInstance ()).
Paweł Dyda
11
Der Monat wird mit MM in der Formatzeichenfolge dargestellt, nicht mit mm wie in den obigen Beispielen. mm bedeutet Minuten.
Mike
3
Ich habe JJJJ-MM-TT in JJJJ-MM-TT geändert, weil die ursprüngliche Version nicht funktioniert hat
Pavlo Zvarych

Antworten:

506

Verwenden Sie LocalDateTime#parse()(oder ZonedDateTime#parse()wenn die Zeichenfolge zufällig einen Zeitzonenteil enthält), um a Stringin einem bestimmten Muster in a zu analysieren LocalDateTime.

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

Verwenden Sie LocalDateTime#format()(oder ZonedDateTime#format()), um LocalDateTimea Stringin ein bestimmtes Muster zu formatieren .

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

Oder , wenn Sie nicht auf Java sind 8 noch, verwenden Sie SimpleDateFormat#parse()ein zu analysieren , Stringin eine in einem bestimmten Muster Date.

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

Verwenden Sie SimpleDateFormat#format()diese Option, um a Datein Stringeinem bestimmten Muster zu formatieren .

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

Siehe auch:


Update : Gemäß Ihrem fehlgeschlagenen Versuch: Bei den Mustern wird zwischen Groß- und Kleinschreibung unterschieden . Lesen Sie im java.text.SimpleDateFormatJavadoc, wofür die einzelnen Teile stehen. So steht zum Beispiel Mfür Monate und mfür Minuten. Es gibt auch vierstellige Jahre yyyy, nicht fünf yyyyy. Schauen Sie sich die Code-Schnipsel genauer an, die ich hier oben gepostet habe.

BalusC
quelle
Was ist, wenn das Datum wie "Montag, 1. September 2012" aussehen soll?
Crmepham
11
@crm: Klicken Sie einfach auf den Javadoc-Link, stellen Sie dort die erforderlichen Musterzeichen fest und ändern Sie das Muster entsprechend.
BalusC
Wenn Sie noch nicht mit Java 8 arbeiten, sollten Sie den Backport ThreeTen Backport und dann die ersten Beispiele aus der Antwort verwenden. Oder für Android unter API Level 26, ThreeTenABP .
Ole VV
157

Die Formatierung ist CASE-EMPFINDLICH. Verwenden Sie daher MM für Monat und nicht MM (dies ist für Minute) und JJJJ. Als Referenz können Sie das folgende Cheatsheet verwenden.

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

Beispiele:

"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
quelle
1
"yyyy-MM-dd'T'HH: mm: ss.SSSZ" sollte "yyyy-MM-dd'T'HH: mm: ss.SSS'Z '" sein
ein fairer Spieler
2
Nein, wenn Sie Z in einfache Anführungszeichen setzen, wird Z als Ausgabe ausgegeben, aber ohne Zon wird die Zeitzone angegeben. z.B. 2014-08-14T01: 24: 57.236Z und von außen 2014-08-14T01: 24: 57.236-0530 -> Ich habe es mit jdk1.7 versucht
Dev
1
"yyyyy.MMMMM.dd GGG hh: mm aaa" 02001.July.04 AD 12:08 PM Beachten Sie zusätzliches M im Monat. Vier nicht fünf!
Stefano Mtangoo
Wenn es 4 Buchstaben oder mehr sind, wird das vollständige Formular verwendet. Sie können also 4 mal m oder sogar 5 mal m gleich verwenden
Dev
Dies ist so ziemlich ein Copy-Paste der Dokumente. Es werden keine zusätzlichen Erklärungen bereitgestellt, und es gibt keinen Link zu den Dokumenten, in denen bei Bedarf weitere Informationen abgerufen werden können. -1. ( Hier ist übrigens der Link )
XenoRo
108

Die Antwort besteht natürlich darin, ein SimpleDateFormat-Objekt zu erstellen und damit Zeichenfolgen auf Datum zu analysieren und Daten auf Zeichenfolgen zu formatieren. Wenn Sie SimpleDateFormat ausprobiert haben und es nicht funktioniert hat, zeigen Sie bitte Ihren Code und eventuelle Fehler an.

Nachtrag: "mm" im Format String ist nicht dasselbe wie "MM". Verwenden Sie MM für Monate und mm für Minuten. Außerdem ist JJJJJ nicht dasselbe wie JJJJ. z.B,:

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

}
Luftkissenfahrzeug voller Aale
quelle
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class formateDate {/ ** * @param args * @throws ParseException * / public static void main (String [] args) löst ParseException aus {// TODO Automatisch generierte Methode stub String date_s = "2011-01-18 00:00 : 00.0 "; SimpleDateFormat dt = neues SimpleDateFormat ("JJJJJ-MM-TT HH: MM: SS"); Datum Datum = dt.parse (date_s); SimpleDateFormat dt1 = neues SimpleDateFormat ("JJJJJ-MM-TT"); System.out.println (dt1.format (Datum)); }} Ich möchte, dass die Ausgabe "2011-01-18" sein sollte, aber die Ausgabe ist 02011-00-1
amit4444
Veröffentlichen Sie einen Code, den Sie als Ergänzung zur ursprünglichen Frage haben (eingerückte vier Leerzeichen). Auf diese Weise behält es seine Formatierung bei und wir können es dann lesen.
Luftkissenfahrzeug voller Aale
1
Siehe Bearbeiten meiner Antwort oben. Sie verwenden "mm" in Ihrem Format String, wo Sie "MM"
Hovercraft Full Of Eels
hhgibt Ihnen die Stunde im Bereich von 1-12, die Sie azusätzlich zum Drucken / Parsen AModer verwenden müssen PM. Verwenden Sie zum Drucken / Analysieren der Stunde im Bereich von 0 bis 23 HH.
Andre Holzner
22

Warum nicht einfach nutzen?

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

Dies ist auch der andere Weg:

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

oder

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

Prost!

89n3ur0n
quelle
2
Warum nicht nutzen? Weil (a) das Problem der Zeitzone ignoriert wird. Die Bestimmung des Datums hängt von der Zeitzone ab. Dieser Code hängt von der Standardzeitzone der JVM ab. Daher können die Ergebnisse versehentlich variieren. Und (b) weil die Klassen java.util.Date und SimpleDateFormat notorisch problematisch sind und vermieden werden sollten.
Basil Bourque
2
immer strin zurückgeben, Erforderliches DatumDatum = df.format (neues Datum ());
liefern
15

Verwenden des java.timePakets in Java 8 und höher:

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
quelle
9

[bearbeitet, um die Korrekturen von BalusC einzuschließen] Die SimpleDateFormat- Klasse sollte den Trick ausführen :

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
quelle
DDsteht für "Tag im Jahr", nicht für "Tag im Monat". hhsteht für "Stunde in morgens / abends (1-12)", nicht für "Stunde in Tag (0-23)".
BalusC
9

Andere Antworten sind richtig. Grundsätzlich hatten Sie die falsche Anzahl von "y" -Zeichen in Ihrem Muster.

Zeitzone

Noch ein Problem… Sie haben keine Zeitzonen angesprochen. Wenn Sie UTC beabsichtigt haben , sollten Sie dies gesagt haben. Wenn nicht, sind die Antworten nicht vollständig. Wenn Sie nur den Datumsanteil ohne Uhrzeit wünschen, ist dies kein Problem. Wenn Sie jedoch weitere Arbeiten ausführen, die Zeit erfordern, sollten Sie eine Zeitzone angeben.

Joda-Zeit

Hier ist die gleiche Art von Code, jedoch unter Verwendung der Open-Source- Joda-Time 2.3-Bibliothek eines Drittanbieters

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

Beim Laufen…

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
quelle
9

Bitte beziehen Sie sich hier auf "Datums- und Zeitmuster". 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();
    }
  } 

}
Prüfstein
quelle
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.
quelle
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
quelle
3
Bitte fügen Sie Ihren Antworten einige Informationen hinzu, um Ihren Code zu erläutern.
Kursad Gulseven
Es gibt einen Methodennamen getDate (), mit dem Sie das Datum obj abrufen können. Wenden Sie anschließend SimpleDateFormat an, damit Sie das Datum gemäß Ihrem Format konvertieren können, das im SimpleDateFormat-Konstruktor definiert und in der StringDate-Methode festgelegt ist. Sie können es zwischengespeichert machen
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
quelle
6

Sie können einfach verwenden:

Date yourDate = new Date();

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

Es funktioniert perfekt!

cнŝdk
quelle
5

Sie können auch Teilzeichenfolge () verwenden

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

Wenn Sie ein Leerzeichen vor dem Datum möchten, verwenden Sie

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

Sie können Java 8 neu ausprobieren date. Weitere Informationen finden Sie in der Oracle-Dokumentation .

Oder Sie können die alte versuchen

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
quelle
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);
};
user2632575
quelle
3

entfernen Sie eine y Form SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");sollte seinSimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");

Pankaj Sharma
quelle
Nicht genau. Sie brauchen auch den richtigen Fall (egal ob Sie den modernen verwenden DateTimeFormatteroder an dem veralteten festhalten SimpleDateFormat).
Ole VV
0

SimpleDateFormat dt1 = neues SimpleDateFormat ("JJJJ-MM-TT");

Soumya Mahapatra
quelle
Diese Datums- / Uhrzeitklasse wurde vor Jahren durch die modernen java.time- Klassen ersetzt. Speziell DateTimeFormatterund DateTimeFormatterBuilder. Ein Vorschlag SimpleDateFormatfür 2019 ist ein schlechter Rat.
Basil Bourque
Falsch Ihre Formatierungscodes hier sind falsch. hhist für eine Stunde.
Basil Bourque
Normalerweise erwarten wir eine Diskussion oder Erklärung. Der Stapelüberlauf ist mehr als eine Snippet-Bibliothek.
Basil Bourque
0

Angenommen, Sie möchten 2019-12-20 10:50 AM GMT + 6: 00 bis 2019-12-20 10:50 AM ändern. Zunächst müssen Sie das Datumsformat verstehen. Das erste Datumsformat ist JJJJ-MM-TT hh : mm a zzz und das zweite Datumsformat sind JJJJ-MM-TT hh: MM a

Geben Sie einfach einen String von dieser Funktion wie zurück.

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

Diese Funktion gibt Ihre gewünschte Antwort zurück. Wenn Sie weitere Anpassungen vornehmen möchten, fügen Sie einfach eine Komponente zum Datumsformat hinzu oder entfernen Sie sie.

pavel
quelle