مبدل یونیکس تایم‌استمپ به تاریخ

یونیکس تایم‌استمپ را به تاریخ و زمان قابل‌خواندن تبدیل کنید — یا هر تاریخی را دوباره به یونیکس تایم‌استمپ برگردانید. از ثانیه و میلی‌ثانیه پشتیبانی می‌کند.

اشتراک‌گذاری این ابزار

جاسازی در وبسایت

Unix timestamp چیست؟

Unix timestamp، که به آن Unix time یا POSIX time هم می‌گویند، تعداد ثانیه‌های سپری‌شده از 1970-01-01 00:00:00 UTC است. این لحظه را Unix epoch می‌نامند. این استاندارد در محاسبات بسیار پرکاربرد است، چون هر لحظه را به یک عدد صحیح نمایش می‌دهد و این کار ذخیره، مقایسه و محاسبات را ساده می‌کند.

JavaScript در سطح داخلی بر حسب میلی‌ثانیه کار می‌کند، بنابراین Date.now() مقدار Unix timestamp را در ۱۰۰۰ ضرب می‌کند. بسیاری از API‌ها، پایگاه‌های داده و سیستم‌های backend از ثانیه استفاده می‌کنند. این ابزار هر دو فرمت را می‌پذیرد و به‌طور خودکار بر اساس اندازه عدد وارد‌شده، تشخیص می‌دهد که مقدار بر حسب ثانیه است یا میلی‌ثانیه.

Unix timestamp های قابل توجه

Timestampتاریخ (UTC)توضیح
01970-01-01 00:00:00Unix epoch
1,000,000,0002001-09-09 01:46:40۱ میلیارد ثانیه
2,000,000,0002033-05-18 03:33:20۲ میلیارد ثانیه
2,147,483,6472038-01-19 03:14:07مشکل سال ۲۰۳۸ (حداکثر ۳۲ بیتی)

چرا سال ۱۹۷۰؟

انتخاب Unix epoch در ۱ ژانویه ۱۹۷۰ هم بر اساس قرارداد و هم به‌دلیل محدودیت‌های عملی بود. Unix در اواخر دهه ۱۹۶۰ و اوایل دهه ۱۹۷۰ در Bell Labs توسعه‌یافت. توسعه‌دهندگان نیاز به تاریخ شروع اخیر و گرد برای نمایش زمان داشتند. ۱ ژانویه ۱۹۷۰ به‌اندازه کافی اخیر و عملی بود و هیچ معنای تکنیکی خاصی نداشت — صرفاً یک نقطه‌آغاز راحت بود.

سیستم‌های دیگر از epoch تاریخ‌های متفاوتی استفاده می‌کنند: FILETIME ویندوز از ۱ ژانویه ۱۶۰۱، GPS time از ۶ ژانویه ۱۹۸۰، و NTP epoch از ۱ ژانویه ۱۹۰۰ شروع می‌شود. هنگام تبدیل بین سیستم‌ها، دانستن epoch هر سیستم ضروری است.

ثانیه در مقابل میلی‌ثانیه

Unix timestamp اصلی بر حسب ثانیه است. اکثر زبان‌های سمت سرور و سیستم‌ها (Unix shell، time.time() در Python، time() در PHP، اکثر پایگاه‌های داده) از ثانیه استفاده می‌کنند. Date.now() و new Date().getTime() در JavaScript میلی‌ثانیه برمی‌گردانند. این عدم تطابق منبع رایج اشکالات هنگام برقراری ارتباط بین frontend های JavaScript و API های backend است.

Unix timestamp در ثانیه در حال حاضر ۱۰ رقمی است (حدود ۱٫۷۰۰٫۰۰۰٫۰۰۰ تا سال ۲۰۲۳). timestamp میلی‌ثانیه ۱۳ رقمی است. ماشین‌حساب بر اساس تعداد ارقام تشخیص می‌دهد کدام فرمت را وارد کرده‌اید و متناسب با آن تبدیل می‌کند.

مشکل سال ۲۰۳۸

