{"record":{"id":"2163f86b333ffdad","repo":"microsoft/playwright","slug":"clock-only-understands-numbers-mm-ss-and-hh-mm","errorCode":null,"errorMessage":"Clock only understands numbers, 'mm:ss' and 'hh:mm:ss'","messagePattern":"Clock only understands numbers, 'mm:ss' and 'hh:mm:ss'","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/playwright-core/src/server/clock.ts","lineNumber":133,"sourceCode":" * Parse strings like '01:10:00' (meaning 1 hour, 10 minutes, 0 seconds) into\n * number of milliseconds. This is used to support human-readable strings passed\n * to clock.tick()\n */\nfunction parseTicks(value: number | string): number {\n  if (typeof value === 'number')\n    return value;\n  if (!value)\n    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);","sourceCodeStart":115,"sourceCodeEnd":151,"githubUrl":"https://github.com/microsoft/playwright/blob/c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6/packages/playwright-core/src/server/clock.ts#L115-L151","documentation":"Thrown by parseLength in clock.ts:133. The synthetic clock's length parser accepts only numbers, or strings matching mm:ss / hh:mm:ss; anything else (more than three colon segments, non-digit characters, units like '1h', malformed strings) is rejected.","triggerScenarios":"clock.advance('1h30m'); clock.advance('1:2:3:4'); clock.setFixedTime('noon'); clock.advance('90sec').","commonSituations":"Mixing unit strings from libraries (moment/dayjs durations); passing human-readable times; passing ISO 8601 durations.","solutions":["Pass a number of milliseconds, or an 'mm:ss' / 'hh:mm:ss' string.","Convert durations up front: 90*60*1000 for 90 minutes.","For absolute install times use Date.now() or an ISO string parsed by setFixedTime."],"exampleFix":"// before\nawait page.clock.advance('1h30m');\n// after\nawait page.clock.advance(90 * 60 * 1000);","handlingStrategy":"validation","validationCode":"// Accept ms, 'mm:ss', or 'hh:mm:ss' only.\nfunction toClockLength(v: number | string): number | string {\n  if (typeof v === 'number') return v;\n  if (/^(\\d\\d:){0,2}\\d\\d?$/.test(v)) return v;\n  throw new Error(`Clock length must be a number or mm:ss / hh:mm:ss, got: ${v}`);\n}\nawait page.clock.advance(toClockLength(input));","typeGuard":"function isClockLength(v: unknown): v is number | string {\n  if (typeof v === 'number') return true;\n  if (typeof v !== 'string') return false;\n  return /^(\\d\\d:){0,2}\\d\\d?$/.test(v);\n}","tryCatchPattern":null,"preventionTips":["Pass milliseconds as a plain number to avoid format ambiguity.","Avoid unit strings ('1h', '90s') from date libraries — convert first.","If you must use a string, restrict to mm:ss or hh:mm:ss with two-digit fields."],"tags":["clock","validation"],"backgroundTag":null,"analyzedSha":"c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6","analyzedAt":"2026-08-12T07:26:36.950Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}