Unix Timestamp بدون سردرگمی
از سه توسعهدهنده بپرسید ساعت چند است و بسته به اینکه کجا نشستهاند ممکن است سه جواب بگیرید. از یک Unix timestamp بپرسید و دقیقاً یک عدد میگیرید، یکسان برای همه روی کره زمین. همین عدد صحیح یکتاست که زمان epoch را در پشت تقریباً هر فایل لاگ، ردیف پایگاه داده و پاسخ API که تا به حال لمس خواهید کرد پنهانی پشتیبانی میکند. این صفحه توضیح میدهد این عدد به چه معناست، چگونه آن را در هر دو جهت بخوانید، و کجا معمولاً مشکلساز میشود.

Unix time واقعاً چیست
یک Unix timestamp تعداد ثانیههایی است که از ۰۰:۰۰:۰۰ UTC در ۱ ژانویه ۱۹۷۰ سپری شده، بدون احتساب ثانیههای کبیسه. آن لحظه epoch نامیده میشود و توسط مهندسان اولیه Unix صرفاً به این دلیل انتخاب شد که یک تاریخ گرد مناسب برای شمارش از آن بود. در epoch مقدار دقیقاً 0 است. هر ثانیه پس از آن یکی اضافه میکند، بنابراین عدد فقط بزرگ میشود. تاریخهای قبل از ۱۹۷۰ هم کاملاً معتبرند و به صورت اعداد صحیح منفی بیان میشوند.
این مفهوم را POSIX time یا به طور کلی epoch time هم مینامند. هر چه برچسبش باشد، مکانیزم یکسان است: یک شمارنده همیشه در حال افزایش از ثانیهها. چون یک عدد صحیح ساده است نه یک رشته فرمتشده، یک کامپیوتر میتواند آن را در چند بایت ذخیره کند و دو تا از آنها را با یک تفریق مقایسه کند.
ثانیه، میلیثانیه و همانندها
Unix time کلاسیک ثانیههای کامل را میشمارد که عدد دهرقمی آشنایی میدهد که امروز میبینید. اما بسیاری از محیطها به دقت بیشتری نیاز دارند. JavaScript، برای مثال، در میلیثانیه کار میکند و یک مقدار سیزدهرقمی تولید میکند، و برخی سیستمها به میکروثانیه یا نانوثانیه میروند. یک قانون سرانگشتی قابل اعتماد: یک عدد دهرقمی ثانیه است، سیزده رقم میلیثانیه. اگر تاریخ تبدیلشدهتان جایی حدود ۱۹۷۰ افتاد وقتی انتظار روز جاری داشتید، احتمالاً میلیثانیه را به یک فیلد ثانیه دادهاید یا برعکس. مبدل ما بزرگی را به صورت خودکار تشخیص میدهد تا نادراً مجبور به حدس زدن باشید.
چرا توسعهدهندگان به آن تکیه میکنند
مزیت بزرگ این است که یک timestamp بیطرف از نظر منطقه زمانی است. عدد صحیح 1735689600 به همان لحظه در توکیو، برلین و سائوپائولو اشاره میکند. ذخیره این عدد به جای یک رشته محلی فرمتشده یعنی هرگز نباید نگران باشید این مقدار به کدام ساعت تعلق داشته. مرتبسازی هم بسیار ساده است، چون ترتیب زمانی فقط ترتیب عددی است، بنابراین یک ایندکس پایگاه داده روی یک ستون timestamp رویدادها را بدون هیچ تجزیهای به درستی مرتب میکند. حساب هم به همان اندازه تمیز است: فاصله بین دو رویداد یک تفریق است، و اضافه کردن یک روز یعنی اضافه کردن 86400. همین خواص دقیقاً به همین دلیل است که لاگها، توکنها، کشها و صفهای پیام همه به زمان epoch متوسل میشوند.
تبدیل در هر دو جهت
رفتن از یک timestamp به یک تاریخ انسانی یعنی گرفتن شمارش ثانیهها و پروجکت کردن آن روی یک تقویم، سپس فرمتبندی آن در هر منطقه زمانی که اهمیت میدهید. رفتن به مسیر دیگر، یک سال، ماه، روز و زمان میگیرید، تصمیم میگیرید در کدام منطقه زمانی بیان شده، و آن را به ثانیه از epoch برمیگردانید. ابزار ما هر دو جهت را فوری و کاملاً در مرورگر شما انجام میدهد، بنابراین هیچ چیزی که الصاق میکنید دستگاه شما را ترک نمیکند. یک عدد الصاق کنید تا رمزگشایی شود، یا یک تاریخ انتخاب کنید تا رمزگذاری شود، و نتیجه را در UTC و زمان محلی شما همزمان بخوانید.