سیستم‌هایی که Unix timestamp را به‌عنوان عدد صحیح ۳۲ بیتی علامت‌دار ذخیره می‌کنند، فقط می‌توانند تاریخ‌های تا 2,147,483,647 ثانیه پس از epoch را نمایش دهند — که معادل ۰۳:۱۴:۰۷ UTC در ۱۹ ژانویه ۲۰۳۸ است. پس از آن لحظه، عدد صحیح ۳۲ بیتی علامت‌دار سرریز می‌شود و به عدد منفی بزرگی تبدیل می‌شود که نشان‌دهنده تاریخی در سال ۱۹۰۱ است.

این گاهی "مشکل Y2K38" یا "بگ هزاره Unix" نام‌گذاری می‌شود. سیستم‌های ۶۴ بیتی مدرن تحت تأثیر قرار نمی‌گیرند، چون عدد صحیح ۶۴ بیتی علامت‌دار می‌تواند timestamp‌هایی برای تقریباً ۲۹۲ میلیارد سال را نمایش دهد. با این حال، سیستم‌های embedded، پایگاه‌های داده قدیمی و نرم‌افزار ۳۲ بیتی قدیمی‌تر می‌توانند هنوز آسیب‌پذیر باشند. بسیاری از صنایع — شامل مخابرات، بانکداری و سیستم‌های کنترل صنعتی — تلاش‌های مهاجرتی جاری برای رفع این مشکل دارند.

نحوه دریافت Unix timestamp کنونی

زبان / محیطدستور
JavaScriptMath.floor(Date.now() / 1000)
Pythonimport time; int(time.time())
PHPtime()
Bashdate +%s
SQL (PostgreSQL)EXTRACT(EPOCH FROM NOW())::int
SQL (MySQL)UNIX_TIMESTAMP()
Gotime.Now().Unix()
RustSystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs()

کاربردهای عملی

توسعه API: REST API‌ها عام‌طور Unix timestamp را برای فیلدهای created_at، updated_at و انقضای token استفاده می‌کنند. timestamp بی‌طرف نسبت به منطقه زمانی است و بدون ابهام — برخلاف رشته‌های تاریخ قالب‌بندی‌شده که به locale و قرارداد‌های قالب‌بندی بستگی دارند.

انقضای token: JWT (JSON Web Tokens) برای claims های exp (انقضا) و iat (صادرشدن در) از Unix timestamp استفاده می‌کند. یک token زمانی منقضی می‌شود که timestamp کنونی از مقدار exp بیشتر شود. محاسبه زمان انقضا — "این token باید ظرف ۲۴ ساعت منقضی شود" — نیاز به اضافه کردن ۸۶٫۴۰۰ ثانیه به timestamp کنونی دارد.

TTL Cache: انقضای cache معام‌لاً به‌عنوان Unix timestamp یا به‌عنوان تعدادی ثانیه از اکنون تنظیم می‌شود. اشکال‌زدایی مشکلات cache اغلب نیاز به تبدیل timestamp انقضای ذخیره‌شده به تاریخ قابل‌فهم دارد.

تحلیل log: Server log‌ها اغلب Unix timestamp را شامل می‌شوند. تبدیل آن‌ها به تاریخ قابل‌خواندن گام اول در مرتبط‌کردن log entry‌ها با رویدادهای واقعی است.

ذخیره‌سازی در پایگاه داده: ذخیره timestamp‌ها به‌عنوان اعداد صحیح به‌جای رشته‌های قالب‌بندی‌شده، از اشکالات تبدیل منطقه زمانی جلوگیری می‌کند و مرتب‌سازی، جستجوهای range و محاسبات را ساده می‌کند. جستجویی برای "تمام record‌ها از ۷ روز گذشته" به WHERE created_at > (NOW_UNIX - 604800) تبدیل می‌شود.

سؤالات متداول

تایم‌استمپ یونیکس چیست؟

تایم‌استمپ یونیکس تعداد ثانیه‌هایی است که از ۱ ژانویهٔ ۱۹۷۰، ساعت ۰۰:۰۰:۰۰ به‌وقت UTC گذشته است — نقطهٔ مرجعی که «یونیکس اِپاک» (Unix epoch) نام دارد. این مقدار هر لحظهٔ زمانی را به‌صورت یک عدد صحیح واحد نمایش می‌دهد و همین باعث می‌شود ذخیره‌سازی، مقایسه و انجام محاسبات روی آن ساده باشد. این قالب زمانِ استانداردی است که در بیشتر سیستم‌عامل‌ها، پایگاه‌داده‌ها، APIها و زبان‌های برنامه‌نویسی استفاده می‌شود.

