kestra-io/kestra · error · PebbleException

The 'isPublicHoliday()' function could not parse 'date

Error message

The 'isPublicHoliday()' function could not parse 'date': {e.getMessage()}

What it means

The Pebble function isPublicHoliday(date, countryCode, subDivision) calls DateUtils.parseLocalDate on the date argument, which only accepts ISO 8601 formats (yyyy-MM-dd, yyyy-MM-ddTHH:mm:ss, or a full ZonedDateTime like 2024-01-01T00:00:00+01:00[Europe/Paris]). When parsing fails through all three internal fallback paths, the resulting InternalException is wrapped in this PebbleException. The underlying cause message from the DateTimeException is appended.

Solutions

  1. Convert the date to ISO 8601 (yyyy-MM-dd) before calling isPublicHoliday — e.g. use a date formatting expression or the formatDate function upstream.
  2. If the date comes from an external source, add a transform task that normalizes it to yyyy-MM-dd.
  3. Inspect the appended e.getMessage() to see the exact format the parser expected versus received.

Example fix

# before
value: "{{ isPublicHoliday('15/01/2024', 'FR') }}"
# after
value: "{{ isPublicHoliday('2024-01-15', 'FR') }}"
Defensive patterns

Strategy: validation

Validate before calling

# In the Pebble template, validate the date is ISO 8601 before calling:
# Ensure the variable is a string matching yyyy-MM-dd pattern
{% set datePattern = /^\d{4}-\d{2}-\d{2}$/ %}
{% if dateVar matches datePattern %}
  {{ isPublicHoliday(dateVar, countryCode) }}
{% else %}
  {{ throw('date must be ISO 8601 (yyyy-MM-dd)') }}
{% endif %}

Prevention

When it happens

Trigger: Passing a date string that is not ISO 8601 (e.g. '01/15/2024', 'Jan 15 2024', '15-01-2024'); passing a variable that resolves to a non-date string; passing a timestamp in epoch seconds or a locale-formatted string produced by an upstream task or external API.

Common situations: An upstream task outputs a date in a regional format (US-style MM/DD/YYYY or European DD-MM-YYYY). A third-party API returns dates in a non-ISO format. A user assumes the function accepts any human-readable date string.

Related errors


AI-assisted analysis of kestra-io/kestra@823fada927 (2026-08-14). Data as JSON: /api/errors/bf43c700aa10abf3. Report an issue: GitHub.

Appendix: source

Thrown at core/src/main/java/io/kestra/core/runners/pebble/functions/IsPublicHolidayFunction.java:61

        Object subDivisionArg = args.get("subDivision");

        if (dateArg == null) {
            throw new PebbleException(null, "The 'isPublicHoliday()' function expects a 'date' argument.", lineNumber, self.getName());
        }
        if (countryCodeArg == null) {
            throw new PebbleException(null, "The 'isPublicHoliday()' function expects a 'countryCode' argument.", lineNumber, self.getName());
        }

        String countryCode = countryCodeArg.toString();
        String subDivision = subDivisionArg != null && !subDivisionArg.toString().isBlank()
            ? subDivisionArg.toString()
            : null;

        LocalDate localDate;
        try {
            localDate = DateUtils.parseLocalDate(dateArg.toString());
        } catch (InternalException e) {
            throw new PebbleException(e, "The 'isPublicHoliday()' function could not parse 'date': " + e.getMessage(), lineNumber, self.getName());
        }

        HolidayManager holidayManager = HolidayManager.getInstance(ManagerParameters.create(countryCode));

        return subDivision == null
            ? holidayManager.isHoliday(localDate)
            : holidayManager.isHoliday(localDate, subDivision);
    }

    @Override
    public List<String> getArgumentNames() {
        return List.of("date", "countryCode", "subDivision");
    }

    @Override
    // HashMap is required here because Map.of() does not allow null values,
    // and null defaults indicate arguments with no meaningful autocompletion default.
    public Map<String, String> getArgumentDefaults() {

View on GitHub (pinned to 823fada927)