Last active
December 2, 2017 01:03
-
-
Save dmikurube/c62ea8ebfbb5c41c0dc21584350bb274 to your computer and use it in GitHub Desktop.
Ruby, Joda-Time, and java.time zone ID comparison
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
apply plugin: 'java' | |
repositories { | |
mavenCentral() | |
} | |
dependencies { | |
compile 'joda-time:joda-time:2.9.2' | |
} | |
sourceSets { | |
main { | |
java { | |
srcDir '.' | |
} | |
} | |
} | |
test { | |
testLogging { | |
events 'passed', 'skipped', 'failed', 'standardOut', 'standardError' | |
} | |
} | |
task run(type:JavaExec) { | |
main = project.hasProperty('main') ? project.getProperty('main') : 'TimeZoneIds' | |
classpath = sourceSets.main.runtimeClasspath | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.Collections; | |
import java.util.SortedMap; | |
import java.util.SortedSet; | |
import java.util.TreeMap; | |
import java.util.TreeSet; | |
public class TimeZoneIds { | |
public static void main(final String[] args) { | |
final TreeSet<String> onlyInJavaTime = new TreeSet<>(javaTimeZoneIds); | |
onlyInJavaTime.removeAll(jodaTimeZoneIds); | |
System.out.println(""); | |
System.out.println("Only in java.time (compared to Joda-Time 2.9.2)"); | |
for (final String id : onlyInJavaTime) { | |
System.out.println(id); | |
} | |
final TreeSet<String> onlyInJodaTime = new TreeSet<>(jodaTimeZoneIds); | |
onlyInJodaTime.removeAll(javaTimeZoneIds); | |
System.out.println(""); | |
System.out.println("Only in Joda-Time 2.9.2 (compared to java.time)"); | |
for (final String id : onlyInJodaTime) { | |
System.out.println(id); | |
} | |
final TreeSet<String> andJavaJoda = new TreeSet<>(javaTimeZoneIds); | |
andJavaJoda.retainAll(jodaTimeZoneIds); | |
System.out.println(""); | |
System.out.println("Both in java.time and Joda-Time 2.9.2"); | |
for (final String id : andJavaJoda) { | |
if ((java.time.ZoneId.of(javaTimeZoneIdsFromLower.get(id)) | |
.getRules().getOffset(java.time.Instant.ofEpochSecond(0)).getTotalSeconds() == | |
org.joda.time.DateTimeZone.forID(jodaTimeZoneIdsFromLower.get(id)).getOffset(0) / 1000) && | |
(java.time.ZoneId.of(javaTimeZoneIdsFromLower.get(id)).getRules().isFixedOffset() == | |
org.joda.time.DateTimeZone.forID(jodaTimeZoneIdsFromLower.get(id)).isFixed())) { | |
System.out.printf(" %-32s (%c:%s:%s) [%6d:%5b]\n", | |
javaTimeZoneIdsFromLower.get(id), | |
(java.time.ZoneId.of(javaTimeZoneIdsFromLower.get(id)).getId().equals( | |
org.joda.time.DateTimeZone.forID(jodaTimeZoneIdsFromLower.get(id)).getID()) | |
? ' ' : 'x'), | |
java.time.ZoneId.of(javaTimeZoneIdsFromLower.get(id)).getId(), | |
org.joda.time.DateTimeZone.forID(jodaTimeZoneIdsFromLower.get(id)).getID(), | |
java.time.ZoneId.of(javaTimeZoneIdsFromLower.get(id)) | |
.getRules().getOffset(java.time.Instant.ofEpochSecond(0)).getTotalSeconds(), | |
java.time.ZoneId.of(javaTimeZoneIdsFromLower.get(id)).getRules().isFixedOffset()); | |
} | |
else { | |
} | |
/* | |
System.out.printf("%s [%6d:%5b]\n", | |
javaTimeZoneIdsFromLower.get(id), | |
java.time.ZoneId.of(javaTimeZoneIdsFromLower.get(id)) | |
.getRules().getOffset(java.time.Instant.ofEpochSecond(0)).getTotalSeconds(), | |
java.time.ZoneId.of(javaTimeZoneIdsFromLower.get(id)).getRules().isFixedOffset()); | |
System.out.printf("%s [%6d:%5b]\n", | |
jodaTimeZoneIdsFromLower.get(id), | |
org.joda.time.DateTimeZone.forID(jodaTimeZoneIdsFromLower.get(id)).getOffset(0) / 1000, | |
org.joda.time.DateTimeZone.forID(jodaTimeZoneIdsFromLower.get(id)).isFixed()); | |
*/ | |
} | |
final TreeSet<String> andRubyJava = new TreeSet<>(javaTimeZoneIds); | |
andRubyJava.retainAll(rubyZoneIds); | |
System.out.println(""); | |
System.out.println("Intersection of Ruby and java.time"); | |
for (final String id : andRubyJava) { | |
System.out.printf("%s: (Ruby: %d, java.time: %d[%b])\n", id, | |
rubyZonetab.get(id), | |
java.time.ZoneId.of(javaTimeZoneIdsFromLower.get(id)) | |
.getRules().getOffset(java.time.Instant.ofEpochSecond(0)).getTotalSeconds(), | |
java.time.ZoneId.of(javaTimeZoneIdsFromLower.get(id)).getRules().isFixedOffset()); | |
} | |
final TreeSet<String> andRubyJoda = new TreeSet<>(jodaTimeZoneIds); | |
andRubyJoda.retainAll(rubyZoneIds); | |
System.out.println(""); | |
System.out.println("Intersection of Ruby and Joda-Time 2.9.2"); | |
for (final String id : andRubyJoda) { | |
System.out.printf("%s: (Ruby: %d, Joda-Time: %d[%b])\n", id, | |
rubyZonetab.get(id), | |
org.joda.time.DateTimeZone.forID(jodaTimeZoneIdsFromLower.get(id)).getOffset(0) / 1000, | |
org.joda.time.DateTimeZone.forID(jodaTimeZoneIdsFromLower.get(id)).isFixed()); | |
} | |
} | |
private static final SortedSet<String> javaTimeZoneIds; | |
private static final SortedMap<String, String> javaTimeZoneIdsFromLower; | |
private static final SortedSet<String> jodaTimeZoneIds; | |
private static final SortedMap<String, String> jodaTimeZoneIdsFromLower; | |
private static final SortedSet<String> rubyZoneIds; | |
private static final SortedMap<String, Integer> rubyZonetab; | |
static { | |
final TreeSet<String> javaTimeZoneIdsBuilt = new TreeSet<>(); | |
final TreeMap<String, String> javaTimeZoneIdsFromLowerBuilt = new TreeMap<>(); | |
for (final String id : java.time.ZoneId.getAvailableZoneIds()) { | |
javaTimeZoneIdsBuilt.add(id.toLowerCase()); | |
javaTimeZoneIdsFromLowerBuilt.put(id.toLowerCase(), id); | |
} | |
javaTimeZoneIds = Collections.unmodifiableSortedSet(javaTimeZoneIdsBuilt); | |
javaTimeZoneIdsFromLower = Collections.unmodifiableSortedMap(javaTimeZoneIdsFromLowerBuilt); | |
final TreeSet<String> jodaTimeZoneIdsBuilt = new TreeSet<>(); | |
final TreeMap<String, String> jodaTimeZoneIdsFromLowerBuilt = new TreeMap<>(); | |
for (final String id : org.joda.time.DateTimeZone.getAvailableIDs()) { | |
jodaTimeZoneIdsBuilt.add(id.toLowerCase()); | |
jodaTimeZoneIdsFromLowerBuilt.put(id.toLowerCase(), id); | |
} | |
jodaTimeZoneIds = Collections.unmodifiableSortedSet(jodaTimeZoneIdsBuilt); | |
jodaTimeZoneIdsFromLower = Collections.unmodifiableSortedMap(jodaTimeZoneIdsFromLowerBuilt); | |
final TreeMap<String, Integer> rubyZonetabBuilt = new TreeMap<>(); | |
rubyZonetabBuilt.put("ut", 0*3600); | |
rubyZonetabBuilt.put("gmt", 0*3600); | |
rubyZonetabBuilt.put("est", -5*3600); | |
rubyZonetabBuilt.put("edt", -4*3600); | |
rubyZonetabBuilt.put("cst", -6*3600); | |
rubyZonetabBuilt.put("cdt", -5*3600); | |
rubyZonetabBuilt.put("mst", -7*3600); | |
rubyZonetabBuilt.put("mdt", -6*3600); | |
rubyZonetabBuilt.put("pst", -8*3600); | |
rubyZonetabBuilt.put("pdt", -7*3600); | |
rubyZonetabBuilt.put("a", 1*3600); | |
rubyZonetabBuilt.put("b", 2*3600); | |
rubyZonetabBuilt.put("c", 3*3600); | |
rubyZonetabBuilt.put("d", 4*3600); | |
rubyZonetabBuilt.put("e", 5*3600); | |
rubyZonetabBuilt.put("f", 6*3600); | |
rubyZonetabBuilt.put("g", 7*3600); | |
rubyZonetabBuilt.put("h", 8*3600); | |
rubyZonetabBuilt.put("i", 9*3600); | |
rubyZonetabBuilt.put("k", 10*3600); | |
rubyZonetabBuilt.put("l", 11*3600); | |
rubyZonetabBuilt.put("m", 12*3600); | |
rubyZonetabBuilt.put("n", -1*3600); | |
rubyZonetabBuilt.put("o", -2*3600); | |
rubyZonetabBuilt.put("p", -3*3600); | |
rubyZonetabBuilt.put("q", -4*3600); | |
rubyZonetabBuilt.put("r", -5*3600); | |
rubyZonetabBuilt.put("s", -6*3600); | |
rubyZonetabBuilt.put("t", -7*3600); | |
rubyZonetabBuilt.put("u", -8*3600); | |
rubyZonetabBuilt.put("v", -9*3600); | |
rubyZonetabBuilt.put("w", -10*3600); | |
rubyZonetabBuilt.put("x", -11*3600); | |
rubyZonetabBuilt.put("y", -12*3600); | |
rubyZonetabBuilt.put("z", 0*3600); | |
rubyZonetabBuilt.put("utc", 0*3600); | |
rubyZonetabBuilt.put("wet", 0*3600); | |
rubyZonetabBuilt.put("at", -2*3600); | |
rubyZonetabBuilt.put("brst",-2*3600); | |
rubyZonetabBuilt.put("ndt", -(2*3600+1800)); | |
rubyZonetabBuilt.put("art", -3*3600); | |
rubyZonetabBuilt.put("adt", -3*3600); | |
rubyZonetabBuilt.put("brt", -3*3600); | |
rubyZonetabBuilt.put("clst",-3*3600); | |
rubyZonetabBuilt.put("nst", -(3*3600+1800)); | |
rubyZonetabBuilt.put("ast", -4*3600); | |
rubyZonetabBuilt.put("clt", -4*3600); | |
rubyZonetabBuilt.put("akdt",-8*3600); | |
rubyZonetabBuilt.put("ydt", -8*3600); | |
rubyZonetabBuilt.put("akst",-9*3600); | |
rubyZonetabBuilt.put("hadt",-9*3600); | |
rubyZonetabBuilt.put("hdt", -9*3600); | |
rubyZonetabBuilt.put("yst", -9*3600); | |
rubyZonetabBuilt.put("ahst",-10*3600); | |
rubyZonetabBuilt.put("cat",-10*3600); | |
rubyZonetabBuilt.put("hast",-10*3600); | |
rubyZonetabBuilt.put("hst",-10*3600); | |
rubyZonetabBuilt.put("nt", -11*3600); | |
rubyZonetabBuilt.put("idlw",-12*3600); | |
rubyZonetabBuilt.put("bst", 1*3600); | |
rubyZonetabBuilt.put("cet", 1*3600); | |
rubyZonetabBuilt.put("fwt", 1*3600); | |
rubyZonetabBuilt.put("met", 1*3600); | |
rubyZonetabBuilt.put("mewt", 1*3600); | |
rubyZonetabBuilt.put("mez", 1*3600); | |
rubyZonetabBuilt.put("swt", 1*3600); | |
rubyZonetabBuilt.put("wat", 1*3600); | |
rubyZonetabBuilt.put("west", 1*3600); | |
rubyZonetabBuilt.put("cest", 2*3600); | |
rubyZonetabBuilt.put("eet", 2*3600); | |
rubyZonetabBuilt.put("fst", 2*3600); | |
rubyZonetabBuilt.put("mest", 2*3600); | |
rubyZonetabBuilt.put("mesz", 2*3600); | |
rubyZonetabBuilt.put("sast", 2*3600); | |
rubyZonetabBuilt.put("sst", 2*3600); | |
rubyZonetabBuilt.put("bt", 3*3600); | |
rubyZonetabBuilt.put("eat", 3*3600); | |
rubyZonetabBuilt.put("eest", 3*3600); | |
rubyZonetabBuilt.put("msk", 3*3600); | |
rubyZonetabBuilt.put("msd", 4*3600); | |
rubyZonetabBuilt.put("zp4", 4*3600); | |
rubyZonetabBuilt.put("zp5", 5*3600); | |
rubyZonetabBuilt.put("ist", (5*3600+1800)); | |
rubyZonetabBuilt.put("zp6", 6*3600); | |
rubyZonetabBuilt.put("wast", 7*3600); | |
rubyZonetabBuilt.put("cct", 8*3600); | |
rubyZonetabBuilt.put("sgt", 8*3600); | |
rubyZonetabBuilt.put("wadt", 8*3600); | |
rubyZonetabBuilt.put("jst", 9*3600); | |
rubyZonetabBuilt.put("kst", 9*3600); | |
rubyZonetabBuilt.put("east",10*3600); | |
rubyZonetabBuilt.put("gst", 10*3600); | |
rubyZonetabBuilt.put("eadt",11*3600); | |
rubyZonetabBuilt.put("idle",12*3600); | |
rubyZonetabBuilt.put("nzst",12*3600); | |
rubyZonetabBuilt.put("nzt", 12*3600); | |
rubyZonetabBuilt.put("nzdt",13*3600); | |
rubyZonetabBuilt.put("afghanistan", 16200); | |
rubyZonetabBuilt.put("alaskan", -32400); | |
rubyZonetabBuilt.put("arab", 10800); | |
rubyZonetabBuilt.put("arabian", 14400); | |
rubyZonetabBuilt.put("arabic", 10800); | |
rubyZonetabBuilt.put("atlantic", -14400); | |
rubyZonetabBuilt.put("aus central", 34200); | |
rubyZonetabBuilt.put("aus eastern", 36000); | |
rubyZonetabBuilt.put("azores", -3600); | |
rubyZonetabBuilt.put("canada central", -21600); | |
rubyZonetabBuilt.put("cape verde", -3600); | |
rubyZonetabBuilt.put("caucasus", 14400); | |
rubyZonetabBuilt.put("cen. australia", 34200); | |
rubyZonetabBuilt.put("central america", -21600); | |
rubyZonetabBuilt.put("central asia", 21600); | |
rubyZonetabBuilt.put("central europe", 3600); | |
rubyZonetabBuilt.put("central european", 3600); | |
rubyZonetabBuilt.put("central pacific", 39600); | |
rubyZonetabBuilt.put("central", -21600); | |
rubyZonetabBuilt.put("china", 28800); | |
rubyZonetabBuilt.put("dateline", -43200); | |
rubyZonetabBuilt.put("e. africa", 10800); | |
rubyZonetabBuilt.put("e. australia", 36000); | |
rubyZonetabBuilt.put("e. europe", 7200); | |
rubyZonetabBuilt.put("e. south america", -10800); | |
rubyZonetabBuilt.put("eastern", -18000); | |
rubyZonetabBuilt.put("egypt", 7200); | |
rubyZonetabBuilt.put("ekaterinburg", 18000); | |
rubyZonetabBuilt.put("fiji", 43200); | |
rubyZonetabBuilt.put("fle", 7200); | |
rubyZonetabBuilt.put("greenland", -10800); | |
rubyZonetabBuilt.put("greenwich", 0); | |
rubyZonetabBuilt.put("gtb", 7200); | |
rubyZonetabBuilt.put("hawaiian", -36000); | |
rubyZonetabBuilt.put("india", 19800); | |
rubyZonetabBuilt.put("iran", 12600); | |
rubyZonetabBuilt.put("jerusalem", 7200); | |
rubyZonetabBuilt.put("korea", 32400); | |
rubyZonetabBuilt.put("mexico", -21600); | |
rubyZonetabBuilt.put("mid-atlantic", -7200); | |
rubyZonetabBuilt.put("mountain", -25200); | |
rubyZonetabBuilt.put("myanmar", 23400); | |
rubyZonetabBuilt.put("n. central asia", 21600); | |
rubyZonetabBuilt.put("nepal", 20700); | |
rubyZonetabBuilt.put("new zealand", 43200); | |
rubyZonetabBuilt.put("newfoundland", -12600); | |
rubyZonetabBuilt.put("north asia east", 28800); | |
rubyZonetabBuilt.put("north asia", 25200); | |
rubyZonetabBuilt.put("pacific sa", -14400); | |
rubyZonetabBuilt.put("pacific", -28800); | |
rubyZonetabBuilt.put("romance", 3600); | |
rubyZonetabBuilt.put("russian", 10800); | |
rubyZonetabBuilt.put("sa eastern", -10800); | |
rubyZonetabBuilt.put("sa pacific", -18000); | |
rubyZonetabBuilt.put("sa western", -14400); | |
rubyZonetabBuilt.put("samoa", -39600); | |
rubyZonetabBuilt.put("se asia", 25200); | |
rubyZonetabBuilt.put("malay peninsula", 28800); | |
rubyZonetabBuilt.put("south africa", 7200); | |
rubyZonetabBuilt.put("sri lanka", 21600); | |
rubyZonetabBuilt.put("taipei", 28800); | |
rubyZonetabBuilt.put("tasmania", 36000); | |
rubyZonetabBuilt.put("tokyo", 32400); | |
rubyZonetabBuilt.put("tonga", 46800); | |
rubyZonetabBuilt.put("us eastern", -18000); | |
rubyZonetabBuilt.put("us mountain", -25200); | |
rubyZonetabBuilt.put("vladivostok", 36000); | |
rubyZonetabBuilt.put("w. australia", 28800); | |
rubyZonetabBuilt.put("w. central africa", 3600); | |
rubyZonetabBuilt.put("w. europe", 3600); | |
rubyZonetabBuilt.put("west asia", 18000); | |
rubyZonetabBuilt.put("west pacific", 36000); | |
rubyZonetabBuilt.put("yakutsk", 32400); | |
rubyZonetab = Collections.unmodifiableSortedMap(rubyZonetabBuilt); | |
rubyZoneIds = Collections.unmodifiableSortedSet(new TreeSet(rubyZonetabBuilt.keySet())); | |
} | |
} |
Author
dmikurube
commented
Dec 1, 2017
•
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment