Frage

'2009-12 Dec' should be converted to '31-DEC-2009'
'2010-09 Sep' should be converted to '30-SEP-2010'
'2010-02 Feb' should be converted to '28-FEB-2010'
'2008-02 Feb' should be converted to '29-FEB-2008'

Die Werte 2009-12 Dezember , 2008-02 Februar wird den Benutzer in einem Drop-Down angezeigt. Die Benutzer haben keine Möglichkeit, die TAG, um .

Der Benutzer ausgewählte Wert sollte auf die Datenbank übergeben werden. Aber die Datenbank erwartet Sie das Datum im Format DD-MMM-YYYY. Die Abfrage hat ‚<= USER_DATE‘ Zustand. So soll der letzte Tag des Monats automatisch in die Datenbank ausgewählt und übergeben werden.

Pl-Hilfe mich in die Funktion zu schreiben, die die obige Arbeit leistet.

static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM MMM");

    public static String convertMapedToSqlFormat(final String maped) {
        String convertedMaped = null;
        //....
        return convertedMaped;
    }

    @Test
    public void testConvertMapedToSqlFormat() {
        String[] mapedValues = { "2009-12 Dec", "2009-11 Nov", "2009-10 Oct",
                "2009-09 Sep", "2009-08 Aug", "2009-07 Jul", "2009-06 Jun",
                "2009-05 May", "2009-04 Apr", "2009-03 Mar", "2009-02 Feb",
                "2009-01 Jan", "2008-12 Dec", "2008-11 Nov", "2008-10 Oct" };
        for (String maped : mapedValues) {
            System.out.println(convertMapedToSqlFormat(maped));
        }
    }
War es hilfreich?

Lösung

Konvertieren es Calendar und Verwendung Calendar#getActualMaximum() zu erhalten letzter Tag des Monats und den Tag mit ihm festgelegt.

Kickoff Beispiel:

String oldString = "2009-12 Dec";
Calendar calendar = Calendar.getInstance();
calendar.setTime(new SimpleDateFormat("yyyy-MM").parse(oldString)); // Yes, month name is ignored but we don't need this.
calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
String newString = new SimpleDateFormat("dd-MMM-yyyy").format(calendar.getTime()).toUpperCase();
System.out.println(newString); // 31-DEC-2009

Andere Tipps

  • Verwenden der DateFormat (aber fix es yyyy-dd MMM), um das Datum zu analysieren
  • wandeln die Date zu Calendar
  • Verwenden Sie Calendar.getActualMaximim()
  • Verwendung dd-MMM-yyyy das erhaltene Datum zu formatieren.
  • Anruf .toUpperCase()

So:

static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM MMM");
static SimpleDateFormat dbDateFormat = new SimpleDateFormat("yyyy-MMM-dd");

public static String convertMapedToSqlFormat(final String maped) {
    Date date = dateFormat.parse(mapped);
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
    return dbDateFormat.format(cal.getTime()).toUpperCase();
}

Ein paar Anmerkungen:

  • Möglichkeit Gebrauch joda Zeit DateTime
  • vermeiden, strenge Datumsformate in der Datenbank.

Holen Sie sich das Jahr und Monat ab dem YYYY-MM-Teil des Strings.

Verwenden JODA einen Zeitpunkt entsprechend dem ersten Tag des Monats zu erstellen. Um einen Monat nach vorn, und einem Tag zurück. Flatten die Zeit der Stringdarstellung Sie benötigen.

Hallo Sie haben Ihr Datum zu analysieren, wie so

      SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
      Date du = new Date();
      du = df.parse(sDate);
      df = new SimpleDateFormat("yyyy-MM-dd");
      sDate = df.format(du);

Hope, das hilft. Lassen Sie mich wissen, ob es funktioniert.

PK

java.time

Viele einfacher jetzt mit den modernen java.time Klassen, die die lästigen alten Datum Zeitklassen gesehen hier in der Frage und Antworten ersetzen.

Die java.time Rahmen ist in Java 8 gebaut und später. Diese Klassen verdrängen die alten lästigen Datum Zeitklassen wie java.util.Date, .Calendar & java.text.SimpleDateFormat.

Jetzt in Wartungsmodus , die Joda-Time Projekt berät auch die Migration zu java.time.

Um mehr zu erfahren, finden Sie in der Oracle Tutorial . Und sucht Stack-Überlauf für viele Beispiele und Erklärungen.

Ein großer Teil der java.time Funktionalität zurückportiert zu Java 6 & 7 in ThreeTen-Backport und weiter angepasst Android in ThreeTenABP .

Das ThreeTen-Extra Projekt erstreckt java.time mit zusätzlichen Klassen. Dieses Projekt ist eine Bewährungsprobe für eine mögliche zukünftige Ergänzungen java.time.

YearMonth

Die YearMonth Klasse bietet genau das, was Sie wollen.

YearMonth start = YearMonth.of( 2008 , Month.OCTOBER );
YearMonth stop = YearMonth.of( 2009 , Month.DECEMBER );
List<YearMonth> yms = new ArrayList<>();
YearMonth ym = start ;
while( ! ym.isAfter( stop ) ) {
    yms.add( ym );
    // Set up the next loop.
    ym = ym.plusMonths( 1 ); 
}

Zur Zeit eine DateTimeFormatter verwenden, um eine String-Darstellung des YearMonth Wertes zu erzeugen.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM MMM" );
f = f.withLocale( Locale.CANADA_FRENCH );  // Or Locale.US etc.
String output = ym.format( f );

Um den letzten Tag des Monats zu bekommen, befragt das YearMonth Objekt.

LocalDate endOfMonth = ym.atEndOfMonth();

Zur Zeit verwenden, um eine DateTimeFormatter. Entweder lassen Sie einen Formatierer instantiate dass automatisch an einem bestimmten Locale entsprechenden lokalisiert oder eigene Formatierung Muster angeben. Gezeigt oft in vielen anderen Fragen und Antworten auf Stack-Überlauf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top