Skip to content

Instantly share code, notes, and snippets.

@kawasima
Last active August 7, 2018 02:19
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kawasima/81fe6408fbe1558c52dfb3118616392c to your computer and use it in GitHub Desktop.
Save kawasima/81fe6408fbe1558c52dfb3118616392c to your computer and use it in GitHub Desktop.
Asia/Tokyo2020
import java.time.LocalDateTime;
import java.time.Month;
import java.time.ZoneOffset;
import java.time.zone.ZoneOffsetTransition;
import java.time.zone.ZoneOffsetTransitionRule;
import java.time.zone.ZoneRules;
import java.time.zone.ZoneRulesProvider;
import java.util.*;
public class ZoneTokyo2020Register {
static {
List<ZoneOffsetTransition> standardTransitions = new ArrayList<>();
standardTransitions.add(ZoneOffsetTransition.of(LocalDateTime.of(1887, Month.DECEMBER, 31, 15, 18, 59), ZoneOffset.of("+09:18:59"), ZoneOffset.of("+09:00")));
List<ZoneOffsetTransition> transitions = new ArrayList<>();
transitions.add(ZoneOffsetTransition.of(LocalDateTime.of(1888, Month.JANUARY, 1, 0, 18, 59), ZoneOffset.of("+09:18:59"), ZoneOffset.of("+09:00")));
transitions.add(ZoneOffsetTransition.of(LocalDateTime.of(1948, Month.MAY, 2, 0, 0), ZoneOffset.of("+09:00"), ZoneOffset.of("+10:00")));
transitions.add(ZoneOffsetTransition.of(LocalDateTime.of(1948, Month.SEPTEMBER, 12, 0, 0), ZoneOffset.of("+10:00"), ZoneOffset.of("+09:00")));
transitions.add(ZoneOffsetTransition.of(LocalDateTime.of(1949, Month.APRIL, 3, 0, 0), ZoneOffset.of("+09:00"), ZoneOffset.of("+10:00")));
transitions.add(ZoneOffsetTransition.of(LocalDateTime.of(1949, Month.SEPTEMBER, 11, 0, 0), ZoneOffset.of("+10:00"), ZoneOffset.of("+09:00")));
transitions.add(ZoneOffsetTransition.of(LocalDateTime.of(1950, Month.MAY, 7, 0, 0), ZoneOffset.of("+09:00"), ZoneOffset.of("+10:00")));
transitions.add(ZoneOffsetTransition.of(LocalDateTime.of(1950, Month.SEPTEMBER, 10, 0, 0), ZoneOffset.of("+10:00"), ZoneOffset.of("+09:00")));
transitions.add(ZoneOffsetTransition.of(LocalDateTime.of(1951, Month.MAY, 6, 0, 0), ZoneOffset.of("+09:00"), ZoneOffset.of("+10:00")));
transitions.add(ZoneOffsetTransition.of(LocalDateTime.of(1951, Month.SEPTEMBER, 9, 0, 0), ZoneOffset.of("+10:00"), ZoneOffset.of("+09:00")));
// For the Tokyo Olympic
transitions.add(ZoneOffsetTransition.of(LocalDateTime.of(2019, Month.JUNE, 1, 0, 0), ZoneOffset.of("+09:00"), ZoneOffset.of("+11:00")));
transitions.add(ZoneOffsetTransition.of(LocalDateTime.of(2019, Month.SEPTEMBER, 1, 0, 0), ZoneOffset.of("+11:00"), ZoneOffset.of("+09:00")));
transitions.add(ZoneOffsetTransition.of(LocalDateTime.of(2020, Month.JUNE, 1, 0, 0), ZoneOffset.of("+09:00"), ZoneOffset.of("+11:00")));
transitions.add(ZoneOffsetTransition.of(LocalDateTime.of(2020, Month.SEPTEMBER, 1, 0, 0), ZoneOffset.of("+11:00"), ZoneOffset.of("+09:00")));
List<ZoneOffsetTransitionRule> rules = new ArrayList<>();
ZoneRules tokyo2020 = ZoneRules.of(ZoneOffset.of("+09:18:59"), ZoneOffset.of("+09:18:59"),
standardTransitions, transitions, rules);
ZoneRulesProvider.registerProvider(new ZoneRulesProvider() {
private Set<String> ids = new HashSet<>(Arrays.asList("Asia/Tokyo2020"));
@Override
protected Set<String> provideZoneIds() {
return ids;
}
@Override
protected ZoneRules provideRules(String zoneId, boolean forCaching) {
if (zoneId.equals("Asia/Tokyo2020")) {
return tokyo2020;
}
return null;
}
@Override
protected NavigableMap<String, ZoneRules> provideVersions(String zoneId) {
NavigableMap<String, ZoneRules> versions = new TreeMap<>();
versions.put("2018e", tokyo2020); // I think this is a wrong version
return versions;
}
});
}
}
public class ZoneTokyo2020Test {
@Before
public void setup() throws ClassNotFoundException {
Class.forName("ZoneTokyo2020Register");
}
@Test
public void test() {
DateTimeFormatter format = DateTimeFormatter
.ofPattern("yyyy/MMM/d a hh:mm Z");
ZoneId tokyo = ZoneId.of("Asia/Tokyo2020");
System.out.println(ZonedDateTime.of(LocalDateTime.of(2018, Month.MAY, 31, 23, 59), tokyo).format(format));
System.out.println(ZonedDateTime.of(LocalDateTime.of(2018, Month.JUNE, 1, 0, 0), tokyo).format(format));
System.out.println(ZonedDateTime.of(LocalDateTime.of(2019, Month.MAY, 31, 23, 59), tokyo).format(format));
System.out.println(ZonedDateTime.of(LocalDateTime.of(2019, Month.JUNE, 1, 0, 0), tokyo).format(format));
System.out.println(ZonedDateTime.of(LocalDateTime.of(2019, Month.AUGUST, 31, 23, 59), tokyo).format(format));
System.out.println(ZonedDateTime.of(LocalDateTime.of(2019, Month.SEPTEMBER, 1, 0, 0), tokyo).format(format));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment