public static Range<ZonedDateTime> zonedDateTimeRange(String rangeStr) {
        Range<ZonedDateTime> range = ofString(rangeStr, parseZonedDateTime().compose(unquote()), ZonedDateTime.class);
        if (range.hasLowerBound() && range.hasUpperBound() && !EMPTY.equals(rangeStr)) {
            ZoneId lowerZone = range.lower().getZone();
            ZoneId upperZone = range.upper().getZone();
            if (!lowerZone.equals(upperZone)) {
                Duration lowerDst = ZoneId.systemDefault().getRules().getDaylightSavings(range.lower().toInstant());
                Duration upperDst = ZoneId.systemDefault().getRules().getDaylightSavings(range.upper().toInstant());
                long dstSeconds = upperDst.minus(lowerDst).getSeconds();
                if(dstSeconds < 0 ) {
                    dstSeconds *= -1;
                }
                long zoneDriftSeconds = ((ZoneOffset) lowerZone).getTotalSeconds() - ((ZoneOffset) upperZone).getTotalSeconds();
                if (zoneDriftSeconds < 0) {
                    zoneDriftSeconds *= -1;
                }

                if (dstSeconds != zoneDriftSeconds) {
                    throw new IllegalArgumentException("The upper and lower bounds must be in same time zone!");
                }
            }
        }
        return range;
    }
@Test
    public void zonedDateTimeTest() {
    	assertNotNull(Range.zonedDateTimeRange("[2019-03-27 16:33:10.1-06,)"));
    	assertNotNull(Range.zonedDateTimeRange("[2019-03-27 16:33:10.12-06,)"));
    	assertNotNull(Range.zonedDateTimeRange("[2019-03-27 16:33:10.123-06,)"));
    	assertNotNull(Range.zonedDateTimeRange("[2019-03-27 16:33:10.1234-06,)"));
    	assertNotNull(Range.zonedDateTimeRange("[2019-03-27 16:33:10.12345-06,)"));
    	assertNotNull(Range.zonedDateTimeRange("[2019-03-27 16:33:10.123456-06,)"));
    	assertNotNull(Range.zonedDateTimeRange("[2019-03-27 16:33:10.123456+05:30,)"));
    	assertNotNull(Range.zonedDateTimeRange("[2019-03-27 16:33:10.123456-06,infinity)"));
    }