wake-up-neo.com

Vereinfachtes Format, nicht analysierbares Datum

Ich habe eine String in einer Datenbank (match.getDate), die das folgende Datumsformat hat:

01/04/2018

Dies ist das Datum, das ich formatieren möchte, gespeichert als Tag/Monat/Jahr. Ich möchte dies für meine Android-App formatieren.

Ich möchte das Datum folgendermaßen formatieren:

So 01 Apr 2018

Mein Code unten:

SimpleDateFormat fDate = new SimpleDateFormat("dd/MM/yyyy");
try {
    textViewDate.setText(fDate.parse(match.getDate()).toString());
} catch (ParseException ex) {
    System.out.println(ex.toString());
}

Dies gibt aus:

So Apr 08 00:00:00 GMT + 00: 00 2018.

Ich habe auch "EE, MM d, yyyy" ausprobiert, aber es gibt mir:

Java.text.ParseException: Nicht analysierbares Datum: "01/04/2018"

3
Carl Bruiners

Verwenden Sie diese von mir erstellte Datumsformatierungsmethode

    public static String dateFormater(String dateFromJSON, String expectedFormat, String oldFormat) {
    SimpleDateFormat dateFormat = new SimpleDateFormat(oldFormat);
    Date date = null;
    String convertedDate = null;
    try {
        date = dateFormat.parse(dateFromJSON);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(expectedFormat);
        convertedDate = simpleDateFormat.format(date);
    } catch (Exception e) {
        e.printStackTrace();
    }

    return convertedDate;
}

und nennen Sie diese Methode gerne

dateFormater(" 01/04/2018" , "EE dd MMM yyyy" , "dd/MM/yyyy") 

und Sie erhalten die gewünschte Ausgabe

3
Harsh Patel

Die anderen Antworten haben Ihr Problem gelöst, aber ich denke, es ist wichtig, einige Konzepte zu kennen und warum Ihr erster Versuch nicht funktioniert hat.

Es gibt einen Unterschied zwischen einem Datum und einem Text, der ein Datum darstellt.

Beispiel: Das heutige Datum ist 9. März 2018. Dieses Datum ist nur ein Konzept, eine Vorstellung von "einem bestimmten Punkt in unserem Kalendersystem".

Dasselbe Datum kann jedoch in vielen Formaten dargestellt werden. Es kann "grafisch" sein, in Form eines Kreises um eine Zahl auf einem Blatt Papier mit vielen anderen Zahlen in einer bestimmten Reihenfolge, oder es kann sich in Klartext befinden, wie:

  • 09.03.2014 (Tag/Monat/Jahr)
  • 03/09/2018 (Montag/Tag/Jahr)
  • 2018-03-09 ( ISO8601-Format )
  • 9. Märzth 2018
  • 9 de março de 2018 (auf Portugiesisch)
  • 2018 年 3 月 5 日 (auf japanisch)
  • und so weiter...

Beachten Sie, dass die Textdarstellungen unterschiedlich sind, aber alle dasselbe Datum (denselben Wert) darstellen.

In diesem Sinne wollen wir sehen, wie Java mit diesen Konzepten arbeitet.

  • ein Text wird durch eine String dargestellt. Diese Klasse enthält eine Folge von Zeichen, nichts weiter. Diese Zeichen können alles darstellen. In diesem Fall ist es ein Datum
  • ein Datum wurde anfänglich durch Java.util.Date und dann durch Java.util.Calendar dargestellt, aber diese Klassen sind voller Probleme und Sie sollten sie möglichst vermeiden. Heute haben wir eine bessere API dafür .

In Android können Sie die Java.time-Klassen verwenden, sofern diese auf der von Ihnen verwendeten API-Ebene verfügbar sind, oder die Option threeten backport für API-Ebenen, die darunter liegen ( prüfen Sie hier, wie Sie sie verwenden ). Sie haben einfachere und zuverlässigere Tools, um mit Datumsangaben umzugehen.

In Ihrem Fall haben Sie eine String (einen Text, der ein Datum darstellt) und möchten es in ein anderes Format konvertieren. Sie müssen es in 2 Schritten tun:

  1. konvertieren Sie die Variable String in einen Datentyp (konvertieren Sie den Text in numerische Werte für Tag/Monat/Jahr) - das heißt parsing.
  2. konvertieren Sie diesen datentypischen Wert in ein bestimmtes Format (wandeln Sie die numerischen Werte in Text in einem bestimmten Format um) - das heißt formatierung.

Warum haben Ihre Versuche nicht funktioniert?

  • beim ersten Versuch haben Sie das falsche Format angegeben, weil Sie Date::toString() method aufgerufen haben, wodurch eine Ausgabe (eine Textdarstellung) in diesem Format (Sun Apr 08 00:00:00 GMT+00:00 2018) erzeugt wird. Die Analyse war also korrekt, die Formatierung jedoch nicht
  • im zweiten Versuch haben Sie das Ausgabemuster (EE dd MMM yyyy, das Sie zum Formatieren verwenden sollten) verwendet, um das Datum zu analysieren (was die ParseException verursacht hat).

Für Schritt 1 können Sie eine LocalDate verwenden, einen Typ, der ein Datum darstellt (Tag, Monat und Jahr, ohne Stunden und ohne Zeitzone), denn dies ist Ihre Eingabe:

String input = "01/04/2018";
DateTimeFormatter inputParser = DateTimeFormatter.ofPattern("dd/MM/yyyy");
// parse the input
LocalDate date = LocalDate.parse(input, inputParser);

Das ist zuverlässiger als SimpleDateFormat, weil es viele seltsame Fehler und Probleme der alten API löst.

Nun, da wir unser LocalDate-Objekt haben, können wir Schritt 2 ausführen:

// convert to another format
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EE dd MMM yyyy", Locale.ENGLISH);
String output = date.format(formatter);

Beachten Sie, dass ich einen Java.util.Locale verwendet habe. Das liegt daran, dass die gewünschte Ausgabe den Wochentag und den Monatsnamen in Englisch hat. Wenn Sie kein Gebietsschema angeben, wird die Standardeinstellung der JVM verwendet (und wer garantiert, dass es immer Englisch sein wird.) API, welche Sprache Sie verwenden, anstatt sich auf die Standardkonfigurationen zu verlassen, da diese jederzeit geändert werden können, auch von anderen Anwendungen, die in derselben JVM ausgeführt werden.

Und woher weiß ich, welche Buchstaben in DateTimeFormatter verwendet werden müssen? Nun, ich habe gerade die javadoc gelesen.

1
shind

Sie benötigen hier zwei Datumsformatierer. Eine zum Analysieren der Eingabe und ein anderes Formatierungsprogramm zum Formatieren der Ausgabe.

SimpleDateFormat inDateFmt = new SimpleDateFormat("dd/MM/yyyy");
SimpleDateFormat outDateFmt = new SimpleDateFormat("EEE dd MMM yyyy");
try {
    Date date = inDateFmt.parse(match.getDate());
    textViewDate.setText(outDateFmt.format(date));
} catch (ParseException ex) {
    System.out.println(ex.toString());
}
1
kshetline

Versuchen Sie es mit new SimpleDateFormat("EEE dd MMM yyyy", Locale.ENGLISH);

Beispielcode:

DateFormat originalFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH);
DateFormat targetFormat = new SimpleDateFormat("EEE dd MMM yyyy", Locale.ENGLISH);
Date date = originalFormat.parse("01/04/2018");
String formattedDate = targetFormat.format(date);  // Sun 01 Apr 2018
1
Gokul Nath KP

Probieren Sie dies aus, Sie können damit ein beliebiges Datumsformat erstellen

        public String parseTime(String date){
        SimpleDateFormat format = new SimpleDateFormat("yyyy-dd-MM HH:mm:ss");
        try {
            Date date1 = format.parse(date.replace("T"," "));
            String d= new SimpleDateFormat("yyyy/dd/MM HH:mm:ss").format(date1);
            return d;
        }catch (Exception e){
            e.printStackTrace();
        }
        return "";
    }
0
akshay

prüfen Sie zuerst Ihre match.getDate () -Methode, welches Format das angegebene Datum hat, wenn oben das Formatdatum angegeben ist, das dann unter dem Code verwendet wird und das Datum im oben definierten Format anzeigen ...

String date="09/03/2018";
    SimpleDateFormat parseDateFormat = new SimpleDateFormat("dd/MM/yyyy"); // if your match.getDate() given this format date.and if is given different format that time define that format.
    DateFormat formatdate = new SimpleDateFormat("EEE dd MMM yyyy");

    try {
        Date date1=parseDateFormat.parse(date);
        Log.d("New Date",formatdate.format(date1));
    } catch (ParseException e) {
        e.printStackTrace();
    }

ausgabe :: Fr 09 Mar 2018

0
Android Team