UTC در برابر زمان محلی، تله کلاسیک
خود timestamp هیچ منطقه زمانی ندارد؛ همیشه به UTC متصل است. سردرگمی فقط وقتی آن را نمایش میدهید ظاهر میشود. اگر 1700000000 را تبدیل کنید و صفحه شما یک ساعت عصر نشان دهد در حالی که یک همکار در کشور دیگری بعدازظهر میبیند، چیزی خراب نیست؛ هر دو به همان لحظه نگاه میکنید که در ساعتهای محلی مختلف رندر شده. باگها وقتی کد یک تاریخ محلی را انگار UTC است میخواند، یا یک زمان ساعت دیواری را بدون ثبت offset آن ضربه میزند، نفوذ میکنند. عادت ایمن این است که UTC را ذخیره و منتقل کنید، و فقط در آخرین لحظه که مقدار را به یک انسان نشان میدهید یک offset محلی اعمال کنید. در صورت شک، در برابر خط UTC در مبدل نه خط محلی خودتان مقایسه کنید.
مشکل سال ۲۰۳۸
بسیاری از سیستمهای قدیمیتر Unix time را در یک عدد صحیح ۳۲ بیتی علامتدار ذخیره میکردند. آن فیلد یک ثانیه پس از ۰۳:۱۴:۰۷ UTC در ۱۹ ژانویه ۲۰۳۸ فضا تمام میکند، وقتی شمارنده سرریز میشود و به یک عدد منفی میرسد که به طور بالقوه تاریخها را به ۱۹۰۱ برمیگرداند. این همان خانواده مشکل Y2K است. خبر خوب این است که سیستمعاملها و زبانهای مدرن تا حد زیادی به timestampهای ۶۴ بیتی منتقل شدهاند که تقریباً ۲۹۲ میلیارد سال دیگر سرریز نخواهند شد، بنابراین برای کدهای جدید این بیشتر یک کنجکاوی تاریخی ارزشمند برای دانستن است تا یک فوریت.
برای کمکهای بیشتر مبتنی بر مرورگر ابزارهای توسعهدهنده ما را ببینید، و اگر نیاز دارید خود اعداد را کار کنید، ماشینحسابها یک کلیک دورند.
پرسشهای متداول
Unix timestamp چیست؟
تعداد ثانیههایی است که از ۰۰:۰۰:۰۰ UTC در ۱ ژانویه ۱۹۷۰ گذشته، بدون احتساب ثانیههای کبیسه. آن لحظه شروع epoch نامیده میشود و شمارش فقط با گذشت زمان افزایش مییابد.
چرا عددم به تاریخی نزدیک ۱۹۷۰ تبدیل میشود؟
احتمالاً ثانیه و میلیثانیه را با هم اشتباه گرفتهاید. یک عدد دهرقمی ثانیه است و یک عدد سیزدهرقمی میلیثانیه. دادن میلیثانیه به یک فیلد ثانیه زمان ظاهری را تقریباً هزار تقسیم میکند و شما را نزدیک epoch فرود میآورد.
آیا یک Unix timestamp منطقه زمانی دارد؟
خیر. مقدار همیشه به UTC متصل است. یک منطقه زمانی فقط وقتی timestamp را به عنوان یک تاریخ قابل خواندن توسط انسان نمایش میدهید وارد تصویر میشود، به همین دلیل است که همان عدد میتواند برای افراد مختلف زمانهای دیواری متفاوتی نشان دهد.
چگونه یک تاریخ را به timestamp برگردانم؟
سال، ماه، روز و زمان را وارد کنید، تصمیم بگیرید این تاریخ در کدام منطقه زمانی بیان شده، و ابزار آن را به ثانیه از epoch برمیگرداند. میتوانید هر دو جهت را فوراً در مرورگرتان روی این صفحه انجام دهید.
مشکل سال ۲۰۳۸ چیست؟
سیستمهایی که Unix time را در یک عدد صحیح ۳۲ بیتی علامتدار ذخیره میکنند یک ثانیه پس از ۰۳:۱۴:۰۷ UTC در ۱۹ ژانویه ۲۰۳۸ سرریز میشوند. timestampهای ۶۴ بیتی مدرن این را برای میلیاردها سال اجتناب میکنند، بنابراین اکثر نرمافزارهای فعلی تحت تاثیر نیستند.
آیا دادهام به سرور ارسال میشود؟
خیر. تبدیل کاملاً در مرورگر شما اجرا میشود، بنابراین هر timestamp یا تاریخی که الصاق میکنید روی دستگاه خودتان میماند.
