alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Java example source code file (TimeZoneTable.java)

This example Java source code file (TimeZoneTable.java) is included in the alvinalexander.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Learn more about this Java project at its project page.

Java - Java tags/keywords

aliases, canonical, comparable, datetimeformatterbuilder, datetimezone, exception, list, offset, printstream, standard, string, timezonetable, util, zonedata

The TimeZoneTable.java Java example source code

/*
 *  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 align=\"left\">Canonical ID" +
                    "<th align=\"left\">Aliases" +
                    "</tr>");

        ZoneData canonical = null;
        List<ZoneData> 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());
        }
    }
}

Other Java examples (source code examples)

Here is a short list of links related to this Java TimeZoneTable.java source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.