blob: fc250617d91cdb1d50d771b003add58e575bdfa5 [file] [log] [blame]
package org.unicode.cldr.tool;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import org.unicode.cldr.draft.FileUtilities;
import org.unicode.cldr.util.ArrayComparator;
import org.unicode.cldr.util.CLDRPaths;
import org.unicode.cldr.util.CldrUtility;
import org.unicode.cldr.util.Factory;
import org.unicode.cldr.util.ICUServiceBuilder;
import org.unicode.cldr.util.StandardCodes;
import org.unicode.cldr.util.Tabber;
import org.unicode.cldr.util.TimezoneFormatter;
import org.unicode.cldr.util.ZoneInflections;
import com.ibm.icu.util.TimeZone;
public class ShowZoneEquivalences {
public static void main(String[] args) throws Exception {
double deltaTime = System.currentTimeMillis();
try {
ShowZoneEquivalences.getZoneEquivalences();
} finally {
deltaTime = System.currentTimeMillis() - deltaTime;
System.out.println("Elapsed: " + deltaTime / 1000.0 + " seconds");
System.out.println("Done");
}
}
public static void getZoneEquivalences() throws IOException, ParseException {
// String tzid = "America/Argentina/ComodRivadavia";
// TimeZone tz = TimeZone.getTimeZone(tzid);
// int offset = tz.getOffset(new Date().getTime());
// System.out.println(tzid + ":\t" + offset);
// System.out.println("in available? " + Arrays.asList(TimeZone.getAvailableIDs()).contains(tzid));
// System.out.println(new TreeSet(Arrays.asList(TimeZone.getAvailableIDs())));
Set<String> needsTranslation = new TreeSet<String>(Arrays.asList(CountItems.needsTranslationString
.split("[,]?\\s+")));
Set<String> singleCountries = new TreeSet<String>(
Arrays
.asList("Africa/Bamako America/Godthab America/Santiago America/Guayaquil Asia/Shanghai Asia/Tashkent Asia/Kuala_Lumpur Europe/Madrid Europe/Lisbon Europe/London Pacific/Auckland Pacific/Tahiti"
.split("\\s")));
Set<String> defaultItems = new TreeSet<String>(
Arrays
.asList("Antarctica/McMurdo America/Buenos_Aires Australia/Sydney America/Sao_Paulo America/Toronto Africa/Kinshasa America/Santiago Asia/Shanghai America/Guayaquil Europe/Madrid Europe/London America/Godthab Asia/Jakarta Africa/Bamako America/Mexico_City Asia/Kuala_Lumpur Pacific/Auckland Europe/Lisbon Europe/Moscow Europe/Kiev America/New_York Asia/Tashkent Pacific/Tahiti Pacific/Kosrae Pacific/Tarawa Asia/Almaty Pacific/Majuro Asia/Ulaanbaatar Arctic/Longyearbyen Pacific/Midway"
.split("\\s")));
StandardCodes sc = StandardCodes.make();
Collection<String> codes = sc.getGoodAvailableCodes("tzid");
TreeSet<String> extras = new TreeSet<String>();
Map<String, Set<String>> m = sc.getZoneLinkNew_OldSet();
for (String code : codes) {
Collection<String> s = m.get(code);
if (s == null)
continue;
extras.addAll(s);
}
extras.addAll(codes);
Set<String> icu4jTZIDs = new TreeSet<String>(Arrays.asList(TimeZone.getAvailableIDs()));
Set<String> diff2 = new TreeSet<String>(icu4jTZIDs);
diff2.removeAll(extras);
System.out.println("icu4jTZIDs - StandardCodes: " + diff2);
diff2 = new TreeSet<String>(extras);
diff2.removeAll(icu4jTZIDs);
System.out.println("StandardCodes - icu4jTZIDs: " + diff2);
ArrayComparator ac = new ArrayComparator(new Comparator[] {
ArrayComparator.COMPARABLE, ArrayComparator.COMPARABLE,
ArrayComparator.COMPARABLE });
Map<String, String> zone_countries = sc.getZoneToCounty();
TreeSet<Object[]> country_inflection_names = new TreeSet<Object[]>(ac);
PrintWriter out = FileUtilities.openUTF8Writer(CLDRPaths.GEN_DIRECTORY, "inflections.txt");
TreeMap<Integer, TreeSet<String>> minOffsetMap = new TreeMap<Integer, TreeSet<String>>();
TreeMap<Integer, TreeSet<String>> maxOffsetMap = new TreeMap<Integer, TreeSet<String>>();
for (Iterator<String> it = codes.iterator(); it.hasNext();) {
String zoneID = it.next();
String country = zone_countries.get(zoneID);
TimeZone zone = TimeZone.getTimeZone(zoneID);
ZoneInflections zip = new ZoneInflections(zone);
out.println(zoneID + "\t" + zip);
country_inflection_names.add(new Object[] { country, zip, zoneID });
TreeSet<String> s = minOffsetMap.get(zip.getMinOffset());
if (s == null)
minOffsetMap.put(zip.getMinOffset(), s = new TreeSet<String>());
s.add(zone.getID());
s = maxOffsetMap.get(zip.getMaxOffset());
if (s == null)
maxOffsetMap.put(zip.getMaxOffset(), s = new TreeSet<String>());
s.add(zone.getID());
}
System.out.println("Minimum Offset: " + minOffsetMap);
System.out.println("Maximum Offset: " + maxOffsetMap);
out.close();
out = FileUtilities.openUTF8Writer(CLDRPaths.GEN_DIRECTORY, "modernTimezoneEquivalents.html");
out.println("<html>" + "<head>"
+ "<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>"
+ "<title>Modern Equivalent Timezones</title><style>");
out.println("td.top,td.topr { background-color: #EEEEFF }");
out.println("td.r,td.topr { text-align:right }");
out
.println("td.gap { font-weight:bold; border-top: 3px solid #0000FF; border-bottom: 3px solid #0000FF; background-color: #CCCCCC }");
out
.println("</style>"
+ "</head>"
+ "<body>"
+ "<table border='1' cellspacing='0' cellpadding='2' style='border-collapse: collapse'>");
Tabber.HTMLTabber tabber1 = new Tabber.HTMLTabber();
tabber1.setParameters(4, "class='r'");
tabber1.setParameters(5, "class='r'");
Tabber.HTMLTabber tabber2 = new Tabber.HTMLTabber();
tabber2.setParameters(0, "class='top'");
tabber2.setParameters(1, "class='top'");
tabber2.setParameters(2, "class='top'");
tabber2.setParameters(3, "class='top'");
tabber2.setParameters(4, "class='topr'");
tabber2.setParameters(5, "class='topr'");
Tabber.HTMLTabber tabber3 = new Tabber.HTMLTabber();
tabber3.setParameters(0, "class='gap'");
tabber3.setParameters(1, "class='gap'");
tabber3.setParameters(2, "class='gap'");
tabber3.setParameters(3, "class='gap'");
tabber3.setParameters(4, "class='gap'");
tabber3.setParameters(5, "class='gap'");
long minimumDate = ICUServiceBuilder.isoDateParse("2000-1-1T00:00:00Z")
.getTime();
out
.println("<h1>Modern Equivalent Timezones: <a target='_blank' href='instructions.html'>Instructions</a></h1>");
out.println(ShowData.dateFooter());
out.println("<p>Zones identical after: "
+ ICUServiceBuilder.isoDateFormat(minimumDate) + "</p>");
String lastCountry = "";
ZoneInflections.OutputLong diff = new ZoneInflections.OutputLong(0);
Factory cldrFactory = Factory.make(CLDRPaths.MAIN_DIRECTORY, ".*");
TimezoneFormatter tzf = new TimezoneFormatter(cldrFactory, "en", true);
Map<String, Set<String>> country_zoneSet = sc.getCountryToZoneSet();
boolean shortList = true;
boolean first = true;
int category = 1;
Tabber tabber = tabber1;
for (Iterator<Object[]> it = country_inflection_names.iterator(); it.hasNext();) {
Object[] row = it.next();
String country = (String) row[0];
if (country.equals("001"))
continue;
if (shortList && (country_zoneSet.get(country)).size() < 2)
continue;
ZoneInflections zip = (ZoneInflections) row[1];
String zoneID = (String) row[2];
if (!country.equals(lastCountry)) {
if (first)
first = false;
category = 1;
CountItems.subheader(out, tabber3);
} else if (diff.value >= minimumDate) {
// out.println(tabber.process("\tDiffers at:\t" + ICUServiceBuilder.isoDateFormat(diff.value)));
tabber = tabber == tabber1 ? tabber2 : tabber1;
++category;
}
String zoneIDShown = zoneID;
if (needsTranslation.contains(zoneID)) {
zoneIDShown = "<b>" + zoneIDShown + "\u00B9</b>";
}
if (singleCountries.contains(zoneID)) {
zoneIDShown = "<i>" + zoneIDShown + "</i> \u00B2";
}
if (defaultItems.contains(zoneID)) {
zoneIDShown = "<span style='background-color: #FFFF00'>" + zoneIDShown
+ "</span> ?";
}
// if (country.equals(lastCountry) && diff.value >= minimumDate) System.out.print("X");
String newCountry = country;
String mapLink = CountItems.country_map.get(country);
if (mapLink != null) {
newCountry = "<a target='map' href='" + mapLink + "'>" + country
+ "</a>";
}
String minOffset = ZoneInflections.formatHours(zip.getMinOffset(minimumDate));
String maxOffset = ZoneInflections.formatHours(zip.getMaxOffset(minimumDate));
if (!icu4jTZIDs.contains(zoneID)) {
minOffset = maxOffset = "??";
}
out.println(tabber.process(newCountry + "\t" + "<b>" + category + "</b>"
+ "\t" + zoneIDShown + "\t"
+ tzf.getFormattedZone(zoneID, "vvvv", minimumDate, false) + "\t"
+ minOffset + "\t" + maxOffset));
lastCountry = country;
}
CountItems.subheader(out, tabber3);
out.println("</table>");
out.println(CldrUtility.ANALYTICS);
out.println("</body></html>");
out.close();
}
}