{"id":13160,"date":"2026-09-26T07:35:00","date_gmt":"2026-09-26T05:35:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=13160"},"modified":"2026-10-26T13:32:49","modified_gmt":"2026-10-26T12:32:49","slug":"tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\/","title":{"rendered":"Tutorial: The Five Timestamp Formats in a Tracking Stack and How to Convert Between Them"},"content":{"rendered":"<p>A tracking event can appear as Unix seconds, milliseconds, microseconds or text with a UTC offset. An offset states the difference from UTC; +02:00 means two hours ahead. At 12:00 UTC, a clock with the +02:00 offset shows 14:00. Reports also store calendar dates. Reliable conversion requires three facts: the unit, the meaning of the field and the intended time zone.<\/p>\n<p>Browser time, container start, event time and receipt time do not automatically describe the same instant. Comparing numbers only makes sense after comparing those meanings. Digit count provides a clue, not a field definition.<\/p>\n<figure class=\"lw-diagram\"><img src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/dia-13160-review-20261024.png\" width=\"1120\" height=\"580\" loading=\"lazy\" decoding=\"async\" alt=\"Timestamp conversion: unit, meaning, time zone\"><figcaption>Explicit units identify the numeric representation. Time-zone rules determine local day boundaries; field semantics remain a separate question.<\/figcaption><\/figure>\n<h2>1. Five common representations<\/h2>\n<p>The examples below refer to <code>2026-09-26T23:30:00Z<\/code>, which is 01:30 on 27 September 2026 in Berlin. Only the first three formats count units from the Unix epoch, 1 January 1970 at 00:00 UTC. ISO notation expresses calendar fields; a date alone does not identify an instant.<\/p>\n<table><thead><tr><th>Representation<\/th><th>Example<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>Seconds<\/td><td>1790465400<\/td><td>Unix seconds; for example Meta event_time<\/td><\/tr><tr><td>Milliseconds<\/td><td>1790465400000<\/td><td>Unix milliseconds; for example Date.now()<\/td><\/tr><tr><td>Microseconds<\/td><td>1790465400000000<\/td><td>Unix microseconds; for example GA4 event_timestamp<\/td><\/tr><tr><td>ISO 8601 \/ RFC 3339<\/td><td>2026-09-27T01:30:00+02:00<\/td><td>Calendar fields with an explicit offset<\/td><\/tr><tr><td>Calendar date<\/td><td>20260927<\/td><td>Berlin date in this example, not an instant<\/td><\/tr><\/tbody><\/table>\n<p><code>Date.now()<\/code> returns milliseconds from the current system clock. In the standard GTM installation, <code>gtm.start<\/code> records container initialization, not every subsequent click. A correct unit can therefore coexist with an incorrect interpretation.<\/p>\n<p>For values from 2026, ten, 13 and 16 digits are typical of seconds, milliseconds and microseconds. Older or negative timestamps, other epochs and ordinary identifiers do not fit this recognition rule. Eight digits also do not establish a valid date: <code>20260230<\/code> is not a calendar day.<\/p>\n<h2>2. Conversion with an explicit unit<\/h2>\n<p>The function accepts integers or strings of decimal digits with an optional sign. Value and unit are separate arguments. Floating-point numbers, booleans and decimal-fraction strings are rejected to prevent unnoticed rounding. Nanoseconds are accepted only when conversion to microseconds is exact.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"python\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Python<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-python\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">import<\/span> re\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">from<\/span> datetime <span class=\"cbb-keyword\">import<\/span> datetime, timedelta, timezone\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">EPOCH = <span class=\"cbb-function\">datetime<\/span>(<span class=\"cbb-number\">1970<\/span>, <span class=\"cbb-number\">1<\/span>, <span class=\"cbb-number\">1<\/span>, tzinfo=timezone.utc)\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">epoch_to_utc<\/span>(value, unit):\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-function\">isinstance<\/span>(value, bool):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">TypeError<\/span>(<span class=\"cbb-string\">\"boolean is not a timestamp\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-function\">isinstance<\/span>(value, str):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-keyword\">not<\/span> re.<span class=\"cbb-function\">fullmatch<\/span>(<span class=\"cbb-string\">r\"&#91;+-&#93;?&#91;0-9&#93;{1,20}\"<\/span>, value):\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">ValueError<\/span>(<span class=\"cbb-string\">\"expected an integer string\"<\/span>)\n<\/span><span class=\"cbb-line\">        value = <span class=\"cbb-function\">int<\/span>(value)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">elif<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-function\">isinstance<\/span>(value, int):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">TypeError<\/span>(<span class=\"cbb-string\">\"expected an integer or integer string\"<\/span>)\n<\/span><span class=\"cbb-line\">    factors = {<span class=\"cbb-string\">\"s\"<\/span>: <span class=\"cbb-number\">1_000_000<\/span>, <span class=\"cbb-string\">\"ms\"<\/span>: <span class=\"cbb-number\">1_000<\/span>, <span class=\"cbb-string\">\"us\"<\/span>: <span class=\"cbb-number\">1<\/span>}\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> unit == <span class=\"cbb-string\">\"ns\"<\/span>:\n<\/span><span class=\"cbb-line\">        micros, remainder = <span class=\"cbb-function\">divmod<\/span>(value, <span class=\"cbb-number\">1_000<\/span>)\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">if<\/span> remainder:\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">ValueError<\/span>(<span class=\"cbb-string\">\"nanoseconds would lose precision\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">elif<\/span> unit <span class=\"cbb-keyword\">in<\/span> factors:\n<\/span><span class=\"cbb-line\">        micros = value * factors&#91;unit&#93;\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">else<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">ValueError<\/span>(<span class=\"cbb-string\">\"unit must be s, ms, us or ns\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">try<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> EPOCH + <span class=\"cbb-function\">timedelta<\/span>(microseconds=micros)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">except<\/span> OverflowError <span class=\"cbb-keyword\">as<\/span> exc:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">ValueError<\/span>(<span class=\"cbb-string\">\"outside Python datetime range\"<\/span>) <span class=\"cbb-keyword\">from<\/span> exc\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">print<\/span>(<span class=\"cbb-function\">epoch_to_utc<\/span>(<span class=\"cbb-string\">\"1790465400000000\"<\/span>, <span class=\"cbb-string\">\"us\"<\/span>).<span class=\"cbb-function\">isoformat<\/span>())\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"># 2026-09-26T23:30:00+00:00<\/span><\/span><\/code><\/pre><\/figure>\n<p>The result is a UTC <code>datetime<\/code> with microsecond resolution. The function checks type, unit and Python&#8217;s representable range, but not business-specific upload deadlines. Establishing whether the date belongs to the event requires a separate plausibility check against the source. An incorrectly declared unit can still produce a technically valid but incorrect date.<\/p>\n<p>For example, interpreting <code>1790465400<\/code> as milliseconds produces <code>1970-01-21T17:21:05.400Z<\/code>. Interpreting milliseconds as seconds can produce a distant future date or a range error. Even an obviously incorrect date is not harmless once an API or report processes the value.<\/p>\n<h2>3. GA4 reporting date and timestamp have different meanings<\/h2>\n<p>The current GA4 export schema describes <code>event_timestamp<\/code> as receipt time at Google Analytics in UTC microseconds. Multiple events in the same request can share a timestamp. The value is therefore neither a unique event key nor, without further checks, a precise click time.<\/p>\n<p><code>event_date<\/code> is the logged date in <code>YYYYMMDD<\/code> notation under the configured reporting time zone. Daily tables use the name <code>events_YYYYMMDD<\/code>. A local date calculated from the receipt timestamp must not automatically be equated with the stored event date: delays, timestamp semantics and changes to the reporting time zone require separate consideration.<\/p>\n<p>For a pure time-zone comparison of the same example instant:<\/p>\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"plain\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Text<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-plain\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">UTC                2026-09-26T23:30:00Z\n<\/span><span class=\"cbb-line\">Europe\/Berlin      2026-09-27T01:30:00+02:00\n<\/span><span class=\"cbb-line\">UTC date           2026-09-26\n<\/span><span class=\"cbb-line\">Berlin date        2026-09-27<\/span><\/code><\/pre><\/figure>\n<p>Berlin is two hours ahead of UTC in September and normally one hour ahead in winter. Local-day and UTC-day reports therefore select different intervals. The difference between daily totals is not constant: events move across both boundaries, and the counts depend on actual activity.<\/p>\n<p>Comparisons need consistent day definitions, event meanings, filters and data freshness. A table filter selects export tables; an additional timestamp filter selects instants within those tables. Reconstructing a different reporting day also requires considering boundary tables and late data. A <code>LIMIT<\/code> only limits output and does not reliably limit bytes read.<\/p>\n<h2>4. BigQuery functions for each unit<\/h2>\n<p><code>TIMESTAMP_SECONDS<\/code>, <code>TIMESTAMP_MILLIS<\/code> and <code>TIMESTAMP_MICROS<\/code> require the unit indicated by each name. This example selects a few fields from one explicitly named daily table. Project, dataset, date and reporting time zone require adjustment.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"sql\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">SQL<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-sql\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">SELECT<\/span>\n<\/span><span class=\"cbb-line\">  event_date,\n<\/span><span class=\"cbb-line\">  event_timestamp,\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-function\">TIMESTAMP_MICROS<\/span>(event_timestamp) <span class=\"cbb-keyword\">AS<\/span> timestamp_utc,\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-type\">DATETIME<\/span>(<span class=\"cbb-function\">TIMESTAMP_MICROS<\/span>(event_timestamp),\n<\/span><span class=\"cbb-line\">           <span class=\"cbb-string\">'Europe\/Berlin'<\/span>) <span class=\"cbb-keyword\">AS<\/span> wall_clock_berlin,\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-type\">DATE<\/span>(<span class=\"cbb-function\">TIMESTAMP_MICROS<\/span>(event_timestamp)) <span class=\"cbb-keyword\">AS<\/span> date_utc,\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-type\">DATE<\/span>(<span class=\"cbb-function\">TIMESTAMP_MICROS<\/span>(event_timestamp),\n<\/span><span class=\"cbb-line\">       <span class=\"cbb-string\">'Europe\/Berlin'<\/span>) <span class=\"cbb-keyword\">AS<\/span> timestamp_date_berlin,\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-function\">FORMAT_TIMESTAMP<\/span>(<span class=\"cbb-string\">'%Y-%m-%dT%H:%M:%E6S%Ez'<\/span>,\n<\/span><span class=\"cbb-line\">                   <span class=\"cbb-function\">TIMESTAMP_MICROS<\/span>(event_timestamp),\n<\/span><span class=\"cbb-line\">                   <span class=\"cbb-string\">'Europe\/Berlin'<\/span>) <span class=\"cbb-keyword\">AS<\/span> text_with_offset,\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-function\">UNIX_SECONDS<\/span>(<span class=\"cbb-function\">TIMESTAMP_MICROS<\/span>(event_timestamp)) <span class=\"cbb-keyword\">AS<\/span> whole_seconds\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">FROM<\/span> <span class=\"cbb-variable\">`project_id.analytics_123456789.events_20260927`<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">LIMIT<\/span> <span class=\"cbb-number\">10<\/span>;<\/span><\/code><\/pre><\/figure>\n<p><code>TIMESTAMP<\/code> represents an instant. <code>DATETIME<\/code> contains a calendar date and clock reading without a time zone. A local display is useful, but a unique reverse conversion requires additional information. <code>%E6S<\/code> preserves six fractional digits in the output string; <code>UNIX_SECONDS<\/code> rounds down to the beginning of the second and discards microseconds.<\/p>\n<p>Parsing text with an explicit offset, an explicit zone or the UTC default produces different results:<\/p>\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"sql\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">SQL<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-sql\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">SELECT<\/span>\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-function\">PARSE_TIMESTAMP<\/span>(<span class=\"cbb-string\">'%FT%T%Ez'<\/span>, <span class=\"cbb-string\">'2026-09-27T01:30:00+02:00'<\/span>) <span class=\"cbb-keyword\">AS<\/span> explicit_offset,\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-function\">PARSE_TIMESTAMP<\/span>(<span class=\"cbb-string\">'%FT%T'<\/span>, <span class=\"cbb-string\">'2026-09-27T01:30:00'<\/span>,\n<\/span><span class=\"cbb-line\">                  <span class=\"cbb-string\">'Europe\/Berlin'<\/span>) <span class=\"cbb-keyword\">AS<\/span> explicit_zone,\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-function\">PARSE_TIMESTAMP<\/span>(<span class=\"cbb-string\">'%FT%T'<\/span>, <span class=\"cbb-string\">'2026-09-27T01:30:00'<\/span>) <span class=\"cbb-keyword\">AS<\/span> utc_default;<\/span><\/code><\/pre><\/figure>\n<p>The first two results identify <code>2026-09-26T23:30:00Z<\/code>; the third identifies <code>2026-09-27T01:30:00Z<\/code>, two hours later. A format string alone does not establish the correct time zone. Other supported parsing functions also need clear rules for the unit, format and time zone of the input.<\/p>\n<h2>5. Daylight saving creates repeated and missing clock times<\/h2>\n<p>In <code>Europe\/Berlin<\/code>, 02:30 occurs twice on 25 October 2026: with <code>+02:00<\/code>, the value means 00:30 UTC; with <code>+01:00<\/code>, the value means 01:30 UTC. The zone name alone does not resolve this ambiguity. A known offset or an explicit choice of the first or second occurrence is required.<\/p>\n<p>Conversely, 02:30 does not exist in Berlin on 29 March 2026 because the clock jumps from 02:00 to 03:00. A parser can shift, reject or otherwise resolve such input according to its rules. A silent default does not reconstruct the actual event.<\/p>\n<p>Those calendar days last 25 and 23 hours respectively. Day boundaries therefore come from local midnight and the next local midnight, converted separately to UTC. Adding 86,400 seconds is not a general substitute.<\/p>\n<p>For events that have already occurred, a uniquely established UTC instant is useful for storage. The original zone and source text can also be retained for traceability. UTC storage does not repair a local time that was interpreted incorrectly beforehand.<\/p>\n<h2>6. Rules of the receiving API<\/h2>\n<p>Meta CAPI uses Unix seconds of the actual event for <code>event_time<\/code>. An unmodified <code>Date.now()<\/code> value is therefore unsuitable. Permitted event age and error handling belong to the specific API and event source; a successful HTTP response alone does not establish complete processing or attribution. Error objects, response details and diagnostics need separate examination.<\/p>\n<p>The Google Ads API requires a time-zone designation for <code>ClickConversion.conversion_date_time<\/code>, using <code>yyyy-mm-dd hh:mm:ss+|-hh:mm<\/code>. The matching example is <code>2026-09-27 01:30:00+02:00<\/code>. A missing offset must not generally be interpreted as a fallback to the account time zone. Other upload routes have separate requirements.<\/p>\n<p>Retries must retain the actual event time. Replacing an old event time with \u201cnow\u201d to bypass a deadline falsifies the data. Following a verified clock correction, the original event time, allowed window and duplicate protection need to be checked together.<\/p>\n<div class=\"lw-faq\">\n<h2>Questions and answers<\/h2>\n<h3>Are 16-digit microseconds always exact in JavaScript?<\/h3>\n<p>No. <code>Number.MAX_SAFE_INTEGER<\/code> is <code>9007199254740991<\/code>. The 2026 example is smaller, but some 16-digit numbers are larger. For microseconds, the boundary corresponds to 5 June 2255 at 23:47:34.740991 UTC. <code>Date<\/code> still operates in milliseconds; an exact integer microsecond value cannot be passed unchanged as a Date value.<\/p>\n<h3>What happens to nanoseconds in JSON?<\/h3>\n<p>Current Unix nanoseconds exceed JavaScript&#8217;s safe-integer range. Some values happen to remain representable, but neighboring values do not. A decimal string followed by <code>BigInt<\/code> preserves the integer. Converting a value to BigInt after parsing has rounded the value as a <code>Number<\/code> cannot recover the lost digits. Reducing precision to milliseconds deliberately loses detail.<\/p>\n<h3>Does a UTC property time zone solve every daily discrepancy?<\/h3>\n<p>UTC standardizes the chosen day boundary, not different timestamp meanings, processing or attribution. A local zone can remain appropriate for a Berlin business day. Changing the property zone affects future data and can create transitional reporting effects; the entire history is not recalculated.<\/p>\n<h3>How can an inaccurate server clock be investigated?<\/h3>\n<p><code>timedatectl status<\/code> displays synchronization status on suitable Linux systems. Missing synchronization does not establish a particular offset. The actual time service&#8217;s offset, last successful synchronization and time-source reachability also matter. An HTTP <code>Date<\/code> header is only a rough cross-check: caching, transit time, whole-second precision and the responding infrastructure limit the evidence. One-second measurement accuracy is not guaranteed.<\/p>\n<\/div>\n<h2>Sources and technical references<\/h2><ul><li><a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc3339.html\">RFC3339<\/a><\/li><li><a href=\"https:\/\/tc39.es\/ecma262\/multipage\/numbers-and-dates.html\">ECMAScript: Numbers and dates<\/a><\/li><li><a href=\"https:\/\/docs.python.org\/3\/library\/datetime.html\">Python: datetime<\/a><\/li><li><a href=\"https:\/\/docs.python.org\/3\/library\/zoneinfo.html\">Python: zoneinfo<\/a><\/li><li><a href=\"https:\/\/support.google.com\/analytics\/answer\/7029846?hl=en\">GA4: BigQuery export schema<\/a><\/li><li><a href=\"https:\/\/docs.cloud.google.com\/bigquery\/docs\/reference\/standard-sql\/timestamp_functions\">BigQuery: Timestamp functions<\/a><\/li><li><a href=\"https:\/\/developers.google.com\/google-ads\/api\/reference\/rpc\/v25\/ClickConversion\">Google Ads: ClickConversion<\/a><\/li><li><a href=\"https:\/\/raw.githubusercontent.com\/facebook\/facebook-nodejs-business-sdk\/main\/src\/objects\/serverside\/server-event.js\">Meta: ServerEvent SDK<\/a><\/li><li><a href=\"https:\/\/support.google.com\/analytics\/answer\/9744165?hl=en\">GA4: Property time zone<\/a><\/li><li><a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9110.html#name-date\">RFC9110: Date<\/a><\/li><li><a href=\"https:\/\/www.freedesktop.org\/software\/systemd\/man\/latest\/timedatectl.html\">systemd: timedatectl<\/a><\/li><li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/datalayer\">GTM: Data layer<\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Timestamp conversion needs explicit units and a clear distinction between calendar dates and instants. The examples cover GA4 fields, daylight-saving changes and JavaScript precision limits.<\/p>\n","protected":false},"author":1,"featured_media":30214,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[113],"tags":[91333,91144,91258,91219],"class_list":["post-13160","post","type-post","status-publish","format-standard","hentry","category-tutorials","tag-bigquery","tag-devops","tag-google-analytics-4","tag-tutorial"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tutorial: The Five Timestamp Formats in a Tracking Stack and How to Convert Between Them | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Telling the five formats apart by their digit count, converting them in BigQuery, and the day boundary where event_date and event_timestamp disagree.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutorial: The Five Timestamp Formats in a Tracking Stack and How to Convert Between Them | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Telling the five formats apart by their digit count, converting them in BigQuery, and the day boundary where event_date and event_timestamp disagree.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-26T05:35:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-26T12:32:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll2-13160-13160.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Tutorial: The Five Timestamp Formats in a Tracking Stack and How to Convert Between Them\",\"datePublished\":\"2026-09-26T05:35:00+00:00\",\"dateModified\":\"2026-10-26T12:32:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\\\/\"},\"wordCount\":1300,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/flux-voll2-13160-13160.png\",\"keywords\":[\"BigQuery\",\"DevOps\",\"Google Analytics 4\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\\\/\",\"name\":\"Tutorial: The Five Timestamp Formats in a Tracking Stack and How to Convert Between Them | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/flux-voll2-13160-13160.png\",\"datePublished\":\"2026-09-26T05:35:00+00:00\",\"dateModified\":\"2026-10-26T12:32:49+00:00\",\"description\":\"Telling the five formats apart by their digit count, converting them in BigQuery, and the day boundary where event_date and event_timestamp disagree.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/flux-voll2-13160-13160.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/flux-voll2-13160-13160.png\",\"width\":1200,\"height\":630,\"caption\":\"Tutorial: The Five Timestamp Formats in a Tracking Stack and How to Convert Between Them\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/tutorials\\\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial: The Five Timestamp Formats in a Tracking Stack and How to Convert Between Them\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutorial: The Five Timestamp Formats in a Tracking Stack and How to Convert Between Them | Lukas Wojcik","description":"Telling the five formats apart by their digit count, converting them in BigQuery, and the day boundary where event_date and event_timestamp disagree.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\/","og_locale":"en_US","og_type":"article","og_title":"Tutorial: The Five Timestamp Formats in a Tracking Stack and How to Convert Between Them | Lukas Wojcik","og_description":"Telling the five formats apart by their digit count, converting them in BigQuery, and the day boundary where event_date and event_timestamp disagree.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-26T05:35:00+00:00","article_modified_time":"2026-10-26T12:32:49+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll2-13160-13160.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Tutorial: The Five Timestamp Formats in a Tracking Stack and How to Convert Between Them","datePublished":"2026-09-26T05:35:00+00:00","dateModified":"2026-10-26T12:32:49+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\/"},"wordCount":1300,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll2-13160-13160.png","keywords":["BigQuery","DevOps","Google Analytics 4","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\/","name":"Tutorial: The Five Timestamp Formats in a Tracking Stack and How to Convert Between Them | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll2-13160-13160.png","datePublished":"2026-09-26T05:35:00+00:00","dateModified":"2026-10-26T12:32:49+00:00","description":"Telling the five formats apart by their digit count, converting them in BigQuery, and the day boundary where event_date and event_timestamp disagree.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll2-13160-13160.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/flux-voll2-13160-13160.png","width":1200,"height":630,"caption":"Tutorial: The Five Timestamp Formats in a Tracking Stack and How to Convert Between Them"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/tutorial-the-five-timestamp-formats-in-a-tracking-stack-and-how-to-convert-between-them\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Tutorial: The Five Timestamp Formats in a Tracking Stack and How to Convert Between Them"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13160","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=13160"}],"version-history":[{"count":7,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13160\/revisions"}],"predecessor-version":[{"id":27417,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13160\/revisions\/27417"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/30214"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=13160"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=13160"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=13160"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}