مبدل زمان یونیکس
تاریخ و زمان تبدیل شده
مبدل زمان یونیکس
مقدمه
زمان یونیکس (که به عنوان زمان POSIX یا زمان Epoch نیز شناخته میشود) سیستمی برای توصیف یک نقطه در زمان است. این زمان تعداد ثانیههایی است که از ۱ ژانویه ۱۹۷۰ (نیمه شب UTC/GMT) گذشته است و ثانیههای کبیسه را در نظر نمیگیرد. زمانهای یونیکس به طور گستردهای در سیستمهای کامپیوتری و زبانهای برنامهنویسی استفاده میشوند زیرا نمایشی فشرده و مستقل از زبان از یک لحظه خاص در زمان را فراهم میکنند.
این مبدل به شما امکان میدهد تا زمان یونیکس را به فرمت تاریخ و زمان قابل خواندن برای انسان تبدیل کنید. این مبدل از هر دو فرمت زمان ۱۲ ساعته (AM/PM) و ۲۴ ساعته پشتیبانی میکند تا نیازهای منطقهای و شخصی مختلف را برآورده کند.
نحوه کار زمانهای یونیکس
زمانهای یونیکس به عنوان تعداد ثانیهها از زمان Epoch یونیکس (۱ ژانویه ۱۹۷۰، ۰۰:۰۰:۰۰ UTC) محاسبه میشوند. این امر آنها را برای محاسبه تفاوتهای زمانی و ذخیره تاریخها در یک فرمت فشرده، به ویژه مفید میسازد.
فرمول ریاضی تبدیل از زمان یونیکس به تاریخ تقویمی شامل چند مرحله است:
۱. با Epoch یونیکس (۱ ژانویه ۱۹۷۰، ۰۰:۰۰:۰۰ UTC) شروع کنید ۲. تعداد ثانیههای موجود در زمان را اضافه کنید ۳. سالهای کبیسه، طولهای متغیر ماهها و دیگر پیچیدگیهای تقویمی را در نظر بگیرید ۴. در صورت نیاز، تنظیمات منطقه زمانی را اعمال کنید
به عنوان مثال، زمان یونیکس ۱۶۰۹۴۵۹۲۰۰
نمایانگر جمعه، ۱ ژانویه ۲۰۲۱، ۰۰:۰۰:۰۰ UTC است.
فرمول تبدیل را میتوان به صورت زیر بیان کرد:
بیشتر زبانهای برنامهنویسی و سیستمهای عامل توابع داخلی برای مدیریت این تبدیل ارائه میدهند و محاسبات پیچیده تقویمی را پنهان میکنند.
گزینههای فرمت زمان
این مبدل دو گزینه فرمت زمان را ارائه میدهد:
۱. فرمت ۲۴ ساعته (که گاهی اوقات "زمان نظامی" نامیده میشود): ساعتها از ۰ تا ۲۳ متغیر است و هیچ نشانه AM/PM وجود ندارد. به عنوان مثال، ۳:۰۰ بعد از ظهر به صورت ۱۵:۰۰ نمایش داده میشود.
۲. فرمت ۱۲ ساعته: ساعتها از ۱ تا ۱۲ متغیر است، با AM (ante meridiem) برای زمانهای از نیمه شب تا ظهر و PM (post meridiem) برای زمانهای از ظهر تا نیمه شب. به عنوان مثال، ۱۵:۰۰ در فرمت ۲۴ ساعته به صورت ۳:۰۰ بعد از ظهر نمایش داده میشود.
انتخاب بین این فرمتها به طور عمده به کنوانسیونهای منطقهای و ترجیحات شخصی بستگی دارد:
- فرمت ۲۴ ساعته به طور معمول در بیشتر اروپا، آمریکای لاتین و آسیا، و همچنین در زمینههای علمی، نظامی و پزشکی در سراسر جهان استفاده میشود.
- فرمت ۱۲ ساعته در ایالات متحده، کانادا، استرالیا و برخی دیگر از کشورهای انگلیسی زبان برای استفاده روزمره رایج است.
موارد حاشیهای و محدودیتها
هنگام کار با زمانهای یونیکس، مهم است که از چندین مورد حاشیهای و محدودیتها آگاه باشید:
۱. زمانهای منفی: اینها تاریخهایی را قبل از Epoch یونیکس (۱ ژانویه ۱۹۷۰) نمایان میکنند. در حالی که از نظر ریاضی معتبر هستند، برخی سیستمها ممکن است زمانهای منفی را به درستی مدیریت نکنند.
۲. مشکل سال ۲۰۳۸: زمانهای یونیکس معمولاً به عنوان اعداد صحیح ۳۲ بیتی ذخیره میشوند که در ۱۹ ژانویه ۲۰۳۸ سرریز خواهد شد. پس از این تاریخ، سیستمهای ۳۲ بیتی قادر به نمایندگی صحیح زمانها نخواهند بود مگر اینکه به نوع عدد صحیح بزرگتری تغییر یابند.
۳. زمانهای بسیار بزرگ: تاریخهای بسیار دور در آینده ممکن است در برخی سیستمها قابل نمایندگی نباشند یا به طور نامنظم مدیریت شوند.
۴. ثانیههای کبیسه: زمان یونیکس ثانیههای کبیسه را در نظر نمیگیرد، که به طور گاهبهگاه به UTC اضافه میشوند تا از چرخش نامنظم زمین جبران کند. این بدان معناست که زمان یونیکس به طور دقیق با زمان نجومی همزمان نیست.
۵. ملاحظات منطقه زمانی: زمانهای یونیکس لحظاتی را در UTC نمایان میکنند. تبدیل به زمان محلی نیاز به اطلاعات منطقه زمانی اضافی دارد.
۶. صرفهجویی در نور روز: هنگام تبدیل زمانها به زمان محلی، باید پیچیدگیهای انتقالهای صرفهجویی در نور روز را در نظر گرفت.
موارد استفاده
زمانهای یونیکس در برنامههای متعددی در سراسر محاسبات و مدیریت دادهها استفاده میشوند:
۱. سوابق پایگاه داده: زمانها معمولاً برای ثبت زمان ایجاد یا ویرایش ورودیها استفاده میشوند.
۲. توسعه وب: هدرهای HTTP، کوکیها و مکانیزمهای کش معمولاً از زمانهای یونیکس استفاده میکنند.
۳. فایلهای گزارش: گزارشهای سیستم معمولاً رویدادها را با زمانهای یونیکس ثبت میکنند تا ترتیب زمانی دقیقی داشته باشند.
۴. سیستمهای کنترل نسخه: Git و دیگر سیستمهای VCS از زمانها برای ثبت زمانی که کامیتها انجام شدهاند، استفاده میکنند.
۵. پاسخهای API: بسیاری از APIهای وب شامل زمانها در پاسخهای خود برای نشان دادن زمانی که دادهها تولید شدهاند یا منابع آخرین بار تغییر یافتهاند، میباشند.
۶. سیستمهای فایل: زمانهای ایجاد و ویرایش فایل معمولاً به عنوان زمانهای یونیکس ذخیره میشوند.
۷. مدیریت جلسه: برنامههای وب از زمانها برای تعیین اینکه چه زمانی باید جلسات کاربر منقضی شوند، استفاده میکنند.
۸. تحلیل داده: زمانها یک روش استاندارد برای کار با دادههای زمانی در برنامههای تحلیلی فراهم میکنند.
جایگزینها
در حالی که زمانهای یونیکس به طور گستردهای استفاده میشوند، فرمتهای نمایشی زمان جایگزین دیگری وجود دارد که ممکن است در برخی زمینهها مناسبتر باشد:
۱. ISO 8601: یک فرمت رشتهای استاندارد (به عنوان مثال، "۲۰۲۱-۰۱-۰۱T۰۰:۰۰:۰۰Z") که قابل خواندن برای انسان است و در عین حال قابلیت مرتبسازی را حفظ میکند. این فرمت معمولاً برای تبادل داده و برنامههای کاربر پسند ترجیح داده میشود.
۲. RFC 3339: یک پروفایل از ISO 8601 که در پروتکلهای اینترنتی استفاده میشود و الزامات فرمتگذاری سختتری دارد.
۳. فرمتهای قابل خواندن برای انسان: رشتههای تاریخ محلی (به عنوان مثال، "۱ ژانویه ۲۰۲۱") برای تعامل مستقیم با کاربر مناسبتر هستند اما برای محاسبات کمتر مناسباند.
۴. FILETIME مایکروسافت: یک مقدار ۶۴ بیتی که تعداد دورههای ۱۰۰ نانوثانیهای از ۱ ژانویه ۱۶۰۱ را نمایان میکند و در سیستمهای ویندوز استفاده میشود.
۵. عدد روز جولین: در نجوم و برخی برنامههای علمی استفاده میشود و روزها را از ۱ ژانویه ۴۷۱۳ قبل از میلاد شمارش میکند.
انتخاب فرمت زمان بستگی به عواملی مانند:
- دقت مورد نیاز
- نیازهای قابل خواندن برای انسان
- محدودیتهای ذخیرهسازی
- سازگاری با سیستمهای موجود
- دامنه تاریخهایی که باید نمایان شوند
تاریخچه
مفهوم زمان یونیکس با توسعه سیستم عامل یونیکس در آزمایشگاههای بل در اواخر دهه ۱۹۶۰ و اوایل دهه ۱۹۷۰ به وجود آمد. تصمیم به استفاده از ۱ ژانویه ۱۹۷۰ به عنوان Epoch تا حدی دلخواه بود اما برای آن زمان عملی بود - این تاریخ به اندازه کافی نزدیک بود تا نیاز به ذخیرهسازی تاریخهای مورد علاقه را کاهش دهد اما به اندازه کافی دور بود تا برای دادههای تاریخی مفید باشد.
پیادهسازی اولیه از یک عدد صحیح ۳۲ بیتی برای ذخیره تعداد ثانیهها استفاده میکرد که برای عمر مورد انتظار سیستمهای یونیکس در آن زمان کافی بود. با این حال، این تصمیم منجر به مشکل سال ۲۰۳۸ (که گاهی اوقات به آن "Y2K38" یا "بگ یونیکس هزاره" میگویند) شد، زیرا اعداد صحیح ۳۲ بیتی تنها میتوانند تاریخها را تا ۱۹ ژانویه ۲۰۳۸ نمایان کنند (۰۳:۱۴:۰۷ UTC).
با محبوبیت یافتن یونیکس و سیستمهای مشابه یونیکس، زمان یونیکس به یک استاندارد غیررسمی برای نمایندگی زمان در محاسبات تبدیل شد. این استاندارد توسط زبانهای برنامهنویسی، پایگاههای داده و برنامههای متعددی پذیرفته شد و فراتر از محیط اصلی یونیکس گسترش یافت.
سیستمهای مدرن به طور فزایندهای از اعداد صحیح ۶۴ بیتی برای زمانها استفاده میکنند که دامنه قابل نمایندگی را به حدود ۲۹۲ میلیارد سال در هر دو جهت از Epoch گسترش میدهد و به طور مؤثری مشکل سال ۲۰۳۸ را حل میکند. با این حال، سیستمها و برنامههای قدیمی ممکن است هنوز در معرض خطر باشند.
سادگی و کارایی زمان یونیکس باعث شده است که این مفهوم همچنان مرتبط بماند، با وجود توسعه فرمتهای نمایشی زمان پیچیدهتر. این مفهوم همچنان یک مفهوم اساسی در محاسبات است که زیرساخت دیجیتال ما را تشکیل میدهد.
مثالهای کد
در اینجا مثالهایی از نحوه تبدیل زمانهای یونیکس به تاریخهای قابل خواندن برای انسان در زبانهای مختلف برنامهنویسی آورده شده است:
// تبدیل زمان در جاوااسکریپت
function convertUnixTimestamp(timestamp, use12Hour = false) {
// ایجاد یک شیء تاریخ جدید (جاوااسکریپت از میلیثانیهها استفاده میکند)
const date = new Date(timestamp * 1000);
// گزینههای فرمت
const options = {
year: 'numeric',
month: 'long',
day: 'numeric',
weekday: 'long',
hour: use12Hour ? 'numeric' : '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: use12Hour
};
// تبدیل به رشته با استفاده از فرمت محلی
return date.toLocaleString(undefined, options);
}
// مثال استفاده
const timestamp = 1609459200; // ۱ ژانویه ۲۰۲۱ ۰۰:۰۰:۰۰ UTC
console.log(convertUnixTimestamp(timestamp, false)); // فرمت ۲۴ ساعته
console.log(convertUnixTimestamp(timestamp, true)); // فرمت ۱۲ ساعته
مدیریت موارد حاشیهای
هنگام کار با زمانهای یونیکس، مهم است که موارد حاشیهای را به درستی مدیریت کنید. در اینجا مثالهایی از مدیریت برخی موارد حاشیهای رایج آورده شده است:
// مدیریت موارد حاشیهای در جاوااسکریپت
function safeConvertTimestamp(timestamp, use12Hour = false) {
// بررسی اینکه آیا زمان معتبر است
if (timestamp === undefined || timestamp === null || isNaN(timestamp)) {
return "زمان نامعتبر";
}
// بررسی زمانهای منفی (تاریخهای قبل از ۱۹۷۰)
if (timestamp < 0) {
// برخی مرورگرها ممکن است زمانهای منفی را به درستی مدیریت نکنند
// از رویکردی قویتر برای تاریخهای قبل از ۱۹۷۰ استفاده کنید
const date = new Date(timestamp * 1000);
if (isNaN(date.getTime())) {
return "تاریخ نامعتبر (قبل از ۱۹۷۰)";
}
}
// بررسی مشکل Y2K38 (برای سیستمهای ۳۲ بیتی)
const maxInt32 = 2147483647; // حداکثر مقدار برای عدد صحیح ۳۲ بیتی
if (timestamp > maxInt32) {
// در نظر بگیرید که برای زمانهای بسیار بزرگ از BigInt در جاوااسکریپت مدرن استفاده کنید
console.warn("زمان از حد مجاز عدد صحیح ۳۲ بیتی فراتر میرود (مشکل Y2K38)");
}
// ادامه با تبدیل عادی
try {
const date = new Date(timestamp * 1000);
const options = {
year: 'numeric',
month: 'long',
day: 'numeric',
weekday: 'long',
hour: use12Hour ? 'numeric' : '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: use12Hour
};
return date.toLocaleString(undefined, options);
} catch (error) {
return "خطا در تبدیل زمان: " + error.message;
}
}
منابع
۱. "زمان یونیکس." ویکیپدیا، بنیاد ویکیمدیا، https://en.wikipedia.org/wiki/Unix_time
۲. "مشکل سال ۲۰۳۸." ویکیپدیا، بنیاد ویکیمدیا، https://en.wikipedia.org/wiki/Year_2038_problem
۳. اولسون، آرتور دیوید. "پیچیدگیهای زمان تقویمی." گروه باز، https://www.usenix.org/legacy/events/usenix01/full_papers/olson/olson.pdf
۴. "ISO 8601." ویکیپدیا، بنیاد ویکیمدیا، https://en.wikipedia.org/wiki/ISO_8601
۵. "RFC 3339: تاریخ و زمان در اینترنت: زمانها." گروه مهندسی اینترنت (IETF)، https://tools.ietf.org/html/rfc3339
۶. کرنیگان، برایان و ریچی، دنیس م. "زبان برنامهنویسی C." انتشارات پرنتیس هال، ۱۹۸۸.