{"record":{"id":"5be1f01cad3f4d05","repo":"alibaba/spring-cloud-alibaba","slug":"month-values-must-be-between-1-and-12","errorCode":null,"errorMessage":"Month values must be between 1 and 12","messagePattern":"Month values must be between 1 and 12","errorType":"exception","errorClass":"ParseException","httpStatus":null,"severity":"error","filePath":"spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-schedulerx/src/main/java/com/alibaba/cloud/scheduling/schedulerx/util/CronExpression.java","lineNumber":788,"sourceCode":"\t\t\t\t\t\t-1);\n\t\t\t}\n\t\t}\n\t\telse if (type == HOUR) {\n\t\t\tif ((val < 0 || val > 23 || end > 23) && (val != ALL_SPEC_INT)) {\n\t\t\t\tthrow new ParseException(\n\t\t\t\t\t\t\"Hour values must be between 0 and 23\", -1);\n\t\t\t}\n\t\t}\n\t\telse if (type == DAY_OF_MONTH) {\n\t\t\tif ((val < 1 || val > 31 || end > 31) && (val != ALL_SPEC_INT)\n\t\t\t\t\t&& (val != NO_SPEC_INT)) {\n\t\t\t\tthrow new ParseException(\n\t\t\t\t\t\t\"Day of month values must be between 1 and 31\", -1);\n\t\t\t}\n\t\t}\n\t\telse if (type == MONTH) {\n\t\t\tif ((val < 1 || val > 12 || end > 12) && (val != ALL_SPEC_INT)) {\n\t\t\t\tthrow new ParseException(\n\t\t\t\t\t\t\"Month values must be between 1 and 12\", -1);\n\t\t\t}\n\t\t}\n\t\telse if (type == DAY_OF_WEEK) {\n\t\t\tif ((val == 0 || val > 7 || end > 7) && (val != ALL_SPEC_INT)\n\t\t\t\t\t&& (val != NO_SPEC_INT)) {\n\t\t\t\tthrow new ParseException(\n\t\t\t\t\t\t\"Day-of-Week values must be between 1 and 7\", -1);\n\t\t\t}\n\t\t}\n\n\t\tif ((incr == 0 || incr == -1) && val != ALL_SPEC_INT) {\n\t\t\tif (val != -1) {\n\t\t\t\tset.add(val);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tset.add(NO_SPEC);\n\t\t\t}","sourceCodeStart":770,"sourceCodeEnd":806,"githubUrl":"https://github.com/alibaba/spring-cloud-alibaba/blob/115d5901102009492e05d5ec18c3f79cad4077d0/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-schedulerx/src/main/java/com/alibaba/cloud/scheduling/schedulerx/util/CronExpression.java#L770-L806","documentation":"Thrown in addToSet when a MONTH value (or range end) is outside 1-12, unless it is the ALL_SPEC wildcard sentinel (guard at CronExpression.java:787-790). Months are 1-based (JAN=1 ... DEC=12); note the monthMap stores 0-based internals but parsing expects 1-12 input.","triggerScenarios":"`new CronExpression(\"0 0 0 ? 0 *\")` (month=0), or `0 0 0 ? 13 *` (month=13), or a range like `0 0 0 ? 1-13 *`.","commonSituations":"0-based month assumption (from Java's Calendar/APIs where months are 0-11), an off-by-one, or a field-shift placing a year value into the month field.","solutions":["Use month values 1-12 (JAN=1), e.g. '0' -> '1' or '13' -> '1'.","If sourcing the month from java.util.Calendar, add 1 before formatting (Calendar months are 0-based).","Recount the six fields so the month stays in position 5."],"exampleFix":"// before\nnew CronExpression(\"0 0 0 ? 0 *\");\n// after\nnew CronExpression(\"0 0 0 ? 1 *\"); // January","handlingStrategy":"validation","validationCode":"// Month(field 4) must be 1..12 (ignoring '*').\nstatic boolean monthInRange(String[] fields) {\n    if (fields.length < 5) return false;\n    String f = fields[4];\n    if (f.equals(\"*\")) return true;\n    return inRange(f, 1, 12);\n}\nprivate static boolean inRange(String f, int lo, int hi) {\n    for (String part : f.split(\"[-,/LW#]\")) {\n        if (part.isEmpty()) continue;\n        try { int v = Integer.parseInt(part); if (v < lo || v > hi) return false; }\n        catch (NumberFormatException e) { /* month names handled elsewhere */ }\n    }\n    return true;\n}","typeGuard":null,"tryCatchPattern":"try {\n    CronExpression cron = new CronExpression(raw);\n} catch (ParseException e) {\n    throw new IllegalArgumentException(\"Invalid cron expression: \" + raw, e);\n}","preventionTips":["Months are 1-12 (JAN=1); 0 is invalid.","If sourcing from java.util.Calendar, add 1 (Calendar months are 0-11).","Range-check month values before formatting the cron string."],"tags":["cron","schedulerx","spring-cloud-alibaba","configuration","parsing","validation","range-check"],"backgroundTag":null,"analyzedSha":"115d5901102009492e05d5ec18c3f79cad4077d0","analyzedAt":"2026-08-14T04:47:13.900Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}