Skip to content

Instantly share code, notes, and snippets.

@dmikurube
Last active December 2, 2017 01:03
Show Gist options
  • Save dmikurube/c62ea8ebfbb5c41c0dc21584350bb274 to your computer and use it in GitHub Desktop.
Save dmikurube/c62ea8ebfbb5c41c0dc21584350bb274 to your computer and use it in GitHub Desktop.
Ruby, Joda-Time, and java.time zone ID comparison
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
}
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()));
}
}
@dmikurube
Copy link
Author

dmikurube commented Dec 1, 2017

$ ./gradlew run
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:run

Only in java.time (compared to Joda-Time 2.9.2)
asia/barnaul
asia/tomsk
europe/astrakhan
europe/kirov
europe/ulyanovsk
systemv/ast4
systemv/ast4adt
systemv/cst6
systemv/cst6cdt
systemv/est5
systemv/est5edt
systemv/hst10
systemv/mst7
systemv/mst7mdt
systemv/pst8
systemv/pst8pdt
systemv/yst9
systemv/yst9ydt

Only in Joda-Time 2.9.2 (compared to java.time)
est
gmt+0
gmt-0
hst
mst
roc

Intersection of Ruby and java.time
cet: (Ruby: 3600, java.time: 3600[false])
eet: (Ruby: 7200, java.time: 7200[false])
egypt: (Ruby: 7200, java.time: 7200[false])
gmt: (Ruby: 0, java.time: 0[true])
greenwich: (Ruby: 0, java.time: 0[true])
iran: (Ruby: 12600, java.time: 12600[false])
met: (Ruby: 3600, java.time: 3600[false])
utc: (Ruby: 0, java.time: 0[true])
wet: (Ruby: 0, java.time: 0[false])

Intersection of Ruby and Joda-Time 2.9.2
cet: (Ruby: 3600, Joda-Time: 3600[false])
eet: (Ruby: 7200, Joda-Time: 7200[false])
egypt: (Ruby: 7200, Joda-Time: 7200[false])
est: (Ruby: -18000, Joda-Time: -18000[true])
gmt: (Ruby: 0, Joda-Time: 0[true])
greenwich: (Ruby: 0, Joda-Time: 0[true])
hst: (Ruby: -36000, Joda-Time: -36000[true])
iran: (Ruby: 12600, Joda-Time: 12600[false])
met: (Ruby: 3600, Joda-Time: 3600[false])
mst: (Ruby: -25200, Joda-Time: -25200[true])
utc: (Ruby: 0, Joda-Time: 0[true])
wet: (Ruby: 0, Joda-Time: 0[false])

BUILD SUCCESSFUL

Total time: 1.023 secs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment