Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Why does a cleaned timestamp turn into a date in 1970?

Our cleaned 1700000000 is accepted as a number, but new Date treats it as milliseconds and returns a January 1970 instant. Multiplying a seconds value by 1000 returns November 2023. A value already in milliseconds must not be multiplied again.

Tested October 14, 2026 · v24.19.0 · 4 measured runs

Open the Claude text cleaner · Full measured data

Code-point comparison for Marked seconds

Measured inputs and outputs

These are locally constructed test strings, not evidence that Claude inserts these characters. We executed the saved homepage script snapshot with a minimal DOM harness and compared exact strings. The invisible-checkbox state and dash mode appear in each row. The observations below test this page's specific question. Destination observations run independently on the exact input and cleaned strings in the recorded Node runtime. We make no detector-score or statistical-watermark removal claim.

Before and after observations; full code points and strings are in the JSON download.
Fixture and modeInput string and code pointsOutput and cleaner statusObserved before / after
Marked seconds
direct string / keep / invisible true
"1700000​000"
U+0031 U+0037 U+0030 U+0030 U+0030 U+0030 U+0030 U+200B U+0030 U+0030 U+0030
"1700000000"
Removed 1 invisible character
{"numberLabel":"NaN","finite":false,"asMilliseconds":null,"asSeconds":null}
{"numberLabel":"1700000000","finite":true,"asMilliseconds":"1970-01-20T16:13:20.000Z","asSeconds":"2023-11-14T22:13:20.000Z"}
Seconds reference
direct string / keep / invisible true
"1700000000"
U+0031 U+0037 U+0030 U+0030 U+0030 U+0030 U+0030 U+0030 U+0030 U+0030
"1700000000"
No selected invisible characters found
{"numberLabel":"1700000000","finite":true,"asMilliseconds":"1970-01-20T16:13:20.000Z","asSeconds":"2023-11-14T22:13:20.000Z"}
{"numberLabel":"1700000000","finite":true,"asMilliseconds":"1970-01-20T16:13:20.000Z","asSeconds":"2023-11-14T22:13:20.000Z"}
Milliseconds reference
direct string / keep / invisible true
"1700000000000"
U+0031 U+0037 U+0030 U+0030 U+0030 U+0030 U+0030 U+0030 U+0030 U+0030 U+0030 U+0030 U+0030
"1700000000000"
No selected invisible characters found
{"numberLabel":"1700000000000","finite":true,"asMilliseconds":"2023-11-14T22:13:20.000Z","asSeconds":"+055840-11-08T22:13:20.000Z"}
{"numberLabel":"1700000000000","finite":true,"asMilliseconds":"2023-11-14T22:13:20.000Z","asSeconds":"+055840-11-08T22:13:20.000Z"}
Invalid text
direct string / keep / invisible true
"not-a-time"
U+006E U+006F U+0074 U+002D U+0061 U+002D U+0074 U+0069 U+006D U+0065
"not-a-time"
No selected invisible characters found
{"numberLabel":"NaN","finite":false,"asMilliseconds":null,"asSeconds":null}
{"numberLabel":"NaN","finite":false,"asMilliseconds":null,"asSeconds":null}

Successful numeric conversion does not identify the timestamp unit

The marked digit string converts to NaN before deletion, so both date interpretations are invalid in that row. Cleaning removes the selected U+200B and produces 1700000000. Passing that number directly to Date gives 1970-01-20T16:13:20.000Z. Interpreting the same number as seconds and multiplying it by one thousand gives 2023-11-14T22:13:20.000Z. The unmarked seconds reference behaves identically. Our millisecond reference already produces the November 2023 instant when used directly; multiplying it again produces an extended-year value in year 55840. The invalid-text control remains invalid. These exact ISO strings make the unit disagreement visible without depending on the computer’s display time zone or inventing a date associated with a real user record.

Date-string parsing and numeric construction answer different questions

Our previous ISO guide asks whether a date spelling is accepted by Date.parse. Here the string first passes through Number, and the observer constructs a date from the resulting numeric value. A valid digit sequence and a valid Date instance do not tell us whether the producer meant seconds or milliseconds. The cleaner neither inspects that contract nor multiplies a number. The time-zone-option guide studies a formatter’s accepted configuration; this test reports UTC ISO output and changes only the assumed unit. We do not identify a producer from the digit count, test a server timestamp field or choose a plausible range for a real application. The deliberately far-future control demonstrates wrong scaling even when the runtime can represent the resulting date.

Use the producer’s declared unit before applying a conversion

Read the destination and producer schema, then convert once according to its explicit unit. If the contract specifies epoch seconds, scale that value for this numeric Date constructor; if it specifies milliseconds, retain the numeric value. Avoid guessing solely from a cleaned string or from whether the date looks reasonable. Record the original spelling, converted numeric label and resulting instant when debugging a pasted timestamp. Our downloads reproduce four invented values with exact before and after observations and no real event data. They do not certify a timestamp’s accuracy, infer its source or validate scheduling decisions. After character cleanup, verify both the unit and allowed application range in the actual destination, preserving the source data if a mistaken interpretation needs to be reversed.

Reproduce this test

Save reproduce.cjs and tested-app.js in the same folder. Run the command below with Node.js. The harness prints its runtime, script SHA-256 and every measured row. Compare those rows with the original record. Using a newer script or runtime creates a new experiment; retain the version information with your rerun.

node reproduce.cjs

Reference and next check

ECMAScript numeric Date construction provides the relevant primary definition. The table and fixture analysis are original measurements. For broader inspection, use our Unicode inspector. Read the scope distinction before interpreting cleanup as a watermark result.