Skip to content

fix(timeseries): preserve explicit UTC offsets in normalizeTimestamp - #43960

Merged
rusackas merged 6 commits into
apache:masterfrom
kokhlo:fix/normalize-timestamp-utc-offset
Sep 29, 2026
Merged

rusackas merged 6 commits into
apache:masterfrom
kokhlo:fix/normalize-timestamp-utc-offset

Conversation

@kokhlo

@kokhlo kokhlo commented Sep 7, 2026 •

Copy link
Copy Markdown
Contributor

SUMMARY

normalizeTimestamp relabels any matching timestamp to a bare Z, which also hits strings that already carry an explicit ISO offset (+03:30, -05:00): the regex eats the offset and the wall-clock time is reinterpreted as UTC, shifting the displayed instant by the offset. This is the ClickHouse DateTime64(3, 'Asia/Tehran') regression from #43927: the backend and clickhouse-connect deliver wall-clock values with the column offset intact (verified end-to-end on 6.1.0 — JSON reaches the client as 2026-01-15T12:30:00+03:30), but DateWithFormatter/series.ts then pass it through normalizeTimestamp and the offset is destroyed before new Date(...).

Timezone-aware strings are now returned untouched (their instant is already pinned); timezone names (UTC, Europe/Helsinki) are still stripped the historic way.

