{"id":311,"date":"2026-10-13T12:41:56","date_gmt":"2026-10-13T12:41:56","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2012\/02\/22\/understanding-epoch-unix-timestamp\/"},"modified":"2026-10-13T12:41:56","modified_gmt":"2026-10-13T12:41:56","slug":"understanding-epoch-unix-timestamp","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/understanding-epoch-unix-timestamp\/","title":{"rendered":"Unix Epoch Timestamp Guide for DevOps: Conversions, Commands, and Pitfalls"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Originally published on 2012-02-22; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Unix timestamps show up everywhere in DevOps: logs, metrics, CI\/CD events, audit records, and API payloads. This guide explains what epoch time is, how to convert it correctly across common tools, and what to watch for when timezone or unit mistakes can break debugging and automation.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2012\/02\/epoch-unix-timestamp.png\" alt=\"Epoch and Unix timestamp illustration\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What Unix epoch time means<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>Unix timestamp<\/strong> (also called <strong>Unix time<\/strong> or <strong>POSIX time<\/strong>) is the number of seconds elapsed since 1970-01-01T00:00:00Z (UTC), not counting leap seconds. The moment 1970-01-01T00:00:00Z is epoch <strong>0<\/strong>.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Epoch time is timezone-independent as a number.<\/li><li>Display formatting is timezone-dependent.<\/li><li>Many systems still store or exchange timestamps as integer seconds.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Time-unit reference for quick estimates<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Human readable time<\/th><th>Seconds<\/th><\/tr><\/thead><tbody><tr><td>1 hour<\/td><td>3600<\/td><\/tr><tr><td>1 day<\/td><td>86400<\/td><\/tr><tr><td>1 week<\/td><td>604800<\/td><\/tr><tr><td>1 month (30.44 days, average)<\/td><td>2629743<\/td><\/tr><tr><td>1 year (365.24 days, average)<\/td><td>31556926<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How epoch conversion works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In practice, conversion errors usually come from <strong>timezone assumptions<\/strong> or <strong>unit confusion<\/strong> (seconds vs milliseconds). A consistent flow helps avoid both.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Input value] --> B{Type of input}\n    B -->|Human date| C[Choose timezone]\n    C --> D[Convert to epoch seconds]\n    B -->|Epoch number| E[Check unit]\n    E -->|Seconds| F[Format as date time]\n    E -->|Milliseconds| G[Divide by 1000]\n    G --> F\n    D --> H[Store compare or transmit]\n    F --> H\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Get the current Unix timestamp<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">These are common one-liners used in operations scripts and troubleshooting sessions.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Environment<\/th><th>Command<\/th><th>Unit returned<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td>Unix or Linux shell<\/td><td>date +%s<\/td><td>Seconds<\/td><td>Common in automation scripts.<\/td><\/tr><tr><td>Python<\/td><td>int(time.time())<\/td><td>Seconds<\/td><td>time.time() is fractional seconds.<\/td><\/tr><tr><td>JavaScript or Node.js<\/td><td>Math.floor(Date.now()\/1000)<\/td><td>Seconds<\/td><td>Date.now() is milliseconds.<\/td><\/tr><tr><td>PostgreSQL<\/td><td>SELECT EXTRACT(EPOCH FROM now());<\/td><td>Seconds<\/td><td>Useful for SQL-side comparisons.<\/td><\/tr><tr><td>MySQL<\/td><td>SELECT UNIX_TIMESTAMP(NOW());<\/td><td>Seconds<\/td><td>Behavior depends on DB timezone context.<\/td><\/tr><tr><td>PowerShell<\/td><td>[DateTimeOffset]::UtcNow.ToUnixTimeSeconds()<\/td><td>Seconds<\/td><td>Explicit UTC source.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Shell<\/span>\ndate +%s\n\n<span class=\"hljs-comment\"># UTC shell output (same epoch value, explicit display intent)<\/span>\ndate -u +%s<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-python\"><span class=\"hljs-keyword\">import<\/span> time\nprint(int(time.time()))<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-javascript\"><span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-built_in\">Math<\/span>.floor(<span class=\"hljs-built_in\">Date<\/span>.now() \/ <span class=\"hljs-number\">1000<\/span>));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Convert human-readable date and time to epoch<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Always decide timezone first. If the input string does not include an offset, tools may assume local timezone or session timezone.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Environment<\/th><th>Example<\/th><th>Timezone behavior<\/th><\/tr><\/thead><tbody><tr><td>GNU date<\/td><td>date -d &#8220;2024-01-01 00:00:00 UTC&#8221; +%s<\/td><td>UTC explicitly provided in input.<\/td><\/tr><tr><td>macOS BSD date<\/td><td>date -j -u -f &#8220;%Y-%m-%d %H:%M:%S&#8221; &#8220;2024-01-01 00:00:00&#8221; +%s<\/td><td>-u forces UTC interpretation.<\/td><\/tr><tr><td>Python<\/td><td>int(datetime(2024,1,1,0,0,0,tzinfo=timezone.utc).timestamp())<\/td><td>Explicit UTC via tzinfo.<\/td><\/tr><tr><td>JavaScript<\/td><td>Math.floor(new Date(&#8220;2024-01-01T00:00:00Z&#8221;).getTime()\/1000)<\/td><td>Z means UTC.<\/td><\/tr><tr><td>PostgreSQL<\/td><td>SELECT EXTRACT(EPOCH FROM TIMESTAMPTZ &#8216;2024-01-01 00:00:00+00&#8217;);<\/td><td>Offset included in value.<\/td><\/tr><tr><td>MySQL<\/td><td>SELECT UNIX_TIMESTAMP(&#8216;2024-01-01 00:00:00&#8217;);<\/td><td>Typically interpreted using session timezone.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># GNU date example<\/span>\ndate -d <span class=\"hljs-string\">\"2024-01-01 00:00:00 UTC\"<\/span> +%s\n\n<span class=\"hljs-comment\"># macOS BSD date example<\/span>\ndate -j -u -f <span class=\"hljs-string\">\"%Y-%m-%d %H:%M:%S\"<\/span> <span class=\"hljs-string\">\"2024-01-01 00:00:00\"<\/span> +%s<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-python\"><span class=\"hljs-keyword\">from<\/span> datetime <span class=\"hljs-keyword\">import<\/span> datetime, timezone\nprint(int(datetime(<span class=\"hljs-number\">2024<\/span>, <span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>, tzinfo=timezone.utc).timestamp()))<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-sql\">-- PostgreSQL\nSELECT EXTRACT(EPOCH FROM TIMESTAMPTZ <span class=\"hljs-string\">'2024-01-01 00:00:00+00'<\/span>);\n\n-- MySQL\nSELECT UNIX_TIMESTAMP(<span class=\"hljs-string\">'2024-01-01 00:00:00'<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Convert epoch to human-readable date and time<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When converting back, choose whether you want UTC output or local timezone output for operators and dashboards.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Environment<\/th><th>Example<\/th><th>Output style<\/th><\/tr><\/thead><tbody><tr><td>GNU date<\/td><td>date -u -d @1704067200 &#8220;+%Y-%m-%d %H:%M:%S UTC&#8221;<\/td><td>UTC text output.<\/td><\/tr><tr><td>macOS BSD date<\/td><td>date -u -r 1704067200 &#8220;+%Y-%m-%d %H:%M:%S UTC&#8221;<\/td><td>UTC text output.<\/td><\/tr><tr><td>Python<\/td><td>datetime.fromtimestamp(1704067200, tz=timezone.utc)<\/td><td>Timezone-aware datetime object.<\/td><\/tr><tr><td>JavaScript<\/td><td>new Date(1704067200 * 1000).toISOString()<\/td><td>ISO 8601 UTC string.<\/td><\/tr><tr><td>PostgreSQL<\/td><td>SELECT to_timestamp(1704067200);<\/td><td>Timestamp value based on epoch input.<\/td><\/tr><tr><td>MySQL<\/td><td>SELECT FROM_UNIXTIME(1704067200);<\/td><td>Rendered in DB timezone context.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># GNU date<\/span>\ndate -u -d @<span class=\"hljs-number\">1704067200<\/span> <span class=\"hljs-string\">\"+%Y-%m-%d %H:%M:%S UTC\"<\/span>\n\n<span class=\"hljs-comment\"># macOS BSD date<\/span>\ndate -u -r <span class=\"hljs-number\">1704067200<\/span> <span class=\"hljs-string\">\"+%Y-%m-%d %H:%M:%S UTC\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-python\"><span class=\"hljs-keyword\">from<\/span> datetime <span class=\"hljs-keyword\">import<\/span> datetime, timezone\nprint(datetime.fromtimestamp(<span class=\"hljs-number\">1704067200<\/span>, tz=timezone.utc).isoformat())<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-javascript\"><span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Date<\/span>(<span class=\"hljs-number\">1704067200<\/span> * <span class=\"hljs-number\">1000<\/span>).toISOString());<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Seconds vs milliseconds: quick comparison<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Timestamp unit<\/th><th>Typical length today<\/th><th>Common sources<\/th><th>Convert to seconds<\/th><\/tr><\/thead><tbody><tr><td>Seconds<\/td><td>10 digits<\/td><td>date +%s, many SQL functions<\/td><td>Use as-is<\/td><\/tr><tr><td>Milliseconds<\/td><td>13 digits<\/td><td>JavaScript Date.now(), many APIs<\/td><td>Divide by 1000<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">If an epoch value looks too large, confirm unit before parsing. A millisecond value treated as seconds usually produces dates far in the future.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Y2038 and integer-size considerations<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Systems that store epoch seconds in a <strong>signed 32-bit integer<\/strong> can overflow in January 2038 (the Y2038 issue). Modern platforms commonly use wider integer types, but old schemas, legacy binaries, and embedded systems should still be reviewed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Reference and original links<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Original article: <a href=\"https:\/\/www.devopsschool.com\/blog\/understanding-epoch-unix-timestamp\/\">How to Understand Epoch and Unix Timestamp<\/a><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"http:\/\/www.epochconverter.com\/\" target=\"_blank\" rel=\"noopener\">Epoch Converter<\/a><\/li><li><a href=\"http:\/\/www.epochconverter.com\/programming\/mysql-from-unixtime.php\">MySQL epoch conversion notes<\/a><\/li><li><a href=\"http:\/\/www.php.net\/mktime\" rel=\"nofollow\">PHP mktime reference<\/a><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Common pitfalls and best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Store canonical timestamps in UTC-based epoch seconds or milliseconds, then format for users at the edge.<\/li><li>Document timestamp unit in every API and schema field name where possible.<\/li><li>When parsing date strings, include timezone offsets explicitly instead of relying on defaults.<\/li><li>In SQL, verify session and server timezone settings before comparing epoch and datetime fields.<\/li><li>For cross-platform shell scripts, account for GNU date and BSD date option differences.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Unix epoch timestamps are simple in concept but easy to misuse in production. This updated guide shows reliable conversions across shell, Python, JavaScript, and SQL, with timezone and Y2038 guardrails.<\/p>\n","protected":false},"author":1,"featured_media":3849,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[2587,2588,2580,2582,2592,2583,2589,2590,2591,2581,2579,2586,169,2593,2584,2585],"class_list":["post-311","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorised","tag-about-epoch-timestamp","tag-about-unix-timestamp","tag-epoch","tag-epoch-and-unix","tag-epoch-converter","tag-epoch-time","tag-introduction-epoch-timestamp","tag-introduction-unix-timestamp","tag-overview-epoch-unix-timestamp","tag-timestamp","tag-understand","tag-understand-epoch-unix-timestamp","tag-unix","tag-unix-timestamp","tag-what-is-epoch-time","tag-what-is-unix-time"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/311","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=311"}],"version-history":[{"count":4,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/311\/revisions"}],"predecessor-version":[{"id":79175,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/311\/revisions\/79175"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/3849"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=311"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=311"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}