2016-05-11 7 views
0

Ist es möglich, ein Format zu definieren, das zwei Daten kombiniert?
Zum Beispiel nehme an, dass ich date1 z.B. 15/1/2016 und date2. z.B. 20/1/2016 Gibt es irgendein Format, das ich verwenden könnte, um etwas wie zu zeigen:
15-20 Jan 2016?Kombiniere 2 Daten mit einem Format?

Anderes Beispiel:
z. nehme an, dass ich date1 z.B. 15/1/2016 und date2. z.B. 20/5/2016 Ergebnis: 15. Januar - 20. Mai 2016

+2

Was wäre der Typ des resultierenden Objekts? ein Treffen ? ein Faden ? – ortis

+0

@ortis: Ich möchte eine Zeichenfolge – Jim

+1

Was ist mit der "Januar" Informationen in 15/1/2016 passiert? Bitte posten Sie die genauen Regeln, die Sie wollen. – Tunaki

Antwort

3

Hier ist eine Möglichkeit, dies zu tun. Dies berücksichtigt natürlich nicht, dass die Daten in verschiedenen Monaten oder Jahren liegen können. Es dauert den Monat und das Jahr von startDate.

LocalDate startDate = LocalDate.of(2016, 5, 15); 
LocalDate endDate = LocalDate.of(2016, 5, 20); 

String text = String.format("%1$te-%2$te %1$tB %1$tY", startDate, endDate); 

System.out.println(text); 

Siehe the documentation für wie die Formatzeichenfolge funktioniert.

HINWEIS: Dies verwendet Java 8 java.time.LocalDate und nicht Joda Time.

+0

Was ist mit einem breiteren Datumsbereich? Wie im zweiten Beispiel – Jim

+0

@Jim ändern Sie die Formatzeichenfolge, zum Beispiel zu: '"% 1 $ te% 1 $ tb -% 2 $ te% 2 $ tb% 1 $ tY "" - siehe [die Dokumentation] (http: //docs.oracle.com/javase/8/docs/api/java/util/Formatter.html#syntax) (<= klicke auf den Link). – Jesper

1

15-20 Mai 2016 - Dies ist kein echtes Datumsformat. Ich denke nicht, dass es irgendein Format dafür gibt. aber Sie können Ihre eigene Methode definieren, die eine Zeichenfolge zurückgeben und wenn Sie mit Java 8 Verwendung LOCALDATE

LocalDate myDate = new LocalDate("2016-5-15"); 
LocalDate endDate =new LocalDate(2016-5-20); 

String format = mydate.getDayOfMonth() 
+"-"+ endDate.getDayOfMonth() 
+" "+endDate.getMonth().toString() 
+" "+endDate.getYear(); 
0
public String dateRangeToString(Date date1, Date date2){ 
    Calendar firstCal = Calendar.getInstance(); 
    firstCal.setTime(date1); 
    Calendar secondCal = Calendar.getInstance(); 
    secondCal .setTime(date2); 
    if (firstCal.getTimeInMillis() > secondCal.getTimeInMillis()){ 
     firstCal.setTime(date2); 
     secondCal .setTime(date1); 
    } 
    String result; 
    SimpleDateFormat format = new SimpleDateFormat("dd MMMM yyyy"); 
    if (firstCal.get(Calendar.YEAR) < secondCal.get(Calendar.YEAR)){ 
     result = format.format(firstCal.getTime()) + " - " + format.format(secondCal.getTime()); 
    } 
    else if (firstCal.get(Calendar.MONTH) < secondCal.get(Calendar.MONTH)){ 
     SimpleDateFormat formatTemp = new SimpleDateFormat("dd MMMM"); 
     result = formatTemp .format(firstCal.getTime()) + " - " + format.format(secondCal.getTime()); 
    } 
    else if (firstCal.get(Calendar.DAY_OF_MONTH) < secondCal.get(Calendar.DAY_OF_MONTH)){ 
     SimpleDateFormat formatTemp = new SimpleDateFormat("dd"); 
     result = formatTemp .format(firstCal.getTime()) + " - " + format.format(secondCal.getTime()); 
    } 
    else{//Both dates are equal 
     result = format.format(firstCal.getTime()); 
    } 
    return result; 
} 

, die funktionieren sollte, nicht schön, aber da Sie so viele Variationen haben kann, sollte es verwalten, was Sie wollen.

Um zu erklären, muss es eine if-Anweisung verwenden, um zu überprüfen, welche Teile des Datums nicht gleich sind, ist es nur das Jahr, der Monat oder der Tag? Je nachdem, welcher Teil fehlschlägt, wird festgelegt, welche Zeichenfolge ausgegeben werden soll. Ich habe dann Variationen verwenden der SimpleDateFormat zur Ausgabe der gewünschten Zeichenfolge

EDIT Verwendung des folgenden Codes:

Calendar calendar = Calendar.getInstance(); 
    calendar.set(2013,5,29); 
    Calendar calendar2 = Calendar.getInstance(); 
    calendar2.set(2012,4,30); 
    System.out.println(dateRangeToString(calendar.getTime(), calendar2.getTime())); 


    calendar.set(2013,5,29); 
    calendar2.set(2013,4,30); 
    System.out.println(dateRangeToString(calendar.getTime(), calendar2.getTime())); 

    calendar.set(2013,5,29); 
    calendar2.set(2013,5,30); 
    System.out.println(dateRangeToString(calendar.getTime(), calendar2.getTime())); 


    calendar.set(2013,5,30); 
    calendar2.set(2013,5,30); 
    System.out.println(dateRangeToString(calendar.getTime(), calendar2.getTime())); 

ich die folgenden Ergebnisse erhalten:

30. Mai 2012 - 29. Juni 2013

30. Mai - 29. Juni 2013

29-30 Juni 2013

30. Juni 2013

0

ISO 8601

Der ISO 8601 Standard definiert Formate für Textdarstellungen von verschiedenen Datumszeitwerte.

Die Standardmethode zum Darstellen einer Zeitspanne ist das Datum, das als YYYY-MM-DD formatiert ist und mit einem Schrägstrichzeichen verknüpft ist.

2016-01-15/2016-05-20

LocalDate

Mit der LocalDate Klasse im java.time Rahmen in Java gebaut 8 und höher, mit einem Paar von LocalDate Objekte mit den Namen start und stop.

String output = start.toString() + "/" + stop.toString();