» Tidszonekonvertering med java.util.Date
Skrevet af Anders Østergaard Jensen d. 9/3 2010 kl. 06:50Når man bygger internationale websider er det ofte nødvendigt at vise dato og tid konverteret til brugerens lokale tidszone. Ruby on Rails har indbygget understøttelse for det, mens Java altså kræver en manuel tilgang. I det følgende vil jeg vise, hvordan man nemt og bekvemt kan implementere tidszonekonvertering i Java.
Den følgende metode foretager en tidszonekonvertering fra en standard java.util.Date (som standard er den justeret til maskinens egen tidszone) til en specifik tidszone:
public static String formatUSDate(Date d, String tz) {
DateFormat fmt = new SimpleDateFormat("EEE, d/MM/yyyy 'at' KK:mm a Z");
TimeZone zone = getTimeZone(tz);
fmt.setTimeZone(zone);
return fmt.format(d);
}
Ovenstående metode er afhængig af følgende supportfunktion, som søger igennem Java-bibliotekets understøttede tidszoner (lower case-søgning). Hvis der ikke findes et resultat, returneres værdien af getDefault() blot. Ifølge Javadoc for SDK’et afhænger default-tidszonen af maskinens locale-indstillinger (hvis din maskine er indstillet til at være i København, vil default-tidszonen herefter være Europe/Copenhagen).
public static TimeZone getTimeZone(String tz) {
TimeZone retVal;
for (String id: TimeZone.getAvailableIDs()) {
if (id.toLowerCase().contains(tz.toLowerCase())) {
retVal = TimeZone.getTimeZone(id);
return retVal;
}
}
return TimeZone.getDefault();
}
Søgning med lowercase er særligt anvendeligt, hvis du bruger tidszoner på tværs af flere applikationer og rammeværk med den samme database. F.eks. gemmer Ruby on Rails kun den valgte tidzone med det sidste ID efter skråstregen (dvs. ‘Copenhagen’ i stedet for det mere sigende ‘Europe/Copenhagen’), hvilket gør det umuligt at implementere en en-til-en-konvertering mellem de to miljøer. Et kald til getTimeZone(”Sydney”) eller getTimeZone(”Copenhagen”) vil altså returnere Java-tidszonen “Australia/Sydney” hhv. “Europe/Copenhagen”.
Endelig muliggør klassen SimpleDateFormat visning af den nu konverterede dato-repræsentation i et lokaliseret format. Den enkelte bruger kan derfor nu også vælge, hvordan dato og tid skal repræsenteres i din applikation. Dette Javadoc-link beskriver de forskellige formatteringsmuligheder. For eksempel kan en mulig dansk repræsentation af datoen se således ud:
DateFormat fmt = new SimpleDateFormat("d/MM/yyyy 'kl.' HH:mm Z");
Fortæl os endelig, hvis du kender til andre, mere effektive metoder til at gennemføre tidszonekonvertering af dato- og tidsstempler i Java.





