17. oktober 2011 - 20:31Der er
15 kommentarer og 1 løsning
Konvertere String dato og tid korrekt og til MySQL brugbare formater
Hejsa
Jeg har grabbet nogle dato- og tidsstempler som jeg gerne vil lave til følgende typer, jeg kan smide direkte i en MySQL DB. Formaterne jeg gerne vil ende med er:
- tid: TIMESTAMP i 24 timer, fx 21:30 - dato: DATETIME i et format som MySQL kan bruge der indeholder ddmmyyyy - om det lige er formateret sådan, er mere eller mindre irrelevant, men det ville da være rart at det er dansk :)
Det svære kommer så nu - jeg har nogle formater der er lidt af helvede til. Jeg har følgende:
- String tid = 10:54am - String dato = 10/17/2011
Jeg har ikke rigtig nogen anelse om hvordan jeg kommer fra de Strings og over i formater som MySQL vil acceptere?
Sigtbarheden i detailbranchen er lavere end nogensinde før.
13. juni 2024
Slettet bruger
17. oktober 2011 - 22:50#1
Da spørgsmålet er lagt under Java, så ville jeg lave dine strings om til en date med følgende java-kode (her antager jeg din default timezone er korrekt):
SimpleDateFormat sdf = new SimpleDateFormat("M/d/yyyy h:mma"); java.util.Date d = sdf.parse(dato+" "+tid);
som så kan laves om til en java.sql.Date eller java.sql.Timestamp og indsættes i en database.
Eller er du ude efter en mysql statement der kan konvertere det direkte?
Nej, det var skam i Java jeg ville gøre det :) Sorry jeg ikke skrev det... Men i din løsning står jeg jo tilbage med en variabel af typen SimpleDateFormat... Kan den skydes direkte ind i db'en? Altså ligesom jeg leger med en String eller en double?
Kan man bare gøre det samme med en "ren tid"? Der mangler jeg bare lige ideen til hvordan jeg får det konverteret fra 10:54am til 10:54 ... sådan at hvis den hed 10:54pm, ville den blive til 22:54.
Men jeg bruger ikke PreparedStatements - det har jeg slet slet ikke styr på... Jeg bruger bare helt almindelige stmt.executeUpdate...
Jeg har forsøgt at bruge den løsning tolamaps kom med: SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); java.util.Date d = sdf.parse(dato + " " + tid); System.out.println("dato og tid: " + d);
Men jeg får følgende fejl:
java.text.ParseException: Unparseable date: "10/17/2011 10:53am" at java.text.DateFormat.parse(Unknown Source) at test.<init>(test.java:66) at test.main(test.java:142)
Jeg tænker det handler om, at jeg forsøger at konvertere to Strings der har følgende struktur: - String tid = 10:54am - String dato = 10/17/2011
Saa hvis du bruger en SimpleDateFormat med tolamaps format til at parse String->Date og en anden SimpleDateFormat med dit eget format til at formatere Date->String saa burde det faktisk virke.
Så man skyder en string ind i en mysql som har et timestamp format? Det var egentligt lidt den information jeg også søgte :)
Jeg har forsøgt nu at ændre lidt på det hele. Tid som Date: Thu Jan 01 11:11:00 CET 1970 Date som Date: Tue Oct 18 00:00:00 CEST 2011 Tid som String: 1970-01-01 11:11:00:000 Date som String: 2011-10-18 00:00:00:000
Hvorfor får jeg dem vist som så lange formater? Jeg har formateret dem med følgende: SimpleDateFormat sdfTid1 = new SimpleDateFormat("HH:mm"); SimpleDateFormat sdfDate1 = new SimpleDateFormat("MM-dd-yyyy");
Så de burde være formateret rigtigt?
Det sidste jeg ikke kan finde ud af er, hvordan jeg så kombinerer de to?
Når jeg prøver at sparke en String ind i DB'en fejler den ved datoen, efter tidsstemplet begynder... Det forventer den vel ikke i en Date format... Så jeg har brug for, at den KUN viser YYYY-MM-DD og ikke fortsætter med tiden :s og det samme (bare omvendt) med tiden... Altså, at den KUN viser tiden!
Synes godt om
Slettet bruger
18. oktober 2011 - 21:28#12
SimpleDateFormat.format(Date date) (en metode der stammer fra DateFormat) vil konvertere din Date til en String i det format du har brug for i dit sql statement.
Men som arne siger, så er det meget nemmere med PreparedStatement. Kom eventuelt med et eksempel på et sql statement du gerne vil have lavet med java kode vha. PreparedStatement, eller prøv dig frem og vis noget kode du har problemer med.
public class TimeFormatFun { public static void main(String[] args) throws ParseException { String tid = "10:54am"; String dato = "10/17/2011"; DateFormat indf = new SimpleDateFormat("M/d/yyyy h:mma"); Date d = indf.parse(dato + " " + tid); // nedenstaaende boer ikke bruge da PreparedStatement kan bruge en (wrappet) Date DateFormat outdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String stddatotid = outdf.format(d); System.out.println(stddatotid); } }
Wooh! Nu har jeg sgu fået lortet til at spille :) Jeg inputtede Strings og så fandt jeg ud af, at jeg ikke kunne inputte en HH:mm i databasen, men var nødt til at smide det ind som en hel dato + tid. Men det går nok!
Mit eneste problem nu er noget tidszone konvertering... Det må jeg se om jeg kan løse selv :) Tak for hjælpen!
Tolamaps -> Jeg har primært gjort brug af dine råd - Arnes om at jeg skulle inputte som Strings har jeg dog også gjort brug af :) Jeg tænker 20 til Arne og 40 til Tola? Er det OK?
Synes godt om
Slettet bruger
20. oktober 2011 - 22:09#15
Jeg springer over, ellers tak.
Og PreparedStatements er altså den bedste løsning. :)
Mht. tidszoner, så kan du sætte en tidszone på din DateFormat inden du bruger den. F.eks. til dansk tidszone: SimpleDateFormat sdf = ... sdf.setTimeZone(TimeZone.getTimeZone("Europe/Copenhagen"));
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.