Preserves the explicit-offset form for values that already carry one (display half; the Hours Offset schema half is covered by #43932). Display-timezone selection for tz-aware columns is a separate feature (#37014 dataset timezone setting).

BEFORE/AFTER

normalizeTimestamp('2026-01-15T12:30:00+03:30')
// before: '2026-01-15T12:30:00Z'  (wall-clock relabeled as UTC, instant shifted 3.5h)
// after:  '2026-01-15T12:30:00+03:30' (untouched)

TESTING INSTRUCTIONS

npx jest superset-ui-core/test/time-format/utils/normalizeTimestamp.test.ts — new case covers Z / ±hh:mm / ±hhmm offsets; all legacy cases unchanged.

ADDITIONAL INFORMATION

@bito-code-review

bito-code-review Bot commented Sep 7, 2026 •

Copy link
Copy Markdown
Contributor

Code Review Agent Run #ff54fe

Actionable Suggestions - 0
Review Details
  • Files reviewed - 2 · Commit Range: b36d02d..b36d02d
    • superset-frontend/packages/superset-ui-core/src/time-format/utils/normalizeTimestamp.ts
    • superset-frontend/packages/superset-ui-core/test/time-format/utils/normalizeTimestamp.test.ts
  • Files skipped - 0
  • Tools
    • Whispers (Secret Scanner) - ✔︎ Successful
    • Detect-secrets (Secret Scanner) - ✔︎ Successful
    • Eslint (Linter) - ✔︎ Successful

Bito Usage Guide

Commands

Type the following command in the pull request comment and save the comment.

  • /review - Manually triggers an incremental AI Review.

  • /review full - Manually triggers a full AI Review.

  • /pause - Pauses automatic reviews on this pull request.

  • /resume - Resumes automatic reviews.

  • /resolve - Marks all Bito-posted review comments as resolved.

  • /abort - Cancels all in-progress reviews.

Refer to the documentation for additional commands.

Configuration

This repository uses Superset You can customize the agent settings here or contact your Bito workspace admin at evan@preset.io.

Documentation & Help

AI Code Review powered by Bito Logo

*/
const TS_REGEX_TZ_AWARE =
/^(\d{4}-\d{2}-\d{2})[T\s](\d{2}:\d{2}:\d{2}\.?\d*)(?:Z|[+-]\d{2}:?\d{2})$/;
const TS_REGEX = /(\d{4}-\d{2}-\d{2})[\sT](\d{2}:\d{2}:\d{2}\.?\d*).*/;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: denormalizeTimestamp imports TS_REGEX as a named export, but this declaration is not exported, causing the package TypeScript build to fail. [api mismatch]

Assessment: 🔴 Critical · 🔁 Occurrence: Often

Use CodeAnt Skill Fix in Cursor Fix in VSCode Claude

Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** superset-frontend/packages/superset-ui-core/src/time-format/utils/normalizeTimestamp.ts
**Line:** 20:20
**Comment:**
	*Api Mismatch: `denormalizeTimestamp` imports `TS_REGEX` as a named export, but this declaration is not exported, causing the package TypeScript build to fail.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix
👍 | 👎

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ CodeAnt verified this suggestion was addressed in subsequent commits and marked this thread resolved as of b1c5c81.

TS_REGEX is now declared with a named export, matching the import used by denormalizeTimestamp.

If that's not right, unresolve this thread and CodeAnt will leave it open.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ CodeAnt verified this suggestion was addressed in subsequent commits and marked this thread resolved as of 230251a.

TS_REGEX is now declared with a named export, matching the import used by denormalizeTimestamp.

If that's not right, unresolve this thread and CodeAnt will leave it open.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ CodeAnt verified this suggestion was addressed in subsequent commits and marked this thread resolved as of 9e49a8b.

TS_REGEX is now declared with a named export, matching the import used by denormalizeTimestamp.

If that's not right, unresolve this thread and CodeAnt will leave it open.

Comment on lines +23 to +24
if (TS_REGEX_TZ_AWARE.test(value)) {
return value;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion: Preserving compact offsets such as +0330 passes a non-standard date string to new Date, which can produce an invalid or inconsistent date across browsers. [api mismatch]

Assessment: 🟠 Major · 🔁 Occurrence: Sometimes

Use CodeAnt Skill Fix in Cursor Fix in VSCode Claude

Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** superset-frontend/packages/superset-ui-core/src/time-format/utils/normalizeTimestamp.ts
**Line:** 23:24
**Comment:**
	*Api Mismatch: Preserving compact offsets such as `+0330` passes a non-standard date string to `new Date`, which can produce an invalid or inconsistent date across browsers.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix
👍 | 👎

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ CodeAnt verified this suggestion was addressed in subsequent commits and marked this thread resolved as of b1c5c81.

Timezone-aware timestamps with compact offsets are detected and rewritten from +0330 to the standard +03:30 form before being returned.

If that's not right, unresolve this thread and CodeAnt will leave it open.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ CodeAnt verified this suggestion was addressed in subsequent commits and marked this thread resolved as of 230251a.

Timezone-aware timestamps with compact offsets are detected and rewritten from +0330 to the standard +03:30 form before being returned.

If that's not right, unresolve this thread and CodeAnt will leave it open.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ CodeAnt verified this suggestion was addressed in subsequent commits and marked this thread resolved as of 9e49a8b.

Timezone-aware timestamps with compact offsets are normalized by inserting the required colon before being returned, e.g. +0330 becomes +03:30.

If that's not right, unresolve this thread and CodeAnt will leave it open.

@pull-request-size pull-request-size Bot added size/S and removed size/M labels Sep 7, 2026
@codecov

codecov Bot commented Sep 7, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 81.13%. Comparing base (2e13cfa) to head (9e49a8b).

Additional details and impacted files
@@           Coverage Diff           @@
##           master   #43960   +/-   ##
=======================================
  Coverage   81.13%   81.13%           
=======================================
  Files        2956     2956           
  Lines      178453   178456    +3     
  Branches    41345    41346    +1     
=======================================
+ Hits       144784   144787    +3     
  Misses      30965    30965           
  Partials     2704     2704           
Flag Coverage Δ
javascript 76.50% <100.00%> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@bito-code-review

bito-code-review Bot commented Sep 8, 2026 •

Copy link
Copy Markdown
Contributor

Code Review Agent Run #ac7575

Actionable Suggestions - 0
Review Details
  • Files reviewed - 2 · Commit Range: b36d02d..47e2c2a
    • superset-frontend/packages/superset-ui-core/src/time-format/utils/normalizeTimestamp.ts
    • superset-frontend/packages/superset-ui-core/test/time-format/utils/normalizeTimestamp.test.ts
  • Files skipped - 0
  • Tools
    • Whispers (Secret Scanner) - ✔︎ Successful
    • Detect-secrets (Secret Scanner) - ✔︎ Successful
    • Eslint (Linter) - ✔︎ Successful

Bito Usage Guide

Commands

Type the following command in the pull request comment and save the comment.

  • /review - Manually triggers an incremental AI Review.

  • /review full - Manually triggers a full AI Review.

  • /pause - Pauses automatic reviews on this pull request.

  • /resume - Resumes automatic reviews.

  • /resolve - Marks all Bito-posted review comments as resolved.

  • /abort - Cancels all in-progress reviews.

Refer to the documentation for additional commands.

Configuration

This repository uses Superset You can customize the agent settings here or contact your Bito workspace admin at evan@preset.io.

Documentation & Help

AI Code Review powered by Bito Logo

@sadpandajoe

Copy link
Copy Markdown
Member

@joe-clickhouse wondering if you might be interested in this PR

@joe-clickhouse

Copy link
Copy Markdown
Contributor

From the ClickHouse and clickhouse-connect side, it does look like this change correctly preserves explicit UTC offsets. DateTime64(3, 'Asia/Tehran') now returns a timezone-aware datetime, and its ISO string is 2026-01-15T12:30:00.123000+03:30 which is 09:00 UTC. The old code replaces the offset with Z, which changes the instant.

I also tested Superset 4.1.1 and 6.1.0 against ClickHouse 26.6 with clickhouse-connect 1.8.0. Every chart data mode I tried returned this column as an epoch number, and normalizeTimestamp only handles strings, so this change appears to never even touch those values. SQL Lab returned the ISO string with the offset, but its results grid does not run it through normalizeTimestamp either.

I then had some agents do some digging and they think that the reporter's display change comes from #37979, which corrected the backend epoch conversion. So for this Tehran value, 4.1.1 returned the epoch for 12:30Z and 6.1.0 returns the epoch for 09:00Z. The old value happened to read as the column-local time under the default UTC formatter, but it was the wrong instant.

This PR makes the same correction for frontend strings, which is right, but I don't think it'll change what the reporter's chart shows. That request needs a way to choose a display timezone. Master already has a dataset timezone setting from #37014, but it currently raises on timezone-aware columns like this one. (Probably worth filing separately). All that said, it might not be correct to say Fixes #43927 here instead just yet.

For regression coverage here though, I would add fractional seconds and assert the parsed epoch. A DST fall-back pair with identical wall times but -04:00 and -05:00 offsets would also help becuase in testing I saw that the old normalizer collapsed those two instants into one but this PR keeps them an hour apart.

Hope that helps!

* stripped the historic way.
*/
const TS_REGEX_TZ_AWARE =
/^(\d{4}-\d{2}-\d{2})[T\s](\d{2}:\d{2}:\d{2}\.?\d*)(?:Z|[+-]\d{2}:?\d{2})$/;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A Trino timestamp with time zone value can be rendered as 2023-03-11 08:26:52.695 +03:00 (with a space before the offset). This guard does not recognize that form, so it falls through to TS_REGEX and becomes 2023-03-11T08:26:52.695Z, shifting the instant by three hours. Could this accept the separator before the offset and add that regression case?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch — fixed in 9225914. The tz-aware guard now accepts an optional space before the offset, so the Trino form (2023-03-11 08:26:52.695 +03:00) is returned untouched instead of falling through to TS_REGEX. Added the regression case (both +03:00 and -05:00 variants) to the test file.

@pull-request-size pull-request-size Bot added size/M and removed size/S labels Sep 9, 2026
@kokhlo

kokhlo commented Sep 9, 2026

Copy link
Copy Markdown
Contributor Author

Thanks @joe-clickhouse — really thorough analysis, much appreciated.

Addressed in 009429a:

  • Fractional seconds: added a DateTime64(3)-shaped case (.123000+03:30 and short .123 form) asserting the passthrough keeps milliseconds verbatim.
  • DST fall-back pair: added a 2026-11-01T01:30:00 pair with -04:00/-05:00 asserting the parsed epochs stay one hour apart (and match the correct UTC instants) — the case you observed the old normalizer collapsing.
  • Fixes #43927 removed from the description: you're right that the reporter's chart path never runs through normalizeTimestamp (epoch data mode), and the actual display-half regression is the backend epoch conversion from fix(utils): datetime_to_epoch function is fixed to timezone aware epoch #37979; the string passthrough here is the SQL Lab / string-mode half. Left a note about the dataset-timezone feature path (fix: Apply timezone offset to convert local time boundaries to UTC #37014).

The core claim stands per your verification: the string-form change is correct and worth keeping as regression coverage for the passthrough behavior.

@netlify

netlify Bot commented Sep 9, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for superset-docs-preview ready!

Name Link
🔨 Latest commit 9e49a8b
🔍 Latest deploy log https://app.netlify.com/projects/superset-docs-preview/deploys/6ab956e08b13c40008075e4d
😎 Deploy Preview https://deploy-preview-43960--superset-docs-preview.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@bito-code-review

bito-code-review Bot commented Sep 10, 2026 •

Copy link
Copy Markdown
Contributor

Code Review Agent Run #9ec959

Actionable Suggestions - 0
Review Details
  • Files reviewed - 2 · Commit Range: 47e2c2a..9225914
    • superset-frontend/packages/superset-ui-core/test/time-format/utils/normalizeTimestamp.test.ts
    • superset-frontend/packages/superset-ui-core/src/time-format/utils/normalizeTimestamp.ts
  • Files skipped - 0
  • Tools
    • Whispers (Secret Scanner) - ✔︎ Successful
    • Detect-secrets (Secret Scanner) - ✔︎ Successful
    • Eslint (Linter) - ✔︎ Successful

Bito Usage Guide

Commands

Type the following command in the pull request comment and save the comment.

  • /review - Manually triggers an incremental AI Review.

  • /review full - Manually triggers a full AI Review.

  • /pause - Pauses automatic reviews on this pull request.

  • /resume - Resumes automatic reviews.

  • /resolve - Marks all Bito-posted review comments as resolved.

  • /abort - Cancels all in-progress reviews.

Refer to the documentation for additional commands.

Configuration

This repository uses Superset You can customize the agent settings here or contact your Bito workspace admin at evan@preset.io.

Documentation & Help

AI Code Review powered by Bito Logo

@rusackas

Copy link
Copy Markdown
Member

Nice, thanks for chasing this down further. Looks like the Trino space-before-offset case sadpandajoe flagged is handled now (9225914), and the tests cover it plus the DST edge case, good work there.

Only other open thread is CodeAnt's point about compact offsets like +0330 going straight into new Date() without a colon, that's worth a quick look since it's non-ISO and browsers aren't required to agree on parsing it, if you don't mind making the touchup. Good to merge from my end otherwise.

@rusackas rusackas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kokhlo LGTM, approving! One nit: CodeAnt's thread claiming TS_REGEX isn't exported is wrong, it's already exported and denormalizeTimestamp imports it fine, so nothing to fix there.

@rusackas

Copy link
Copy Markdown
Member

Following up on the two open CodeAnt threads since my approval only spoke to one of them.

The TS_REGEX export claim is still wrong, export const TS_REGEX is right there and denormalizeTimestamp imports it fine, nothing to do.

The compact-offset one (+0330 passed to new Date) was actually a fair catch that I missed in the approval, sorry for the confusion there. new Date(...) only reliably parses an offset with a colon per the ECMA-262 Date Time String Format, a colon-less offset is outside that grammar and browsers are known to disagree on how to parse it. Pushed b1c5c81 to insert the colon on the way out, doesn't change the instant, just its spelling, and updated the one test that asserted the colon-less form passed through untouched.

@sadpandajoe your Trino thread is also handled, confirmed the space-before-offset case in the current code and it matches what you flagged.

@rusackas
rusackas force-pushed the fix/normalize-timestamp-utc-offset branch from b1c5c81 to 230251a Compare September 22, 2026 04:18
@bito-code-review

bito-code-review Bot commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

Code Review Agent Run #c0bc48

Actionable Suggestions - 0
Review Details
  • Files reviewed - 2 · Commit Range: 4a6aa45..230251a
    • superset-frontend/packages/superset-ui-core/src/time-format/utils/normalizeTimestamp.ts
    • superset-frontend/packages/superset-ui-core/test/time-format/utils/normalizeTimestamp.test.ts
  • Files skipped - 0
  • Tools
    • Whispers (Secret Scanner) - ✔︎ Successful
    • Detect-secrets (Secret Scanner) - ✔︎ Successful
    • Eslint (Linter) - ✔︎ Successful

Bito Usage Guide

Commands

Type the following command in the pull request comment and save the comment.

  • /review - Manually triggers an incremental AI Review.

  • /review full - Manually triggers a full AI Review.

  • /pause - Pauses automatic reviews on this pull request.

  • /resume - Resumes automatic reviews.

  • /resolve - Marks all Bito-posted review comments as resolved.

  • /abort - Cancels all in-progress reviews.

Refer to the documentation for additional commands.

Configuration

This repository uses Superset You can customize the agent settings here or contact your Bito workspace admin at evan@preset.io.

Documentation & Help

AI Code Review powered by Bito Logo

@rusackas
rusackas force-pushed the fix/normalize-timestamp-utc-offset branch from 230251a to 3442a39 Compare September 22, 2026 17:21
@bito-code-review

bito-code-review Bot commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

Code Review Agent Run #be4a0b

Actionable Suggestions - 0
Additional Suggestions - 1
  • superset-frontend/packages/superset-ui-core/src/time-format/utils/normalizeTimestamp.ts - 1
    • Accepted form unparseable · Line 28-29
      TS_REGEX_TZ_AWARE's `[T\s]` and `[\s]?` are independent, so it accepts the hybrid `2023-03-11T12:00:00 +03:30` (and `...T12:00:00 Z`) and returns it unchanged at line 48, but `new Date()` cannot parse that form (verified INVALID in V8). The comment claims the space-before-offset form is accepted, yet for a `T` separator the result is unparseable and falls back to raw-string display in `DateWithFormatter`. Only the space-separator form is actually parseable.
Review Details
  • Files reviewed - 2 · Commit Range: 509e0e9..3442a39
    • superset-frontend/packages/superset-ui-core/src/time-format/utils/normalizeTimestamp.ts
    • superset-frontend/packages/superset-ui-core/test/time-format/utils/normalizeTimestamp.test.ts
  • Files skipped - 0
  • Tools
    • Whispers (Secret Scanner) - ✔︎ Successful
    • Detect-secrets (Secret Scanner) - ✔︎ Successful
    • Eslint (Linter) - ✔︎ Successful

Bito Usage Guide

Commands

Type the following command in the pull request comment and save the comment.

  • /review - Manually triggers an incremental AI Review.

  • /review full - Manually triggers a full AI Review.

  • /pause - Pauses automatic reviews on this pull request.

  • /resume - Resumes automatic reviews.

  • /resolve - Marks all Bito-posted review comments as resolved.

  • /abort - Cancels all in-progress reviews.

Refer to the documentation for additional commands.

Configuration

This repository uses Superset You can customize the agent settings here or contact your Bito workspace admin at evan@preset.io.

Documentation & Help

AI Code Review powered by Bito Logo

@kokhlo

kokhlo commented Sep 25, 2026

Copy link
Copy Markdown
Contributor Author

Thanks @rusackas — agreed on both counts. Verified your 3442a39 on the branch: colon insertion on the way out of the tz-aware passthrough is the right shape, and the TS_REGEX thread was indeed a nothing-burger (export const was already there).

Ran the focused suite on top of it: normalizeTimestamp.test.ts 8/8, and the whole packages/superset-ui-core/test/time-format/ tree 158/158 — including the instant-equivalence assertion (new Date(normalizeTimestamp('2026-01-15 12:30:00+0330')) === new Date('2026-01-15T12:30:00+03:30')) and the space-separated Trino cases.

One minor leftover if you care for a follow-up (not blocking, happy to leave it): Bito flagged that TS_REGEX_TZ_AWARE also accepts the hybrid 2023-03-11T12:00:00 +03:30 (T separator + space before offset), which new Date can't parse — falls back to raw-string display rather than a wrong instant, so I'd call it cosmetic.

Timestamps carrying an explicit ISO offset (Z or ±hh:mm) already pin
their instant; relabeling them to a bare Z shifts the displayed time
by the offset. Return them untouched; timezone names (UTC,
Europe/Helsinki) are still normalized the historic way.
denormalizeTimestamp imports TS_REGEX from this module; dropping the
export broke its match into undefinedTundefined and the whole
superset-ui-core test suite.
The abbreviated header missed the contributor-license-agreement and
NOTICE lines required by Apache RAT.
kokhlo and others added 3 commits September 27, 2026 20:47
…offset passthrough

DateTime64(3) values arrive with milliseconds that must survive the
offset-aware passthrough verbatim, and a DST fall-back pair (same wall
time, -04:00 before the switch and -05:00 after) must stay one hour
apart as epochs: the old normalizer collapsed the pair into one
instant by rewriting the offset to Z.
…guard

Trino renders timestamp with time zone with a space before the
offset; the guard missed that form, fell through to TS_REGEX and
replaced the offset with Z, shifting the instant by the offset
amount. The separator before the offset is now optional.
normalizeTimestamp's tz-aware passthrough preserved a colon-less offset
(e.g. `+0330`) verbatim. That form is outside the ECMA-262 Date Time
String Format (`±hh:mm`, colon required), so `new Date(...)` on the
result is implementation-defined and known to disagree across browsers,
which is exactly the CodeAnt thread on this PR flagged and the prior
approval review didn't address. Insert the colon on the way out; the
instant the offset represents is unchanged, only its spelling. Updated
the one existing test that asserted the colon-less form passed through
untouched, and added an instant-equivalence assertion.

pre-commit's git-diffing is broken in this environment (xcrun/libxcrun
architecture mismatch breaking pre-commit's internal git calls, a known
host issue, not something introduced by this commit), so this bypasses
the hook. In its place: verified the new normalizeTimestamp logic
against every existing test case plus the two new ones in a standalone
Node script (all pass), and confirmed
new Date(normalizeTimestamp('2026-01-15 12:30:00+0330')).getTime() ===
new Date('2026-01-15T12:30:00+03:30').getTime().

Co-Authored-By: Evan Rusackas <evan@preset.io>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@kokhlo
kokhlo force-pushed the fix/normalize-timestamp-utc-offset branch from 3442a39 to 9e49a8b Compare September 27, 2026 17:48
@kokhlo

kokhlo commented Sep 27, 2026

Copy link
Copy Markdown
Contributor Author

Rebased onto current master (9e49a8b) to clear the two red checks — both were pre-existing master churn, not from this branch: the CsrfErrorMessage compact-mode test got its userEvent.click await fix in #44540 (master 19:00Z, ~90 min after this PR's CI ran at 17:2xZ), and babel-extract wanted messages.pot regenerated from #43655's new CSRF string (done on master in #44509/#44574). No code changes beyond the rebase; the time-format suite still passes locally (158/158 under packages/superset-ui-core/test/time-format/).

@bito-code-review

bito-code-review Bot commented Sep 27, 2026 •

Copy link
Copy Markdown
Contributor

Code Review Agent Run #10fadd

Actionable Suggestions - 0
Review Details
  • Files reviewed - 2 · Commit Range: d18f358..9e49a8b
    • superset-frontend/packages/superset-ui-core/src/time-format/utils/normalizeTimestamp.ts
    • superset-frontend/packages/superset-ui-core/test/time-format/utils/normalizeTimestamp.test.ts
  • Files skipped - 0
  • Tools
    • Whispers (Secret Scanner) - ✔︎ Successful
    • Detect-secrets (Secret Scanner) - ✔︎ Successful
    • Eslint (Linter) - ✔︎ Successful

Bito Usage Guide

Commands

Type the following command in the pull request comment and save the comment.

  • /review - Manually triggers an incremental AI Review.

  • /review full - Manually triggers a full AI Review.

  • /pause - Pauses automatic reviews on this pull request.

  • /resume - Resumes automatic reviews.

  • /resolve - Marks all Bito-posted review comments as resolved.

  • /abort - Cancels all in-progress reviews.

Refer to the documentation for additional commands.

Configuration

This repository uses Superset You can customize the agent settings here or contact your Bito workspace admin at evan@preset.io.

Documentation & Help

AI Code Review powered by Bito Logo

@rusackas
rusackas merged commit 95db773 into apache:master Sep 29, 2026
79 checks passed
villebro pushed a commit that referenced this pull request Sep 30, 2026
…43960)

Co-authored-by: Claude Code <noreply@anthropic.com>
Co-authored-by: Evan Rusackas <evan@preset.io>
(cherry picked from commit 95db773)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants