Avatar billede Jonas Nybegynder
01. november 2011 - 18:17 Der er 23 kommentarer og
1 løsning

Tidszone konvertering

Hejsa,

Så er jeg tilbage - jeg er nu løbet ind i et problem, fordi vi er skiftet til vintertid. Derfor må jeg hellere få styr på mine tidszoner nu, så jeg ikke ender med håret i postkassen, når vi skifter til sommertid igen :D Jeg har forsøgt at lege med Calendar klassen, men jeg kan sgu (heller) ikke knække denne her!

Jeg har et input der starter med et tidspunkt i 12 timers format i en String.
- String time = "11:59am".

Der har jeg gjort således:

SimpleDateFormat sdfTid1 = new SimpleDateFormat("HH:mm");
Date sdfTid = sdfTid1.parse(time);
Calendar cal = Calendar.getInstance();
cal.setTime(sdfTid);
cal.add(Calendar.HOUR_OF_DAY, 6);
sdfTid = cal.getTime(); // This will give you the time you want.

Det jeg derfor gør, er at smide det over i et Date format og så derfra videre til en Calendar - der smider jeg 6 timer oven i (konvertering fra EDT tidszone til DK). Dvs. det troede jeg - da vi så skiftede til vintertid, der skiftede EDT ikke...:S

What to do?? :S
Avatar billede arne_v Ekspert
01. november 2011 - 18:23 #1
USA skifter foerst til vinter tid i naeste weekend!

:-)
Avatar billede arne_v Ekspert
01. november 2011 - 18:25 #2
Men det boer aldrig vaere noedvendigt manuelt at laegge 6 timer til.

Virker det ikke hvis du angiver tidszone korrekt i parse og format?
Avatar billede arne_v Ekspert
01. november 2011 - 18:49 #3
eksempel:


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

public class TZFun {
    public static void main(String[] args) throws ParseException {
        String tstr = "11:59";
        DateFormat dfest = new SimpleDateFormat("HH:mm");
        dfest.setTimeZone(TimeZone.getTimeZone("America/New_York"));
        DateFormat dfmet = new SimpleDateFormat("HH:mm");
        dfmet.setTimeZone(TimeZone.getTimeZone("Europe/Copenhagen"));
        System.out.println("Let us parse as EST");
        Date timest = dfest.parse(tstr);
        System.out.println("EST: " + dfest.format(timest));
        System.out.println("MET: " + dfmet.format(timest));
        System.out.println("Let us parse as MET");
        Date timmet = dfmet.parse(tstr);
        System.out.println("EST: " + dfest.format(timmet));
        System.out.println("MET: " + dfmet.format(timmet));
    }
}
Avatar billede Jonas Nybegynder
01. november 2011 - 22:19 #4
Hej Arne - igen :)

Jeg har fået din kode til at virke - lækkert eksempel! Men den returnerer en konvertering af 11:59am til 17:59. Det er jo +6 timer?? Rimelig weird. Er det fordi lige præcis NYC er skiftet til vintertid også? Og at min kilde er noget andet end lige præcis NYC?

Det er EDT jeg prøver at ændre til DK-tid. Og jeg kan se, at formatet viser 11:59am på et tidspunkt hvor klokken i Danmark var 16:59...


Jeg har også prøvet at spytte en 04:00pm tid ind i koden - der får jeg så et output der hedder 10:00, men den skulle vel hedde 22:00? Det undrer mig lidt...


Jeg har sådan set bare stjålet din kode direkte:

System.out.println("Time " + time);
               
DateFormat dfest = new SimpleDateFormat("hh:mm");
                dfest.setTimeZone(TimeZone.getTimeZone("America/New_York"));
               
Date tidEST = dfest.parse(time);
               
DateFormat dfmet = new SimpleDateFormat("HH:mm");
                dfmet.setTimeZone(TimeZone.getTimeZone("Europe/Copenhagen"));
                           
Date timmet = dfmet.parse(time);
               
System.out.println("Let us parse as EST");
               
System.out.println("EST: " + dfest.format(tidEST));
System.out.println("MET: " + dfmet.format(tidEST));
System.out.println("Let us parse as MET"); 
               
System.out.println("EST: " + dfest.format(timmet));
System.out.println("MET: " + dfmet.format(timmet));
Avatar billede arne_v Ekspert
01. november 2011 - 22:36 #5
Husk paa at en tid der parses uden dato bliver opfattet som 1-Jan-1970.

Og den dag var der 6 timers forskel mellem USA og Danmark.
Avatar billede arne_v Ekspert
01. november 2011 - 22:36 #6
Formentligt skal du indsaette dags dato.
Avatar billede arne_v Ekspert
01. november 2011 - 22:48 #7
a la:

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

public class TZFun2 {
    public static void main(String[] args) throws ParseException {
        DateFormat dfest = new SimpleDateFormat("HH:mm");
        dfest.setTimeZone(TimeZone.getTimeZone("America/New_York"));
        DateFormat dfmet = new SimpleDateFormat("HH:mm");
        dfmet.setTimeZone(TimeZone.getTimeZone("Europe/Copenhagen"));
        DateFormat dfesty = new SimpleDateFormat("HH:mm dd-MM-yyyy");
        dfesty.setTimeZone(TimeZone.getTimeZone("America/New_York"));
        DateFormat dfmety = new SimpleDateFormat("HH:mm dd-MM-yyyy");
        dfmety.setTimeZone(TimeZone.getTimeZone("Europe/Copenhagen"));
        System.out.println("WITHOUT DATE");
        String tstr = "11:59";
        System.out.println("Let us parse as EST");
        Date timest = dfest.parse(tstr);
        System.out.println("EST: " + dfest.format(timest));
        System.out.println("MET: " + dfmet.format(timest));
        System.out.println("Let us parse as MET");
        Date timmet = dfmet.parse(tstr);
        System.out.println("EST: " + dfest.format(timmet));
        System.out.println("MET: " + dfmet.format(timmet));
        System.out.println("WITH DATE");
        tstr = "11:59 01-11-2011";
        System.out.println("Let us parse as EST");
        timest = dfesty.parse(tstr);
        System.out.println("EST: " + dfest.format(timest));
        System.out.println("MET: " + dfmet.format(timest));
        System.out.println("Let us parse as MET");
        timmet = dfmety.parse(tstr);
        System.out.println("EST: " + dfest.format(timmet));
        System.out.println("MET: " + dfmet.format(timmet));
    }
}
Avatar billede Jonas Nybegynder
02. november 2011 - 07:40 #8
Hmm, jeg får problemer fordi den dato jeg catcher den har formatet 11-1-2011. Det kan min konvertering ikke forstå... Den omdanner det til 3. juli... i år 16... Very odd!

Jeg må arbejde lidt videre i aften!
Avatar billede Jonas Nybegynder
02. november 2011 - 08:06 #9
Ja, mit spørgsmål kunne være, hvordan jeg får smidt det 0 ind foran datoen - det skal jo kun ske i månedens første 9 dage :S... eller konverteret det til noget andet, som SimpleDateFormat kan bruge?

Det lykkes mig ikke rigtig...
Avatar billede Jonas Nybegynder
02. november 2011 - 08:13 #10
Prøver jeg at ændre min SimpleDateFormat til:

SimpleDateFormat dateEst = new SimpleDateFormat("mm-d-yyyy");

Så skriver den 1. jan, men til gengæld rammer den året...
Avatar billede arne_v Ekspert
02. november 2011 - 13:35 #11
SimpleDateFormat dateEst = new SimpleDateFormat("MM-dd-yyyy");
Avatar billede arne_v Ekspert
02. november 2011 - 18:21 #12
mm = minutter
MM = maaned
Avatar billede Jonas Nybegynder
03. november 2011 - 07:33 #13
Godt spottet - tak! :) Jeg er stadig i problemer - den tidszone konverterer for hurtigt - altså den skriver 17.59 for tidligt, og så viser den at den amerikanske tid var 12.59 - selvom oprindeligt input var 11.59... Jeg forsøger lige at arbejde videre med det og poste min løsning... - det er blevet lidt komplekst fordi jeg skal joine min dato ind i min tid, hvilket gør at jeg opretter dem som Calendar objects...
Avatar billede Jonas Nybegynder
03. november 2011 - 07:37 #14
Gør jeg som i dit eksempel og kombinerer de to Strings siger den:

java.text.ParseException: Unparseable date: "11:59am 11-2-2011"
Avatar billede Jonas Nybegynder
03. november 2011 - 07:39 #15
Og der bruger jeg:

SimpleDateFormat timeEst = new SimpleDateFormat("hh:mm MM-dd-yyyy");            timeEst.setTimeZone(TimeZone.getTimeZone("America/New_York"));
Avatar billede arne_v Ekspert
03. november 2011 - 14:09 #16
"11:59am 11-2-2011"

kraever

"hha:mm MM-d-yyyy"
Avatar billede Jonas Nybegynder
03. november 2011 - 14:25 #17
God damn... Det er besværligt ;) Jeg prøver i aften igen! Tak for hjælpen så langt!
Avatar billede arne_v Ekspert
03. november 2011 - 14:34 #18
Har du laest dokumentationen for SimpleDateFormat med hvilke bogstaver der betyder hvad?
Avatar billede Jonas Nybegynder
03. november 2011 - 14:38 #19
Ja, det ville jeg jo vove at påstå at jeg har, men det er sygt forvirrende når man er newbie i 16 klasser :D Jeg troede selv den kunne finde ud af det, når jeg brugte hh i stedet for HH. Det kan den (vel selvfølgelig) ikke..... Men jeg vil tro det virker med a'et tilføjet :)
Avatar billede Jonas Nybegynder
03. november 2011 - 14:40 #20
Hvis jeg bare bruger
"hha:mm MM-d-yyyy"

Kan den så godt finde ud af det, når vi bevæger os op over dato 9 og der begynder at være 2 cifre?
Avatar billede arne_v Ekspert
03. november 2011 - 14:43 #21
Det tror jeg. Men det skal nok proeves af.
Avatar billede Jonas Nybegynder
03. november 2011 - 19:53 #22
Det virker fandeme! Jeg har lavet en metode jeg kan kalde nu - den ser ud som sådan:

public String convertYahoo(String date, String time) throws ParseException {
   
String samletTid = time + " " + date;
               
SimpleDateFormat timeEst = new SimpleDateFormat("hh:mma MM-dd-yyyy");
timeEst.setTimeZone(TimeZone.getTimeZone("America/New_York"));

Date tidEst = timeEst.parse(samletTid);

DateFormat timeMet = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
timeMet.setTimeZone(TimeZone.getTimeZone("Europe/Copenhagen"));

String tid =  timeMet.format(tidEst);
   
return tid
}


Tusind tusind tusind tak for hjælpen! Det var en hård én :D Stik mig endelig et svar!
Avatar billede Jonas Nybegynder
17. november 2011 - 11:14 #23
Jeg mangler et svar her :)
Avatar billede arne_v Ekspert
17. december 2011 - 04:48 #24
svar
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