{"record":{"id":"56a41233831ad6bd","repo":"angular/components","slug":"invalid-minutes-minutes-minutes-value-must-b","errorCode":null,"errorMessage":"Invalid minutes \"${minutes}\". Minutes value must be between 0 and 59.","messagePattern":"Invalid minutes \"(.+?)\"\\. Minutes value must be between 0 and 59\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/material-date-fns-adapter/adapter/date-fns-adapter.ts","lineNumber":227,"sourceCode":"    return isDate(obj);\n  }\n\n  isValid(date: Date): boolean {\n    return isValid(date);\n  }\n\n  invalid(): Date {\n    return new Date(NaN);\n  }\n\n  override setTime(target: Date, hours: number, minutes: number, seconds: number): Date {\n    if (typeof ngDevMode === 'undefined' || ngDevMode) {\n      if (hours < 0 || hours > 23) {\n        throw Error(`Invalid hours \"${hours}\". Hours value must be between 0 and 23.`);\n      }\n\n      if (minutes < 0 || minutes > 59) {\n        throw Error(`Invalid minutes \"${minutes}\". Minutes value must be between 0 and 59.`);\n      }\n\n      if (seconds < 0 || seconds > 59) {\n        throw Error(`Invalid seconds \"${seconds}\". Seconds value must be between 0 and 59.`);\n      }\n    }\n\n    return set(this.clone(target), {hours, minutes, seconds, milliseconds: 0});\n  }\n\n  override getHours(date: Date): number {\n    return getHours(date);\n  }\n\n  override getMinutes(date: Date): number {\n    return getMinutes(date);\n  }\n","sourceCodeStart":209,"sourceCodeEnd":245,"githubUrl":"https://github.com/angular/components/blob/0411926e7d8ae06b32236ec1048a888cfad5abf2/src/material-date-fns-adapter/adapter/date-fns-adapter.ts#L209-L245","documentation":"DateFnsAdapter.setTime validates the minutes argument (must be 0–59) and throws in dev mode when out of range, preventing silent rollover into the next hour by the native Date.","triggerScenarios":"Calling setTime(target, hours, minutes, seconds) with minutes < 0 or minutes > 59 — e.g. minute arithmetic like minute + 15 = 60, or unvalidated/free-text time input like '90'.","commonSituations":"Duration math (minutes sum > 59) passed straight to setTime; parsing 'HH:mm' strings without range checks; typo'd constants (e.g. 60 instead of 59 as a max).","solutions":["Use addCalendarMinutes for arithmetic exceeding 59 rather than setTime.","Validate/parse time strings and reject out-of-range components before calling.","Clamp or wrap minute values ((minute % 60) with carry into hours) when appropriate."],"exampleFix":"// before\nthis.adapter.setTime(target, 10, 60, 0); // throws\n// after\nthis.adapter.setTime(this.adapter.addCalendarMinutes(target, 60), 0, 0, 0); // or wrap to 11:00","handlingStrategy":"validation","validationCode":"if (!Number.isInteger(minutes) || minutes < 0 || minutes > 59) {\n  throw new RangeError(`minutes must be 0-59, got ${minutes}`);\n}\nconst d = adapter.setTime(target, hours, minutes, seconds);","typeGuard":"function isValidMinute(m: unknown): m is number {\n  return typeof m === 'number' && Number.isInteger(m) && m >= 0 && m <= 59;\n}","tryCatchPattern":"try {\n  return this.adapter.setTime(t, h, m, s);\n} catch (e) {\n  if ((e as Error).message.startsWith('Invalid minutes')) {\n    return this.adapter.setTime(t, h, Math.min(Math.max(m, 0), 59), s);\n  }\n  throw e;\n}","preventionTips":["Use addCalendarMinutes for arithmetic that can exceed 59","Parse 'HH:mm' strings with range validation (0-23, 0-59)","Clamp free-text minute inputs before use","Keep duration math and clock-time setting in separate helpers"],"tags":["date","time","validation","material","date-fns","dev-mode"],"backgroundTag":"invalid-time-component","analyzedSha":"0411926e7d8ae06b32236ec1048a888cfad5abf2","analyzedAt":"2026-08-31T11:58:23.400Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}