Avatar billede Jonas Nybegynder
17. oktober 2011 - 20:31 Der 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?
Avatar billede 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?
Avatar billede Jonas Nybegynder
18. oktober 2011 - 08:28 #2
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.
Avatar billede arne_v Ekspert
18. oktober 2011 - 09:08 #3
Du har en Date og en Date kan indsaettes direkte via PreparedStatement.
Avatar billede Jonas Nybegynder
18. oktober 2011 - 09:14 #4
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
Avatar billede arne_v Ekspert
18. oktober 2011 - 09:16 #5
Skift til PreparedStatement!

Med Statement skal du til at gaette hvilket dato format din database bruger - med PreparedStatement saa haandterer JDBC det for dig.
Avatar billede arne_v Ekspert
18. oktober 2011 - 09:17 #6
Avatar billede Jonas Nybegynder
18. oktober 2011 - 09:22 #7
Jamen ved jeg ikke det, når jeg bruger MySQL? Eller altså - jeg ved det ikke, men jeg satser på det er en standard?
Avatar billede arne_v Ekspert
18. oktober 2011 - 09:28 #8
Det er ikke standard blandt alle databaser.

http://dev.mysql.com/doc/refman/5.5/en/datetime.html

skulle vise hvordan det goeres i MySQL.
Avatar billede arne_v Ekspert
18. oktober 2011 - 09:30 #9
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.

Men det er ikke noge god loesning.
Avatar billede Jonas Nybegynder
18. oktober 2011 - 11:34 #10
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?
Avatar billede Jonas Nybegynder
18. oktober 2011 - 12:14 #11
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!
Avatar billede 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.
Avatar billede arne_v Ekspert
19. oktober 2011 - 13:55 #13
Kode snippet:

mport java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

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);
    }
}
Avatar billede Jonas Nybegynder
20. oktober 2011 - 21:24 #14
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?
Avatar billede 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"));
Avatar billede arne_v Ekspert
20. oktober 2011 - 22:26 #16
svar fra mig
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester