[JAVA] SimpleDateFormat.parse() fout in te parsen maand

Pagina: 1
Acties:
  • 1.360 views sinds 30-01-2008
  • Reageer

  • Acmosa
  • Registratie: Januari 2001
  • Laatst online: 11-11 13:14

Acmosa

...no comment.

Topicstarter
Hallo,

Ik zit met het volgende probleem. Ik probeer een rss feed te parsen (dit lukt) daaruit wil ik de datum (String) omzetten naar een Date.
Het parsen van een String naar een Date lukt met SimpleDateTime tenzij er March of Mar in het maand veld voorkomt.

Java SE 1.5.0_11

ParsePosition p = new ParsePosition(0); Geeft aan waar de parser moet starten en geeft een index positie > -1 terug wanneer het fout gaat.
Bij het 2de blokje is dat 3, precies waar de maand begint.

Onderstaande werkt.
code:
1
2
3
4
5
6
7
8
9
10
11
12
DateFormat df = SimpleDateFormat.getInstance();
df = new SimpleDateFormat("dd MMMM yyyy HH:mm:ss z");
try{
    Date d = new Date();
    ParsePosition p = new ParsePosition(0);
    log.debug(p);
    d = df.parse("11 November 2007 23:45:45 GMT", p);
    log.debug(p);
    System.out.println(d.toString());
}catch (Exception e) {
    System.out.println(e);
}



Onderstaande werkt niet.
code:
1
2
3
4
5
6
7
8
9
10
11
12
DateFormat df = SimpleDateFormat.getInstance();
df = new SimpleDateFormat("dd MMMM yyyy HH:mm:ss z");
try{
    Date d = new Date();
    ParsePosition p = new ParsePosition(0);
    log.debug(p);
    d = df.parse("11 March 2007 23:45:45 GMT", p);
    log.debug(p);
    System.out.println(d.toString());
}catch (Exception e) {
    System.out.println(e);
}

[ Voor 3% gewijzigd door Acmosa op 11-03-2007 14:30 ]

But then again, I could be wrong..


  • momania
  • Registratie: Mei 2000
  • Laatst online: 05:21

momania

iPhone 30! Bam!

In de bovenste parse je een nederlandse datum/tijd. Dat werkt omdat je Locale waarschijnlijk op NL_nl staat. Voor de onderste moet je een EN_us/EN_gb Locale hebben. :)

Probeer het maar eens met 'Maart' ipv 'March' :)

Let ook op dat je geen overbodige code schrijft btw:
Java:
1
2
DateFormat df = SimpleDateFormat.getInstance();
df = new SimpleDateFormat("dd MMMM yyyy HH:mm:ss z");

Dit is genoeg:
Java:
1
DateFormat df = new SimpleDateFormat("dd MMMM yyyy HH:mm:ss z");

;)

[ Voor 5% gewijzigd door momania op 11-03-2007 14:39 ]

Neem je whisky mee, is het te weinig... *zucht*


  • Acmosa
  • Registratie: Januari 2001
  • Laatst online: 11-11 13:14

Acmosa

...no comment.

Topicstarter
Ik heb het volgende toegevoegd.
code:
1
2
Locale locale = new Locale("en_US");
DateFormat df = new SimpleDateFormat("dd MMMM yyyy HH:mm:ss z", locale);

Wat in theorie het probleem dan zou moeten oplossen maar helaas, zelfde resultaat.
en_GB werkt ook niet.

Maar je opmerking over taal zette me wel aan het denken want May werkt ook niet....
maar Mei wel.

[ Voor 17% gewijzigd door Acmosa op 11-03-2007 14:52 ]

But then again, I could be wrong..


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Let er tevens op dat het parsen met een simpleDateFormat niet thread-safe is

  • Acmosa
  • Registratie: Januari 2001
  • Laatst online: 11-11 13:14

Acmosa

...no comment.

Topicstarter
Got it!

code:
1
Locale.setDefault(new Locale("en_US"));

Toevoegen om de default locale te zetten voor JVM.

But then again, I could be wrong..


  • dingstje
  • Registratie: Augustus 2002
  • Laatst online: 02-01-2024
[P]inky schreef op zondag 11 maart 2007 @ 15:01:
Got it!

code:
1
Locale.setDefault(new Locale("en_US"));

Toevoegen om de default locale te zetten voor JVM.
Lijkt me niet zo'n nette oplossing. Als je je GUI zich laat baseren op je localesetting om je interface te tekenen (taal, numberformatting, ...) geraakt dit hierdoor in de soep. Het lijkt me beter om te proberen je eerste manier (een locale meegeven aan SimpleDateFormat) verder uit te zoeken om het werkend te krijgen.

If you can't beat them, try harder


  • Acmosa
  • Registratie: Januari 2001
  • Laatst online: 11-11 13:14

Acmosa

...no comment.

Topicstarter
De inderdaad wat brute oplossing is nu vervangen door het volgende wat prima werkt en wel een nette oplossing is;

code:
1
Locale locale = Locale.US;


De static manier van het setten van de locale was mij niet helemaal duidelijk en het bleek ook dat alleen door deze static manier de locale wordt geaccepteerd in de SimpleDateFormat methode.

Eindresultaat:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Locale locale = Locale.US;
DateFormat df = SimpleDateFormat.getInstance();
df = new SimpleDateFormat("dd MMMM yyyy HH:mm:ss z", locale);
try{
    Date d = new Date();
    ParsePosition p = new ParsePosition(0);
    log.debug(p);
    d = df.parse("11 May 2007 23:45:45 GMT", p);
    log.debug(p);
    System.out.println(d.toString());
}catch (Exception e) {
    System.out.println(e);
}


Bedankt voor het meedanken.

[ Voor 36% gewijzigd door Acmosa op 14-03-2007 17:56 ]

But then again, I could be wrong..


  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 30-11 21:02
[P]inky schreef op woensdag 14 maart 2007 @ 17:54:
code:
1
2
DateFormat df = SimpleDateFormat.getInstance();
df = new SimpleDateFormat("dd MMMM yyyy HH:mm:ss z", locale);
Dit blijft een dubbele declaratie die niet nodig is.

Ik weet niet of het van toepassing is, maar dit is vrij zware code, de constructie van een SimpleDateFormatter wil je niet in een inner loop hebben.

[ Voor 20% gewijzigd door DaCoTa op 14-03-2007 18:35 ]


Verwijderd

-FoX- schreef op zondag 11 maart 2007 @ 14:45:
Let er tevens op dat het parsen met een simpleDateFormat niet thread-safe is
Thanks! dat wist ik niet :) Morgen geloof ik iets te doen :o

  • MetroidPrime
  • Registratie: Oktober 2003
  • Laatst online: 01-11 10:08

MetroidPrime

Turn it up loud, captain!

Locale.US in een variabele stoppen is zo te zien ook overbodig. Dit zou dan een betere oplossing zijn:

Java:
1
DateFormat df = new SimpleDateFormat("dd MMMM yyyy HH:mm:ss z", Locale.US);

"Some girl on the street outside the bar just asked me if I was saved yet." "Yeah? What did you say?" "I told her 'I saved at the checkpoint a couple of minutes back and I can reload from there if I die.'


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

-FoX- schreef op zondag 11 maart 2007 @ 14:45:
Let er tevens op dat het parsen met een simpleDateFormat niet thread-safe is
Dat is hier toch niet van toepassing? Hij maakt gewoon elke keer weer een nieuwe SDF aan binnen diezelfde methode. Althans, ik zie nergens een static instantie van SDF staan.

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

BalusC schreef op woensdag 14 maart 2007 @ 19:25:
Dat is hier toch niet van toepassing? Hij maakt gewoon elke keer weer een nieuwe SDF aan binnen diezelfde methode. Althans, ik zie nergens een static instantie van SDF staan.
So? Dan kunnen er geen 2 threads gelijkertijd gebruik maken van diezelfde instance?

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 01-12 19:51

Robtimus

me Robtimus no like you

-FoX- schreef op woensdag 14 maart 2007 @ 19:47:
[...]

So? Dan kunnen er geen 2 threads gelijkertijd gebruik maken van diezelfde instance?
Dat doet er niet toe. Een method-local variabele werkt alleen maar in die method, in de aanroepende thread. Als een andere thread dezelfde method van dezelfde instance aanroept, maakt die method gewoon een nieuw object aan.

Het zou een ander geval zijn als het een class of instance variabele is.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

-FoX- schreef op woensdag 14 maart 2007 @ 19:47:
So? Dan kunnen er geen 2 threads gelijkertijd gebruik maken van diezelfde instance?
Ik weet niet of ik dit als een vraag of als een opmerking moet interpreteren. Indien het eerste: dat is correct. Indien het tweede: ik snap je niet?

[ Voor 4% gewijzigd door BalusC op 14-03-2007 22:19 ]

Pagina: 1