چطور تایم‌استمپ یونیکس را به تاریخ تبدیل کنم؟

تایم‌استمپ را در مبدّل وارد کنید تا تاریخ و زمان متناظر را در UTC و منطقهٔ زمانی محلی شما برگرداند. ابزار به‌طور خودکار تشخیص می‌دهد که مقدار واردشده بر حسب ثانیه است (عدد ۱۰ رقمی) یا میلی‌ثانیه (عدد ۱۳ رقمی). همچنین می‌توانید برعکس هم تبدیل کنید: یک تاریخ و زمان انتخاب کنید تا تایم‌استمپ یونیکس متناظر را بگیرید.

تفاوت زمان یونیکس بر حسب ثانیه و میلی‌ثانیه چیست؟

تایم‌استمپ یونیکسِ اصلی بر حسب ثانیه است. بیشتر سیستم‌های سمت سرور — PHP، Python، Go، Bash و پایگاه‌داده‌های SQL — از ثانیه استفاده می‌کنند. در JavaScript، تابع Date.now() و new Date().getTime() میلی‌ثانیه برمی‌گردانند (ثانیهٔ یونیکس × 1000). تایم‌استمپِ ثانیه‌ای در حال حاضر ۱۰ رقمی است و تایم‌استمپِ میلی‌ثانیه‌ای ۱۳ رقمی. اشتباه گرفتن این دو یکی از باگ‌های رایج است وقتی یک فرانت‌اند JavaScript تایم‌استمپ را به بک‌اندی می‌فرستد که انتظارِ ثانیه را دارد.

چرا زمان یونیکس از ۱ ژانویهٔ ۱۹۷۰ شروع می‌شود؟

این تاریخ اوایل دههٔ ۱۹۷۰ توسط توسعه‌دهندگان یونیکس در Bell Labs به‌عنوان یک نقطهٔ شروعِ نزدیک و راحت انتخاب شد. اهمیت خاصی ندارد جز این‌که یک تاریخ «رُند» و نزدیک به زمان توسعهٔ سیستم بود. سیستم‌های دیگر اِپاک‌های متفاوتی دارند: Windows FILETIME از ۱ ژانویهٔ ۱۶۰۱ شروع می‌شود؛ زمان GPS از ۶ ژانویهٔ ۱۹۸۰؛ و NTP از ۱ ژانویهٔ ۱۹۰۰.

مشکل سال ۲۰۳۸ چیست؟

سیستم‌هایی که تایم‌استمپ یونیکس را به‌صورت عدد صحیح ۳۲-بیتی با علامت ذخیره می‌کنند، فقط می‌توانند تاریخ‌ها را تا ۱۹ ژانویهٔ ۲۰۳۸ (تایم‌استمپ 2,147,483,647) نمایش دهند. بعد از آن مقدار سرریز می‌شود و به یک عدد منفی بزرگ تبدیل می‌شود که تاریخ ۱۹۰۱ را نشان می‌دهد. سیستم‌های ۶۴-بیتی مدرن تحت تأثیر نیستند. با این حال، سیستم‌های نهفتهٔ قدیمی، پایگاه‌داده‌های قدیمی‌تر و نرم‌افزارهای ۳۲-بیتی ممکن است همچنان آسیب‌پذیر باشند و پیش از آن تاریخ نیاز به مهاجرت داشته باشند.

چطور در زبان برنامه‌نویسی‌ام تایم‌استمپ یونیکسِ فعلی را بگیرم؟

JavaScript: Math.floor(Date.now() / 1000). Python: import time; int(time.time()). PHP: time(). Bash: date +%s. PostgreSQL: EXTRACT(EPOCH FROM NOW())::int. MySQL: UNIX_TIMESTAMP(). Go: time.Now().Unix(). همهٔ این‌ها زمان فعلی را به‌صورت تعداد ثانیه از یونیکس اِپاک برمی‌گردانند.

مقالات مرتبط