microsoft/playwright · error · Error

Invalid date: ${time}

Error message

Invalid date: ${time}

What it means

Thrown by parseTime() (used by Clock.setSystemTime) when a Date object is passed whose getTime() returns NaN (an invalid Date). Number and string inputs are forwarded without validation; only Date objects are checked via `!isFinite(time.getTime())`.

Source

Thrown at packages/playwright-core/src/client/clock.ts:63

    await this._browserContext._channel.clockRunFor({ ...parseTicks(ticks) }, kNoTimeout);
  }

  async setFixedTime(time: string | number | Date) {
    await this._browserContext._channel.clockSetFixedTime({ ...parseTime(time) }, kNoTimeout);
  }

  async setSystemTime(time: string | number | Date) {
    await this._browserContext._channel.clockSetSystemTime({ ...parseTime(time) }, kNoTimeout);
  }
}

function parseTime(time: string | number | Date): { timeNumber?: number, timeString?: string } {
  if (typeof time === 'number')
    return { timeNumber: time };
  if (typeof time === 'string')
    return { timeString: time };
  if (!isFinite(time.getTime()))
    throw new Error(`Invalid date: ${time}`);
  return { timeNumber: time.getTime() };
}

function parseTicks(ticks: string | number): { ticksNumber?: number, ticksString?: string } {
  return {
    ticksNumber: typeof ticks === 'number' ? ticks : undefined,
    ticksString: typeof ticks === 'string' ? ticks : undefined
  };
}

View on GitHub (pinned to c8fc3bf8d3)

Solutions

  1. Validate the Date before passing: `if (Number.isNaN(d.getTime())) throw ...`.
  2. Pass an epoch number or ISO string instead of a Date object.
  3. Sanitize input strings (e.g. Date.parse check) before constructing the Date.

Example fix

// before
await context.clock.setSystemTime(new Date(maybeBadString));
// after
const d = new Date(maybeBadString);
if (Number.isNaN(d.getTime())) throw new Error('bad date');
await context.clock.setSystemTime(d);
Defensive patterns

Strategy: validation

Validate before calling

function validTimeArg(t: string | number | Date): boolean {
  if (t instanceof Date) return !Number.isNaN(t.getTime());
  return true; // numbers/strings are forwarded to the server
}
if (!validTimeArg(time))
  throw new Error(`Invalid Date passed to clock.setSystemTime: ${time}`);

Type guard

function isValidDate(d: Date): boolean {
  return d instanceof Date && !Number.isNaN(d.getTime());
}

Prevention

When it happens

Trigger: Calling `await context.clock.setSystemTime(new Date('not-a-date'))`, or `setSystemTime(new Date(undefined))`. The Date parses to Invalid Date, getTime() is NaN, isFinite returns false.

Common situations: Parsing user/env-supplied time strings that can be invalid; constructing a Date from bad input and forwarding it without validation; passing a Date from a deserialized source that lost validity.

Related errors


AI-assisted analysis of microsoft/playwright@c8fc3bf8d3 (2026-08-12). Data as JSON: /api/errors/1e1391accd245b92. Report an issue: GitHub.