ToolFlowKit
Data / practical guide

CSV Dates and Timezones: Keep Reporting Days from Shifting

A renewal date moves back a day after import, or two weekly reports disagree because their cutoffs use different timezones. Decide whether the field represents a day or an instant before converting it. Keep the source value and the intended reporting boundary together.

Store calendar dates as dates and event moments as timestamps with a known timezone or offset. Convert reporting boundaries deliberately, then verify edge cases instead of applying an unexplained fixed-hour correction.

In this guide
  1. What belongs in a date-normalization record?
  2. Compare reports after their boundaries match
  3. A day and an instant need different treatment
  4. Name what the date field actually means
  5. Ask for an ambiguity audit before a conversion
  6. Keep a readable date contract in the handoff

What belongs in a date-normalization record?

The rows illustrate three different data contracts. A date-only field must not become the previous day because a formatter treated it as UTC midnight. For the timestamp row, retain the original instant and named zone with the display value. For the ambiguous slash date, ask the source owner rather than choosing the format that happens to parse.

  1. Inventory each date column with its meaning, source format, timezone or offset, and the report that uses it.
  2. Keep the original string and add a separate interpreted field during testing.
  3. Parse date-only and timestamp fields under their own rules. Leave ambiguous formats unresolved rather than guessing day/month order.
  4. Convert event moments to the selected reporting timezone before assigning them to days or weeks.
  5. Check values near midnight and any daylight-saving transition relevant to the dataset.
  6. Record the date range, timezone, completeness status, and extraction time with the report before comparing totals.
What belongs in a date-normalization record (practice)
Source valueKnown meaningNormalized result
2026-10-20Calendar date only2026-10-20; do not shift by timezone
2026-10-20T00:30:00ZUTC instant2026-10-19 17:30 in America/Los_Angeles
03/04/2026Locale not suppliedHold for month/day convention

Compare reports after their boundaries match

Two exports can use the same printed date range while including different event moments. Confirm source timezone, selected filters, and whether the final day is complete. Preserve unknown or unavailable periods rather than making them look like zero activity.

A reported change in sales or sessions becomes easier to interpret after those boundaries are fixed. Keep this calibration separate from commentary about why the business changed. The same discipline applies when a daily figure arrives late and is later revised.

A day and an instant need different treatment

A fixed adjustment can appear to repair one row and break another when the source convention or seasonal offset differs. Diagnose the meaning and conversion step that produced the discrepancy before changing data.

Original teaching examples
SourceMeaningReview action
2026-10-20Calendar renewal dayKeep the calendar day without a timezone conversion.
2026-10-20T01:00:00ZAn event instant in UTCAssign to a reporting day after conversion to the selected timezone.
04/05/2026Source convention unknownAsk whether day or month comes first before parsing.

Name what the date field actually means

A contract renewal day, a warehouse dispatch timestamp, and a report's last complete day are different data concepts. A date-only value such as 2026-10-20 does not inherently mean midnight in a chosen timezone. A timestamp describes an instant only when its offset or source timezone is known.

Grist distinguishes Date and DateTime fields. Use that distinction as a design prompt for any table or spreadsheet: preserve the business meaning instead of letting an importer choose it from the characters alone. Keep ambiguous source formats as text until the source convention is confirmed.

Ask for an ambiguity audit before a conversion

Reusable structure
Audit these date fields before conversion.
FIELD MEANINGS: [calendar day or event moment]
SOURCE FORMATS AND TIMEZONES: [known values or unknown]
REPORTING TIMEZONE AND WINDOW: [state]
SAMPLE VALUES: [include boundary cases]

Identify ambiguous formats, missing offsets, date-only fields at risk of unwanted conversion, and incomplete reporting days. Propose interpretation rules and questions. Preserve source strings. Return a conversion plan and test cases; do not guess an unknown timezone or modify the source file.

Keep a readable date contract in the handoff

Document the field meaning, conversion rule, and boundary examples beside the output. A colleague should be able to explain why a source timestamp belongs to a reporting day without reverse-engineering a formula from the final spreadsheet.

References