Repository navigation
Times in the repeated autumn hour show their UTC offset in grids, text and chart CSV exports, in Lite and the Darling viewer - #4855
Merged
Conversation
…s and chart CSV exports (#4766) In a zone where a wall time happens twice (the repeated hour after a fall-back), the two rows that read 01:30 could not be told apart in a grid or in an exported chart file. Grids: both FormatServerTime overloads and the alert row's TimeLocal now append a space and the instant's UTC offset when its wall time is ambiguous, "2026-11-01 01:30:00 -04:00" for 05:30Z and "2026-11-01 01:30:00 -05:00" for 06:30Z on a US Eastern clock. Every other time, and every time in UTC mode, keeps the bare text, and the format string still runs on the current culture. One internal function (FormatInstant) holds the rule for both. Chart CSV: the time cell stays a plain date and time, so a spreadsheet reads the whole column one way. A fourth column, "UTC offset", is added to the header and to every row, from the new DisplayZone.UtcOffsetText ("-04:00", "-05:00", "+00:00" in UTC). The Local-mode tests now word the expected text from the machine's own zone, so they hold on a desktop whose clock repeats an hour at those instants.
…ids and chart CSV exports (#4766)
…an empty pattern, so the member scan reads it whole (#4766)
… grid times show their UTC offset in the repeated autumn hour (#4766)
… grid times show their UTC offset in the repeated autumn hour: keep the source pins and the member scan reading the new shapes (#4766)
…repeated autumn hour (#4766)
…cer range show the UTC offset in the repeated autumn hour, as Lite does (#4766) The viewer's alert row and Manage Servers "Last Collected" word their time through a new ViewerTimeHelper.FormatForDisplay(DateTime, TimeZoneInfo, string), the twin of Lite's FormatInstant, which FormatForDisplay(DateTime, string) now calls with the current zone, so there is one rule. Lite's collection health rows and FinOps application connections, and the viewer's FinOps inventory and application connections, read their own server's clock instead of this machine's or the active tab's. The viewer's notification route Modified column follows the display mode, and the viewer slicer's range caption is worded exactly as Lite's is.
…ne, so the wrapper census reads each body whole (#4766)
…tern, so the member scan reads them whole (#4766)
erikdarlingdata
marked this pull request as ready for review
September 30, 2026 07:09
5 tasks done
erikdarlingdata
added a commit
that referenced
this pull request
Sep 30, 2026
…rling viewer (#4766) (#4858) A grid column that shows a time as text sorted by that text when its header was clicked, so "10/1/2026" came before "9/30/2026". #4855 fixed the columns that show a UTC offset, and the other time columns still sorted as text. Six Postgres time columns in the Darling viewer also showed their raw UTC value in every display mode. - Every time column in both products' grids now sorts by a time. The change covers 16 columns in Lite and 47 in the Darling viewer. A column sorts by the row's UTC instant where the row has one, and otherwise by the row's stored server wall clock. Inside the repeated autumn hour, a column sorted by a stored wall clock can still sort out of order. The stored time does not say which pass it was in. - The viewer's eight System Events grids sort by each event's UTC time, as Lite's already did. - "Never" in Mute Rules Expires and Job History Last Success sorts first in ascending order. - The six viewer Postgres time columns now follow the display mode like the tab's other times, and sort by their UTC instant. They are Lock Stats Last Seen, Wait Sampling Last Seen, Replication Connected Since, Column Stats Captured, and Index Bloat Measured and Estimated. - Tests scan every grid column in both products' XAML and fail when a time column sorts by its text. Follow-up to #4766.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Follows #4766, #4841 and #4848 for the grids, the text lines and the chart CSV export, in Lite and the Darling viewer.
Why
On the day the clocks go back, one wall-clock hour happens twice. #4848 made the charts and time windows keep each exact instant through that hour. But the server tab grids, the alert history rows and the chart CSV export still wrote both occurrences the same way. On a US Eastern server clock, 05:30Z and 06:30Z on 2026-11-01 both read
2026-11-01 01:30:00. A row did not say which of the two it meant.Behavior change
2026-11-01 01:30:00 -04:00and the second reads2026-11-01 01:30:00 -05:00. Every other time reads as before, and UTC mode never changes. A fixed-offset server clock never shows an offset.baseline discontinuity at 2026-11-01 01:30 -04:00 (restart).UTC offset, so a script that checks the column count now sees 4. The first three cells of each row are unchanged. The offset is on every row, not only in the repeated hour, so the whole column reads one way:What changes
PerformanceMonitor.Ui/DisplayZone.cs: newUtcOffsetText, the UTC offset of any instant in a zone (+00:00in UTC).ContextMenuHelperand viewerViewerServerTab.ChartContextMenu: the chart CSV header ends inUTC offset, and each row ends in its instant's offset.ServerTimeHelper.FormatServerTime: grid times take the offset in the repeated hour, through one new method,FormatInstant. The format still uses the current culture. The alert history row, the History windows' summary range, collection health and FinOps rows useFormatInstantwith their own clock.ViewerTimeHelper.FormatForDisplay(new): the twin ofFormatServerTime, with an overload that takes a zone and a nullable overload that returns an empty string. 46 text sites that wroteForDisplay(x).ToString(format)now call it with the same format. Alert rows, Manage Servers, notification routes and the FinOps rows use it too.BaselineDiscontinuities.Sentencetakes an optional offset, and both products pass it for the chart's display zone....Utcmembers. The Lite FinOps tab stamps the selected server's clock on its rows. The viewer usesClockForServerOrMachinefor rows that span servers.SortMemberPathon 72 time columns (36 per product) points at the row's UTC DateTime.DataGridFilterManagerrestores a saved sort by a column'sSortMemberPathwhen it has one.SystemEventRowFormat.StoredWallClock(new, in both products) words a Default Trace time as the plain wall time, and the Default Trace row uses it. The other System Events rows hold real instants and take the offset. The viewer's job history and Agent status texts keep the plain formatter, and their doc comments say why. The wrapper census inConsumedTimestampFrameDisciplineTestslistsStoredWallClockas a plain renderer.Not in this change
Test plan
ChartCsvExportDisplayZoneTests,ViewerContextMenuTests): the two instants of the repeated hour write the same time cell and different offsets. The header ends inUTC offset, every row carries an offset, and UTC rows read+00:00.ServerTimeHelperClockTests,ViewerServerClockTests,AlertHistoryRowClockTests,ViewerAlertRowClockTests): the two instants read01:30 -04:00and01:30 -05:00in server mode, and05:30and06:30in UTC mode. The offset does not depend on the culture, and every other time reads as before.CollectionHealthDisplayZoneTests,FinOpsRowDisplayZoneTests,FinOpsSeenColumnsZoneTests,ViewerFinOpsRowClockTests): the row's server is in a different zone from the active tab's server. The row reads its own server's wall time, not the tab's and not this machine's.HistoryGridZoneTests,BaselineDiscontinuityTests,ViewerSlicerRangeLabelTests,ViewerNotificationRouteDisplayTests,ViewerGridTimeTextZoneTests).GridTimeColumnSortMemberTests,ViewerGridTimeColumnSortMemberTests): each changed column'sSortMemberPathnames aDateTimeon its row type. Two rows at 05:45Z and 06:15Z sort first pass first on the UTC member, and not on the display DateTime or the text.StoredServerClockRowTextTests, both products): a Default Trace event, a job step and a next scheduled run come from stored wall clocks. They print no offset in either pass of the repeated hour. A real instant in the same test still does.ServerTimeHelperClockTests,ViewerServerClockTests): a fixed-offset clock never shows an offset at the instants where a US zone repeats an hour. On a Berlin clock, 2026-10-25 00:30Z and 01:30Z read02:30:00 +02:00and02:30:00 +01:00.TheTwoPointsOfTheRepeatedHour_WriteTheSameTimeCell_AndAreToldApartByTheirOffsets,FormatForDisplay_InServerMode_GivesEachInstantOfTheRepeatedHourItsOwnOffset,CollectionHealthDisplayZoneTests.ServerMode_ARowReadsItsOwnServersWallTime_NotTheActiveTabsOrThisMachines,HistoryGridZoneTests.EachHistoryWindow_WordsItsSummaryRange_ThroughFormatInstant,TheRepeatedHour_SortsFirstPassBeforeSecond_OnTheUtcMember_ButNotOnTheDisplayDateTimeOrTheTextand, with the offset put back on a stored wall-clock row,ADefaultTraceEventReadFromTheStoredWallClock_PrintsNoOffset_InBothPassesOfTheRepeatedHour_WhileARealInstantStillDoesandAJobStepReadFromTheStoredWallClock_PrintsNoOffset_InBothPassesOfTheRepeatedHour_WhileARealInstantStillDoes.CHANGELOG
SECTION: Fixed
ENTRY:
01:30:00 -04:00and01:30:00 -05:00. This holds in Lite and the Darling viewer. Chart CSV exports gain a 4th column,UTC offset, on every row. Time columns that show the offset sort by time. Lite's FinOps First Seen and Last Seen and its collection health times follow the display mode, not this machine's clock.REF:
[Times in the repeated autumn hour show their UTC offset in grids, text and chart CSV exports, in Lite and the Darling viewer #4855]: Times in the repeated autumn hour show their UTC offset in grids, text and chart CSV exports, in Lite and the Darling viewer #4855