webForumDet fria alternativet

Konvertera datum-String till Timestamp

8 svar · 1 738 visningar · startad av intesa

intesaMedlem sedan apr. 2006190 inlägg
#1

Försöker konvertera en String som innehåller ett datum till en java.sql.Timestamp, men det vill sig inte riktigt.

Följande kod fungerar klockrent i en vanlig J2SE applikation, men när jag kopierar in koden i mitt J2EE projekt så får jag java.text.ParseException ("Unparseable date..."). Någon som kan förstå varför?

String dateString = "Sun, 02 Dec 2007 10:39:02 +0100";
SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");
try {
  Date date = sdf.parse(dateString);
  Timestamp timestamp = new Timestamp(date.getTime());
} catch (ParseException pe) {
  System.err.println(pe.getMessage());
  pe.printStackTrace();
}
LimeMedlem sedan sep. 2001837 inlägg
#2

Det handlar om vilken Locale som är standard för din javamaskin. Om vi antar att du kör på en Windows XP med inställningar för svenska och svenskt tangentbord, då är chansen stor att du får Locale("SV") i din SimpleDateFormatter.

Kör följande kod så kommer du att se att det nog är så.

public static void main(String[] args) {

		String en_dateString = "Sun, 02 Oct 2007 10:39:02 +0100";
		SimpleDateFormat en_sdf = new SimpleDateFormat(
				"EEE, dd MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
		System.out.println("English SDF's has the weekdays:");
		printWeekDays(en_sdf);

		String sv_dateString = "Söndag, 02 Okt 2007 10:39:02 +0100";
		SimpleDateFormat sv_sdf = new SimpleDateFormat(
				"EEE, dd MMM yyyy HH:mm:ss Z");
		System.out.println("... but Swedish has: ");
		printWeekDays(sv_sdf);

		try {
			Date en_date = en_sdf.parse(en_dateString);
			System.out.println(en_date.getTime());

			Date sv_date = sv_sdf.parse(sv_dateString);
			System.out.println(sv_date.getTime());

		} catch (ParseException pe) {
			System.err.println(pe.getMessage());
			pe.printStackTrace();
		}

	}

	private static void printWeekDays(SimpleDateFormat sdf) {
		for (String weekday : sdf.getDateFormatSymbols().getWeekdays()) {
			System.out.println(weekday);
		}

	}

Det handlar alltså om att den försöker parsa strängen "Sun" mot de svenska veckodagarna och får helt enkelt ingen träff. Samma sak gäller månaderna.

Edit: Så fort det handlar om att parsa något som valuta, datum, decimaltal och liknade, kolla ALLTID vilken Locale som används eller BESTÄM vilken som ska användas, t.ex. den för engelska som jag gjorde i exemplet.

intesaMedlem sedan apr. 2006190 inlägg
#3

Lime, du e en klippa! Det var Locale som strulade.

Jag måste lära mig att tänka "outside the box" ;)
Var helt insnöad på att det hade att göra med J2EE vs J2SE.

LimeMedlem sedan sep. 2001837 inlägg
#4

In or out?

Nä, du måste lära dig tänka "inside the box"...

Kan säga att jag nog har lagt en sisådär 200 timmar på ett liknande problem för ett par år sedan så nu försöker jag betala igen så mycket jag bara kan. Överallt.

Kan förresten rekommendera att du ger dig på Sun Certified Java Programmer exam (310-065). Jag trodde också att jag kunde Java när jag började plugga inför certifieringen... Jag hade fel. Men jäklar vad mycket jag lär mig om hur Java EGENTLIGEN ska hanteras.

intesaMedlem sedan apr. 2006190 inlägg
#5

Lime skrev:

Nä, du måste lära dig tänka "inside the box"...

Haha, det har du rätt i :bire

Så fort du nämde certifiering så tänkte jag genast att sånt har jag inte tid med, bara för att sekunden efter inse hur mycket tid det lär spara mig i det långa loppet. Har läst lite om suns certified java programmer nu, så på måndag ska jag se över möjligheterna att ta certifieringen.

Tack igen!

LimeMedlem sedan sep. 2001837 inlägg
#6

Rekommenderar Kathy Sierras bok. Den kostar runt 500 kr. Det är vad du behöver. Och ca 100 timmar fritid.

intesaMedlem sedan apr. 2006190 inlägg
#7

Hittade boken på amazon för 237 kr ink frakt, så den är på väg nu. Hoppas bara att jag hittar 100 lediga timmar också... :)
Såg att det skulle komma ut en ny bok frammåt sommaren som var riktad för j2se 6 istället för j2se 5 som den nuvarande är, men det måste väll gå att klara certifieringen för 6an med 5ans bok endå? Eller ska man fega och satsa på certifiering för 5an?

LimeMedlem sedan sep. 2001837 inlägg
#8

Det som skiljer mellan SE 5 och SE 6 är NavigatableSet och NavigatableMap (som du kan läsa in själv i samband med kapitel 6, Collections) och System.console (Console-klassen) som du kan läsa i samband med IO (tror det är kap 7).

Sedan bör du också titta lite på javax.script som också är nytt.

intesaMedlem sedan apr. 2006190 inlägg
#9

Tack Lime, precis det jag behövde veta. (y)
Börjar nästa ångra mig att jag beställde boken från andra sidan dammen... Vill sätta tänderna i den nu på direkten. Men den som väntar på nått gott. :h

122 ms totalt · 3 externa anrop · cache AV · v20260731051352-full.56cc9887
0 ms — hämta statistik (cache)
0 ms — hämta forumlista (cache)
120 ms — hämta tråd, inlägg och bilagor (db)