public static ZoneId parseZoneOffsetOrZoneName( String zoneName ) { Matcher matcher = OFFSET.matcher( zoneName ); if ( matcher.matches() ) { return parseOffset( matcher ); } try { return ZONE_NAME_PARSER.parse( zoneName.replace( ' ', '_' ) ).query( TemporalQueries.zoneId() ); } catch ( DateTimeParseException e ) { throw new TemporalParseException( "Invalid value for TimeZone: " + e.getMessage(), e.getParsedString(), e.getErrorIndex(), e ); } }
static ZoneId parseZoneName( String zoneName ) { ZoneId parsedName; try { parsedName = ZONE_NAME_PARSER.parse( zoneName.replace( ' ', '_' ) ).query( TemporalQueries.zoneId() ); } catch ( DateTimeParseException e ) { throw new TemporalParseException( "Invalid value for TimeZone: " + e.getMessage(), e.getParsedString(), e.getErrorIndex(), e ); } return parsedName; }
private OffsetDateTime buildOffsetDateTime(final TemporalAccessor given) throws TimestampParseException { final ZoneId givenZoneId = given.query(TemporalQueries.zoneId()); if (givenZoneId != null) { throw new TimestampParseException("Non-offset zone IDs are unaccepted in 'java:' formats: " + this.pattern); final ZoneOffset givenZoneOffset = given.query(TemporalQueries.offset()); if (given.isSupported(ChronoField.EPOCH_DAY) && given.isSupported(ChronoField.NANO_OF_DAY)) {
@Override public TemporalUnit queryFrom(TemporalAccessor temporal) { return temporal.query(this); } };
@Override public ZoneId queryFrom(TemporalAccessor temporal) { return temporal.query(this); } };
@Override public Chronology queryFrom(TemporalAccessor temporal) { return temporal.query(this); } };
static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm"); TemporalAccessor parsed = TIME_FORMATTER.parse("24:00"); LocalTime lt = LocalTime.from(parsed); Period excessDays = parsed.query(DateTimeFormatter.parsedExcessDays()); System.out.println(lt + " + " + excessDays); // 00:00 + P1D
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); TemporalAccessor parsed = dtf.parse("2016-11-14 24:00"); Period extraDays = parsed.query(DateTimeFormatter.parsedExcessDays()); LocalDateTime ldt = LocalDateTime.from(parsed); System.out.println(ldt); System.out.println(extraDays);
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("HH:mm"); TemporalAccessor parsed2 = dtf2.parse("24:00"); Period extraDays2 = parsed2.query(DateTimeFormatter.parsedExcessDays()); System.out.println(extraDays2); // P1D LocalTime lt = LocalTime.from(parsed2); System.out.println(lt); // 00:00
String input = "24:00:00"; DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss"); TemporalAccessor raw = dtf.parse(input); int hour = raw.query(LocalTime::from).getHour(); Period period = raw.query(DateTimeFormatter.parsedExcessDays()); if (period.equals(Period.ofDays(1))) { hour = 24; } System.out.println("iso-hour=" + hour); // output: iso-hour=24
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd "); DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("HH:mm"); String input = "2016-11-14 24:00"; ParsePosition pp = new ParsePosition(0); LocalDate ld = LocalDate.from(dtf1.parse(input, pp)); TemporalAccessor timePart = dtf2.parse(input, pp); Period extraDays = timePart.query(DateTimeFormatter.parsedExcessDays()); LocalTime lt = LocalTime.from(timePart); System.out.println(ld); // 2016-11-14 System.out.println(lt); // 00:00 System.out.println(extraDays); // P1D
public ZoneId queryFrom(TemporalAccessor temporal) { ZoneId zone = temporal.query(TemporalQueries.zoneId()); return (zone != null && zone instanceof ZoneOffset == false ? zone : null); } };
private Optional<ZonedDateTime> getZonedDateTime(TemporalAccessor parsed) { ZoneId zone = parsed.query(TemporalQueries.zone()); if (zone == null) { return Optional.empty(); } Optional<ZonedDateTime> zonedDateTime = getLocalDateTime(parsed) .map(localDateTime -> localDateTime.atZone(zone)); if (!zonedDateTime.isPresent()) { zonedDateTime = getLocalDate(parsed).map(localDate -> localDate.atStartOfDay(zone)); } return zonedDateTime; }
private Optional<ZonedDateTime> getZonedDateTime(TemporalAccessor parsed) { ZoneId zone = parsed.query(TemporalQueries.zone()); if (zone == null) { return Optional.empty(); } Optional<ZonedDateTime> zonedDateTime = getLocalDateTime(parsed) .map(localDateTime -> localDateTime.atZone(zone)); if (!zonedDateTime.isPresent()) { zonedDateTime = getLocalDate(parsed).map(localDate -> localDate.atStartOfDay(zone)); } return zonedDateTime; }
@Test public void parseWithZoneIANA() { final TemporalAccessor parsedResult = timeFunction.invoke("00:01:00@Europe/Paris").getOrElse(null); assertEquals(LocalTime.of(0, 1, 0), parsedResult.query(TemporalQueries.localTime())); assertEquals(ZoneId.of("Europe/Paris"), parsedResult.query(TemporalQueries.zone())); }
@Test public void testComposite4() { final FEELFnResult<TemporalAccessor> p1 = dateFunction.invoke("2017-01-01"); final FEELFnResult<TemporalAccessor> p2 = timeFunction.invoke("23:59:01@Europe/Paris"); FunctionTestUtil.assertResult(p1, LocalDate.of(2017, 1, 1)); final TemporalAccessor p2TA = p2.getOrElse(null); assertNotNull(p2TA); assertEquals(LocalTime.of(23, 59, 1), p2TA.query(TemporalQueries.localTime())); assertEquals(ZoneId.of("Europe/Paris"), p2TA.query(TemporalQueries.zone())); final FEELFnResult<TemporalAccessor> result = dateTimeFunction.invoke(p1.getOrElse(null), p2.getOrElse(null)); FunctionTestUtil.assertResult(result, ZonedDateTime.of(2017, 1, 1, 23, 59, 1, 0, ZoneId.of("Europe/Paris"))); }
@Test public void testComposite5() { final FEELFnResult<TemporalAccessor> p1 = dateTimeFunction.invoke("2017-08-10T10:20:00@Europe/Paris"); FunctionTestUtil.assertResult(p1, ZonedDateTime.of(2017, 8, 10, 10, 20, 0, 0, ZoneId.of("Europe/Paris"))); final TemporalAccessor timeOnDateTime = timeFunction.invoke(p1.getOrElse(null)).getOrElse(null); assertNotNull(timeOnDateTime); assertEquals(LocalTime.of(10, 20, 0), timeOnDateTime.query(TemporalQueries.localTime())); assertEquals(ZoneId.of("Europe/Paris"), timeOnDateTime.query(TemporalQueries.zone())); FunctionTestUtil.assertResult(stringFunction.invoke(timeOnDateTime), "10:20:00@Europe/Paris"); } }