{"record":{"id":"da38f37489c3b5db","repo":"microsoft/playwright","slug":"invalid-time-str","errorCode":null,"errorMessage":"Invalid time ${str}","messagePattern":"Invalid time (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/playwright-core/src/server/clock.ts","lineNumber":141,"sourceCode":"    return 0;\n  const str = value;\n\n  const strings = str.split(':');\n  const l = strings.length;\n  let i = l;\n  let ms = 0;\n  let parsed;\n\n  if (l > 3 || !/^(\\d\\d:){0,2}\\d\\d?$/.test(str)) {\n    throw new Error(\n        `Clock only understands numbers, 'mm:ss' and 'hh:mm:ss'`,\n    );\n  }\n\n  while (i--) {\n    parsed = parseInt(strings[i], 10);\n    if (parsed >= 60)\n      throw new Error(`Invalid time ${str}`);\n    ms += parsed * Math.pow(60, l - i - 1);\n  }\n\n  return ms * 1000;\n}\n\nfunction parseTime(epoch: string | number | undefined): number {\n  if (!epoch)\n    return 0;\n  const parsed = new Date(epoch);\n  if (!isFinite(parsed.getTime()))\n    throw new Error(`Invalid date: ${epoch}`);\n  return typeof epoch === 'number' ? epoch : parsed.getTime();\n}\n","sourceCodeStart":123,"sourceCodeEnd":156,"githubUrl":"https://github.com/microsoft/playwright/blob/c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6/packages/playwright-core/src/server/clock.ts#L123-L156","documentation":"Thrown by parseLength in clock.ts:141 after the format check passed. Each colon-separated component is parsed with parseInt and rejected when >= 60, so a field that looks like a valid mm/ss but is out of range is rejected as an invalid time.","triggerScenarios":"clock.advance('99:99'); clock.advance('12:75'); any 'mm:ss' / 'hh:mm:ss' where minutes or seconds are 60 or more.","commonSituations":"Off-by-one durations written as 'minutes:seconds' with seconds=60; copy-pasted countdown strings;mis-encoded times.","solutions":["Keep each minute/second component below 60.","Prefer passing total milliseconds as a number to avoid parsing ambiguity.","Validate the components programmatically before calling the clock API."],"exampleFix":"// before\nawait page.clock.advance('01:75');\n// after\nawait page.clock.advance(135 * 1000);","handlingStrategy":"validation","validationCode":"// Each mm/ss component must be < 60.\nfunction assertClockLength(v: string) {\n  const parts = v.split(':');\n  if (parts.some(p => Number(p) >= 60))\n    throw new Error(`Clock component out of range: ${v}`);\n}\nif (typeof input === 'string') assertClockLength(input);\nawait page.clock.advance(input);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Prefer a millisecond number over an mm:ss string to avoid range errors.","When using strings, ensure every minute/second field is below 60.","Validate components programmatically before invoking the clock."],"tags":["clock","validation"],"backgroundTag":null,"analyzedSha":"c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6","analyzedAt":"2026-08-12T07:26:36.950Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}