# SimpleDateFormat und Locale



## Gast (13. Okt 2004)

Hallo,

soweit ich das aus der API-Referenz ersehen konnte, kann man das Locale - Objekt nur bei der Konstruktion des SimpleDateFormat - Objekts angeben. Da ich aber nicht jedesmal, wenn sich die lokalen Einstellungen ändern, ein neues SimpleDateFormat - Objekt erzeugen will, würde ich gerne wissen, ob es doch einen Weg gibt das Locale - Objekt zu setzen, oder ob es eine Alternative zum SimpleDateFormat gibt, wo das möglich ist.

Danke!


----------



## abollm (13. Okt 2004)

Alternativen gibt es (fast) immer. Es kommt darauf an, was du mit "Datum" anstellen möchtest. 
Du kannst z.B. unabhängig von den locale Einstellungen das Datum in einer einheitlichen Form ausgeben.


----------



## Guest (13. Okt 2004)

Das Datum möchte ich in der Form "13-Okt-2004" ausgeben. Die Verwendung des Locale - Objekts hätte dann den Vorteil, dass für den Monat automatisch die richtigen Bezeichnungen verwendet werden ( z.B. für Deutsch: Okt bzw. für Englisch: Oct) ohne das ich das selbst über ein Resource Bundle verwalten muss.


----------



## abollm (13. Okt 2004)

Grobes Vorgehen:

Kalender des (jeweiligen) Datums ausgeben, z.B.


```
GregorianCalendar cal = new GregorianCalendar();
```

Datum nach deinen Wünschen formatiert ausgeben, z.B.:

```
System.out.println(
       "Datum......: " +
       cal.get(Calendar.DATE) + "-" +
       (cal.get(Calendar.MONTH)+1) + "-" +
       cal.get(Calendar.YEAR)
     );
```

Dein geschildertes "Problem" mit dem einheitlichen Monatsnamen ist natürlich damit grundsätzlich auch lösbar.


----------



## Guest (13. Okt 2004)

Danke für Deine Antwort, aber diesen Ansatz hatte ich auch schon. Um das Monat in der jeweiligen Landessprache darzustellen, hab ich die Bezeichnungen in ein ResourceBundle gepackt,  das beim Start der Anwendung bzw. beim Ändern der lokalen Einstellungen geladen wird. Gleich nach dem Laden des ResourceBundles hab ich die Monate in den Array "months" geschrieben und mit 
	
	
	
	





```
months[cal.get(CalendarMONTH)]
```
darauf zugegriffen.
Als ich dann allerdings SimpleDateFormat entdeckt hatte, dachte ich, ich könnte mir diese Prozedur sparen. :wink: 

Gruß,
--Alex


----------



## abollm (13. Okt 2004)

Meinst du so etwas?


```
...
    Locale myLocale = Locale.getDefault(); // locale auf eigenem Rechner 
    Date d = new Date(); // aktuelles Datum
    DateFormat myDF = DateFormat.getDateInstance( DateFormat.MEDIUM, myLocale);
    //entweder SHORT, MEDIUM oder LONG
    DateFormat otherDF1 = DateFormat.getDateInstance( DateFormat.MEDIUM, Locale.CANADA_FRENCH);
    String myDateString = myDF.format(d);
    String foreignDateString = otherDF1.format(d);
    System.out.println( "\nMein Datum medium als String: "+myDateString);
    System.out.println( "Datum medium in Canada franz.: " + foreignDateString);
    DateFormat otherDF2 = DateFormat.getDateInstance( DateFormat.SHORT, Locale.US);
    foreignDateString = otherDF2.format(d);
    System.out.println( "Datum kurz in USA: " + foreignDateString);
...
```


----------



## Guest (13. Okt 2004)

Hallo,

bei der getDateInstance() - Methode wird aber auch jedesmal ein neues DateFormatObjekt erzeugt, d.h. es wäre egal, ob ich es auf diese Weise mache, oder immer ein neues SimpleDateFormat-Objekt erzeuge, wenn sich die lokalen Einstellungen ändern.  
Ein weiterer Nachteil des DateFormat-Objekts ist, dass ich das Format nicht präzise angeben kann und somit nicht auf das  Format in der Form "13-Okt-2004" komme.


----------



## abollm (13. Okt 2004)

Stimmt, aber zunächst fällt mir keine Lösung des Problems ein. Vielleicht weiß ein anderer etwas dazu?


----------



## dotlens (13. Okt 2004)

wenn du ein spezielles format ausgeben möchtest musst du dir wohl eine eigene Klasse schreiben....


----------



## Guest (14. Okt 2004)

Hallo,

ich denke ich werde wohl doch SimpleDateFormat verwenden und die Klasse halt immer neu instanzieren, wenn sich das Locale-Objekt ändert.

Danke nochmals für eure Antworten - ich kenne jetzt wohl so ziemlich alle Möglichkeiten einen Datumsstring zu erzeugen!  

Grüsse,
--Alex


----------



## Bleiglanz (14. Okt 2004)

a) das mit dem neuInstanzieren ist i.A. kein Problem (teste doch mal, wieviele SimpleDateFormat - Instanzen du in 1 sec erzeugen kannst)

b) wenns sein muss, schreib dir so eine Art Registry, die die Objekte "poolt", hier mal etwas Pseudocode

```
DFReg
{
     private Map fmts = new HashMap();

     getDF(Locale loc)
     {
           SimpleDateFormat df = (SimpleDateFormat) fmts.get(loc);
           if(null!=df)
           {
               return df;
           }
           else
           {
               df = neues SimpleDateFormat(loc)
               fmts.put(loc,df)
               return df;
           }  
     }
}
```
im wesentlich ersetzt du damit die Objekterzeugung durch das Nachschlagen in einer Map, ob das wirklich schneller ist und nennenswerten Speicher spart müsste man erstmal testen


----------

