/* * Copyright 2001-2010 Stephen Colebourne * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.joda.example.time; import java.io.PrintStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Set; import org.joda.time.DateTimeZone; import org.joda.time.format.DateTimeFormatter; import org.joda.time.format.DateTimeFormatterBuilder; /** * Prints out all available time zones to standard out in an HTML table. * * @author Brian S O'Neill */ public class TimeZoneTable { static final long cNow = System.currentTimeMillis(); static final DateTimeFormatter cOffsetFormatter = new DateTimeFormatterBuilder() .appendTimeZoneOffset(null, true, 2, 4) .toFormatter(); public static void main(String[] args) throws Exception { Set idSet = DateTimeZone.getAvailableIDs(); ZoneData[] zones = new ZoneData[idSet.size()]; { Iterator it = idSet.iterator(); int i = 0; while (it.hasNext()) { String id = (String) it.next(); zones[i++] = new ZoneData(id, DateTimeZone.forID(id)); } Arrays.sort(zones); } PrintStream out = System.out; out.println("<table>"); out.println("<tr>" + "<th align=\"left\">Standard Offset</th>" + "<th align=\"left\">Canonical ID</th>" + "<th align=\"left\">Aliases</th>" + "</tr>"); ZoneData canonical = null; List aliases = new ArrayList(); for (int i=0; i<zones.length; i++) { ZoneData zone = zones[i]; if (!zone.isCanonical()) { aliases.add(zone); continue; } if (canonical != null) { printRow(out, canonical, aliases); } canonical = zone; aliases.clear(); } if (canonical != null) { printRow(out, canonical, aliases); } out.println("</table>"); } private static void printRow(PrintStream out, ZoneData zone, List aliases) { out.print("<tr>"); out.print("<td align=\"left\" valign=\"top\">"); out.print(zone.getStandardOffsetStr()); out.print("</td>"); out.print("<td align=\"left\" valign=\"top\">"); out.print(zone.getCanonicalID()); out.print("</td>"); out.print("<td align=\"left\" valign=\"top\">"); if (aliases.size() > 0) { for (int j=0; j<aliases.size(); j++) { if (j > 0) { out.print(", "); } out.print(((ZoneData) aliases.get(j)).getID()); } } out.print("</td>"); out.println("</tr>"); } private static class ZoneData implements Comparable { private final String iID; private final DateTimeZone iZone; ZoneData(String id, DateTimeZone zone) { iID = id; iZone = zone; } public String getID() { return iID; } public String getCanonicalID() { return iZone.getID(); } public boolean isCanonical() { return getID().equals(getCanonicalID()); } public String getStandardOffsetStr() { long millis = cNow; while (iZone.getOffset(millis) != iZone.getStandardOffset(millis)) { long next = iZone.nextTransition(millis); if (next == millis) { break; } millis = next; } return cOffsetFormatter.withZone(iZone).print(millis); } public int compareTo(Object obj) { ZoneData other = (ZoneData) obj; int offsetA = iZone.getStandardOffset(cNow); int offsetB = other.iZone.getStandardOffset(cNow); if (offsetA < offsetB) { return -1; } if (offsetA > offsetB) { return 1; } int result = getCanonicalID().compareTo(other.getCanonicalID()); if (result != 0) { return result; } if (isCanonical()) { if (!other.isCanonical()) { return -1; } } else if (other.isCanonical()) { return 1; } return getID().compareTo(other.getID()); } } }