مبدل تایماستمپ یونیکس به تاریخ: پشتیبانی از فرمت ۱۲/۲۴ ساعته
تایماستمپهای یونیکس را به تاریخ و زمان قابل خواندن برای انسان تبدیل کنید. با این ابزار مبدل ساده و کاربرپسند، بین فرمتهای زمانی ۱۲ ساعته و ۲۴ ساعته انتخاب کنید.
مبدل زمان یونیکس
تاریخ و زمان تبدیل شده
مستندات
مبدل زمان یونیکس
مقدمه
زمان یونیکس (که به عنوان زمان POSIX یا زمان Epoch نیز شناخته میشود) سیستمی برای توصیف یک نقطه در زمان است. این زمان تعداد ثانیههایی است که از ۱ ژانویه ۱۹۷۰ (نیمه شب UTC/GMT) گذشته است، بدون احتساب ثانیههای کبیسه. زمانهای یونیکس به طور گستردهای در سیستمهای کامپیوتری و زبانهای برنامهنویسی استفاده میشوند زیرا نمایشی فشرده و مستقل از زبان از یک لحظه خاص در زمان را ارائه میدهند.
این مبدل زمان به تاریخ به طور خودکار زمانهای مختلف با طولهای مختلف را شناسایی و پردازش میکند، از جمله دقت میکروثانیه (۱۶ رقم)، دقت میلیثانیه (۱۳ رقم) و زمانهای یونیکس استاندارد (۱۰ رقم). این ابزار فرمت زمان را بر اساس طول ورودی شناسایی میکند، آن را به فرمت تاریخ و زمان قابل خواندن انسانی تبدیل میکند و نتیجه را بدون نیاز به مشخص کردن نوع زمان توسط کاربران نمایش میدهد. این ابزار از هر دو فرمت زمان ۱۲ ساعته (AM/PM) و ۲۴ ساعته پشتیبانی میکند تا نیازهای مختلف منطقهای و شخصی را برآورده کند.
نحوه کار زمانهای یونیکس
زمانهای یونیکس به عنوان تعداد ثانیهها از زمان Epoch یونیکس (۱ ژانویه ۱۹۷۰، ۰۰:۰۰:۰۰ UTC) محاسبه میشوند. این ویژگی آنها را برای محاسبه تفاوتهای زمانی و ذخیره تاریخها در یک فرمت فشرده به خصوص مفید میسازد.
فرمول ریاضی تبدیل از زمان یونیکس به تاریخ تقویمی شامل چندین مرحله است:
۱. با Epoch یونیکس (۱ ژانویه ۱۹۷۰، ۰۰:۰۰:۰۰ UTC) شروع کنید ۲. تعداد ثانیههای موجود در زمان را اضافه کنید ۳. به سالهای کبیسه، طولهای متغیر ماهها و سایر پیچیدگیهای تقویمی توجه کنید ۴. در صورت نیاز تنظیمات منطقه زمانی را اعمال کنید
به عنوان مثال، زمان یونیکس ۱۶۰۹۴۵۹۲۰۰
نمایانگر جمعه، ۱ ژانویه ۲۰۲۱، ۰۰:۰۰:۰۰ UTC است.
فرمول تبدیل میتواند به صورت زیر بیان شود:
بیشتر زبانهای برنامهنویسی و سیستمهای عامل توابع داخلی برای انجام این تبدیل ارائه میدهند که محاسبات پیچیده تقویمی را پنهان میکند.
فرمتهای زمان و شناسایی خودکار
مبدل ما از سه فرمت زمان رایج پشتیبانی میکند که بر اساس تعداد ارقام به طور خودکار شناسایی میشوند:
۱. زمان یونیکس استاندارد (۱۰ رقم): نمایانگر ثانیهها از Epoch یونیکس. مثال: ۱۶۰۹۴۵۹۲۰۰
(۱ ژانویه ۲۰۲۱، ۰۰:۰۰:۰۰ UTC)
۲. دقت میلیثانیه (۱۳ رقم): نمایانگر میلیثانیهها از Epoch یونیکس. مثال: ۱۶۰۹۴۵۹۲۰۰۰۰
(۱ ژانویه ۲۰۲۱، ۰۰:۰۰:۰۰ UTC)
۳. دقت میکروثانیه (۱۶ رقم): نمایانگر میکروثانیهها از Epoch یونیکس. مثال: ۱۶۰۹۴۵۹۲۰۰۰۰۰۰۰۰
(۱ ژانویه ۲۰۲۱، ۰۰:۰۰:۰۰ UTC)
شناسایی خودکار با تجزیه و تحلیل طول ورودی کار میکند:
- اگر ورودی ۱۰ رقم داشته باشد، به عنوان زمان یونیکس استاندارد (ثانیهها) در نظر گرفته میشود
- اگر ورودی ۱۳ رقم داشته باشد، به عنوان زمان میلیثانیهای در نظر گرفته میشود
- اگر ورودی ۱۶ رقم داشته باشد، به عنوان زمان میکروثانیهای در نظر گرفته میشود
این شناسایی خودکار نیاز به مشخص کردن نوع زمان توسط کاربران را از بین میبرد و ابزار را کاربرپسندتر و کارآمدتر میسازد.
گزینههای فرمت زمان
این مبدل دو گزینه فرمت زمان ارائه میدهد:
۱. فرمت ۲۴ ساعته (که گاهی به عنوان "زمان نظامی" نیز شناخته میشود): ساعتها از ۰ تا ۲۳ متغیر هستند و هیچ نشانه AM/PM وجود ندارد. به عنوان مثال، ساعت ۳:۰۰ بعدازظهر به صورت ۱۵:۰۰ نمایش داده میشود.
۲. فرمت ۱۲ ساعته: ساعتها از ۱ تا ۱۲ متغیر هستند، با AM (ante meridiem) برای زمانهای از نیمه شب تا ظهر و PM (post meridiem) برای زمانهای از ظهر تا نیمه شب. به عنوان مثال، ۱۵:۰۰ در فرمت ۲۴ ساعته به صورت ۳:۰۰ بعدازظهر نمایش داده میشود.
انتخاب بین این فرمتها عمدتاً یک مسئله از نظر کنوانسیون منطقهای و ترجیحات شخصی است:
- فرمت ۲۴ ساعته معمولاً در بیشتر اروپا، آمریکای لاتین و آسیا، همچنین در زمینههای علمی، نظامی و پزشکی در سطح جهانی استفاده میشود.
- فرمت ۱۲ ساعته در ایالات متحده، کانادا، استرالیا و برخی کشورهای دیگر انگلیسیزبان برای استفاده روزمره رایج است.
موارد حاشیهای و محدودیتها
هنگام کار با زمانهای یونیکس با دقتهای مختلف، مهم است که از چندین مورد حاشیهای و محدودیتها آگاه باشید:
۱. زمانهای منفی: اینها نمایانگر تاریخهای قبل از Epoch یونیکس (۱ ژانویه ۱۹۷۰) هستند. در حالی که از نظر ریاضی معتبر هستند، برخی سیستمها ممکن است نتوانند زمانهای منفی را به درستی مدیریت کنند. این موضوع شامل همه سه فرمت زمان میشود.
۲. مسئله سال ۲۰۳۸: زمانهای یونیکس استاندارد (۱۰ رقم) معمولاً به عنوان اعداد صحیح ۳۲ بیتی ذخیره میشوند، که در ۱۹ ژانویه ۲۰۳۸ سرریز خواهند شد. پس از این تاریخ، سیستمهای ۳۲ بیتی قادر به نمایش زمانها به درستی نخواهند بود مگر اینکه به نوع عددی بزرگتری تغییر یابند.
۳. ملاحظات دقت:
- زمانهای استاندارد (۱۰ رقم) دقت سطح ثانیه را دارند که برای بیشتر برنامههای روزمره کافی است.
- زمانهای میلیثانیهای (۱۳ رقم) دقت ۱۰۰۰ برابر بیشتری را ارائه میدهند که برای برنامههای نیازمند زمانبندی دقیقتر مفید است.
- زمانهای میکروثانیهای (۱۶ رقم) دقت بیشتری (۱/۱۰۰۰۰۰۰ ثانیه) را ارائه میدهند که برای محاسبات با عملکرد بالا، برنامههای علمی و برخی معاملات مالی ضروری است.
۴. زمانهای بسیار بزرگ: تاریخهای بسیار دور ممکن است در برخی سیستمها قابل نمایش نباشند یا به طور نامنظم مدیریت شوند. این موضوع به ویژه برای زمانهای میلیثانیهای و میکروثانیهای که از مقادیر عددی بزرگتری استفاده میکنند، مرتبط است.
۵. ثانیههای کبیسه: زمان یونیکس به ثانیههای کبیسه توجه نمیکند، که به طور گاهبهگاه به UTC اضافه میشوند تا به چرخش نامنظم زمین جبران کنند. این بدان معناست که زمان یونیکس به طور دقیق با زمان نجومی همزمان نیست.
۶. ملاحظات منطقه زمانی: زمانهای یونیکس نمایانگر لحظاتی در UTC هستند. تبدیل به زمان محلی نیاز به اطلاعات اضافی منطقه زمانی دارد.
۷. زمان تابستانی: هنگام تبدیل زمانها به زمان محلی، باید پیچیدگیهای تغییرات زمان تابستانی را در نظر گرفت.
۸. سردرگمی در فرمت زمان: بدون شناسایی مناسب، یک زمان میلیثانیهای ۱۳ رقمی ممکن است به عنوان یک تاریخ بسیار دورتر اشتباه تفسیر شود اگر به عنوان زمان مبتنی بر ثانیه در نظر گرفته شود. مبدل ما این موضوع را با شناسایی خودکار فرمت بر اساس طول رقمها جلوگیری میکند.
موارد استفاده
زمانهای یونیکس با دقتهای مختلف در برنامههای متعددی در سراسر محاسبات و مدیریت دادهها استفاده میشوند:
۱. سوابق پایگاه داده: زمانها معمولاً برای ثبت زمانی که ورودیها ایجاد یا ویرایش شدهاند، استفاده میشوند.
- زمانهای استاندارد (۱۰ رقم) معمولاً برای برنامههای عمومی پایگاه داده کافی هستند.
- زمانهای میلیثانیهای (۱۳ رقم) زمانی استفاده میشوند که ترتیب دقیقتری از رویدادها مورد نیاز است.
۲. توسعه وب: هدرهای HTTP، کوکیها و مکانیزمهای کش معمولاً از زمانهای یونیکس استفاده میکنند.
- تابع
Date.now()
در جاوااسکریپت زمانهای میلیثانیهای (۱۳ رقم) را برمیگرداند.
۳. فایلهای لاگ: لاگهای سیستم معمولاً رویدادها را با زمانهای یونیکس برای ترتیب دقیق زمانی ثبت میکنند.
- سیستمهای لاگبرداری با فرکانس بالا ممکن است از دقت میلیثانیهای یا میکروثانیهای استفاده کنند.
۴. سیستمهای کنترل نسخه: Git و سایر VCSها از زمانها برای ثبت زمانی که کامیتها انجام شدهاند، استفاده میکنند.
۵. پاسخهای API: بسیاری از APIهای وب شامل زمانها در پاسخهای خود برای نشان دادن زمانی که دادهها تولید شدهاند یا زمانی که منابع آخرین بار ویرایش شدهاند، هستند.
- APIهای REST معمولاً از زمانهای میلیثانیهای استفاده میکنند.
۶. سیستمهای فایل: زمانهای ایجاد و ویرایش فایلها معمولاً به عنوان زمانهای یونیکس ذخیره میشوند.
۷. مدیریت جلسه: برنامههای وب از زمانها برای تعیین زمانی که جلسات کاربری باید منقضی شوند، استفاده میکنند.
۸. تحلیل داده: زمانها یک روش استاندارد برای کار با دادههای زمانی در برنامههای تحلیلی ارائه میدهند.
۹. معاملات با فرکانس بالا: سیستمهای مالی معمولاً به دقت میکروثانیهای (۱۶ رقم) برای ترتیب دقیق معاملات نیاز دارند.
۱۰. اندازهگیریهای علمی: تجهیزات تحقیقاتی ممکن است مشاهدات را با دقت میکروثانیهای برای تحلیل دقیق زمانی ثبت کنند.
جایگزینها
در حالی که زمانهای یونیکس به طور گستردهای استفاده میشوند، فرمتهای نمایشی زمان جایگزین دیگری وجود دارند که ممکن است در برخی زمینهها مناسبتر باشند:
۱. ISO 8601: یک فرمت رشتهای استاندارد (مانند "۲۰۲۱-۰۱-۰۱T۰۰:۰۰:۰۰Z") که قابل خواندن برای انسان است و در عین حال قابلیت مرتبسازی را حفظ میکند. این فرمت معمولاً برای تبادل داده و برنامههای کاربرپسند ترجیح داده میشود.
۲. RFC 3339: یک پروفایل از ISO 8601 که در پروتکلهای اینترنتی استفاده میشود و الزامات فرمت سختتری دارد.
۳. فرمتهای قابل خواندن برای انسان: رشتههای تاریخ محلی (مانند "۱ ژانویه ۲۰۲۱") برای تعامل مستقیم با کاربر مناسبتر هستند، اما برای محاسبات کمتر مناسباند.
۴. FILETIME مایکروسافت: یک مقدار ۶۴ بیتی که تعداد فواصل ۱۰۰ نانوثانیهای از ۱ ژانویه ۱۶۰۱ را نمایان میکند و در سیستمهای ویندوز استفاده میشود.
۵. شماره روز ژولیان: در نجوم و برخی برنامههای علمی استفاده میشود و روزها را از ۱ ژانویه ۴۷۱۳ قبل از میلاد شمارش میکند.
انتخاب فرمت زمان به عواملی مانند:
- دقت مورد نیاز
- نیازهای قابل خواندن برای انسان
- محدودیتهای ذخیرهسازی
- سازگاری با سیستمهای موجود
- دامنه تاریخهایی که باید نمایان شوند
تاریخچه
مفهوم زمان یونیکس با توسعه سیستم عامل یونیکس در آزمایشگاههای بل در اواخر دهه ۱۹۶۰ و اوایل دهه ۱۹۷۰ به وجود آمد. تصمیم به استفاده از ۱ ژانویه ۱۹۷۰ به عنوان Epoch تا حدی دلخواه بود اما برای زمان آن زمان عملی بود - به اندازه کافی نزدیک بود تا نیاز به ذخیرهسازی تاریخهای مورد علاقه را کاهش دهد اما به اندازه کافی دور بود تا برای دادههای تاریخی مفید باشد.
پیادهسازی اولیه از یک عدد صحیح ۳۲ بیتی برای ذخیره تعداد ثانیهها استفاده کرد که برای عمر مورد انتظار سیستمهای یونیکس در آن زمان کافی بود. با این حال، این تصمیم منجر به مشکل سال ۲۰۳۸ (که گاهی به عنوان "Y2K38" یا "بگ یونیکس هزاره" نیز شناخته میشود) شد، زیرا زمانهای یونیکس استاندارد (۱۰ رقم) معمولاً به عنوان اعداد صحیح ۳۲ بیتی ذخیره میشوند که تا ۱۹ ژانویه ۲۰۳۸ قابل نمایش هستند.
با تکامل نیازهای محاسباتی، زمانهای با دقت بالاتر به یک ضرورت تبدیل شدند:
-
دقت میلیثانیه (۱۳ رقم) با افزایش محاسبات تعاملی و نیاز به اندازهگیری پاسخگویی رابط کاربری رایج شد.
-
دقت میکروثانیه (۱۶ رقم) با برنامههای محاسباتی با عملکرد بالا و سیستمهای نیازمند زمانبندی بسیار دقیق به وجود آمد.
با محبوبیت سیستمهای یونیکس و شبیه به یونیکس، زمان یونیکس به یک استاندارد غیررسمی برای نمایندگی زمان در محاسبات تبدیل شد. این استاندارد توسط بسیاری از زبانهای برنامهنویسی، پایگاههای داده و برنامهها پذیرفته شد و فراتر از محیط یونیکس اولیه گسترش یافت.
سیستمهای مدرن به طور فزایندهای از اعداد صحیح ۶۴ بیتی برای زمانها استفاده میکنند که دامنه قابل نمایش را به تقریباً ۲۹۲ میلیارد سال در هر دو سمت Epoch گسترش میدهد و به طور مؤثری مشکل سال ۲۰۳۸ را حل میکند. با این حال، سیستمها و برنامههای قدیمی ممکن است هنوز آسیبپذیر باشند.
سادگی و کاربرد زمان یونیکس باعث شده است که این مفهوم همچنان مرتبط باقی بماند، با وجود توسعه فرمتهای نمایشی زمان پیچیدهتر. این مفهوم همچنان یک مفهوم اساسی در محاسبات است که زیرساخت دیجیتال ما را پایهگذاری میکند.
مثالهای کد
در اینجا مثالهایی از نحوه تبدیل زمانهای یونیکس با دقتهای مختلف به تاریخهای قابل خواندن انسانی در زبانهای مختلف برنامهنویسی آورده شده است:
1// تبدیل زمان جاوااسکریپت با شناسایی خودکار فرمت
2function convertTimestamp(timestamp, use12Hour = false) {
3 // تبدیل رشته به عدد در صورت نیاز
4 const numericTimestamp = Number(timestamp);
5
6 // شناسایی فرمت زمان بر اساس طول رقم
7 let date;
8 if (timestamp.length === 16) {
9 // دقت میکروثانیه (تقسیم بر ۱۰۰۰۰۰۰ برای به دست آوردن ثانیهها)
10 date = new Date(numericTimestamp / 1000);
11 console.log("شناسایی شده: زمان میکروثانیهای");
12 } else if (timestamp.length === 13) {
13 // دقت میلیثانیه
14 date = new Date(numericTimestamp);
15 console.log("شناسایی شده: زمان میلیثانیهای");
16 } else if (timestamp.length === 10) {
17 // زمان یونیکس استاندارد (ثانیهها)
18 date = new Date(numericTimestamp * 1000);
19 console.log("شناسایی شده: زمان یونیکس استاندارد (ثانیهها)");
20 } else {
21 throw new Error("فرمت زمان نامعتبر. انتظار میرود ۱۰، ۱۳ یا ۱۶ رقم باشد.");
22 }
23
24 // گزینههای فرمت
25 const options = {
26 year: 'numeric',
27 month: 'long',
28 day: 'numeric',
29 weekday: 'long',
30 hour: use12Hour ? 'numeric' : '2-digit',
31 minute: '2-digit',
32 second: '2-digit',
33 hour12: use12Hour
34 };
35
36 // تبدیل به رشته با استفاده از فرمت محلی
37 return date.toLocaleString(undefined, options);
38}
39
40// مثال استفاده
41try {
42 // زمان یونیکس استاندارد (۱۰ رقم)
43 console.log(convertTimestamp("1609459200", false));
44
45 // دقت میلیثانیه (۱۳ رقم)
46 console.log(convertTimestamp("1609459200000", false));
47
48 // دقت میکروثانیه (۱۶ رقم)
49 console.log(convertTimestamp("1609459200000000", true));
50} catch (error) {
51 console.error(error.message);
52}
53
1# تبدیل زمان پایتون با شناسایی خودکار فرمت
2import datetime
3
4def convert_timestamp(timestamp, use_12hour=False):
5 # تبدیل به عدد صحیح
6 timestamp = str(timestamp).strip()
7 numeric_timestamp = int(timestamp)
8
9 # شناسایی فرمت زمان بر اساس طول رقم
10 if len(timestamp) == 16:
11 # دقت میکروثانیه (تقسیم بر ۱۰۰۰۰۰۰ برای به دست آوردن ثانیهها)
12 date = datetime.datetime.fromtimestamp(numeric_timestamp / 1000000)
13 print("شناسایی شده: زمان میکروثانیهای");
14 elif len(timestamp) == 13:
15 # دقت میلیثانیه (تقسیم بر ۱۰۰۰ برای به دست آوردن ثانیهها)
16 date = datetime.datetime.fromtimestamp(numeric_timestamp / 1000)
17 print("شناسایی شده: زمان میلیثانیهای");
18 elif len(timestamp) == 10:
19 # زمان یونیکس استاندارد (ثانیهها)
20 date = datetime.datetime.fromtimestamp(numeric_timestamp)
21 print("شناسایی شده: زمان یونیکس استاندارد (ثانیهها)");
22 else:
23 raise ValueError("فرمت زمان نامعتبر. انتظار میرود ۱۰، ۱۳ یا ۱۶ رقم باشد.")
24
25 # فرمت رشته تاریخ
26 if use_12hour:
27 format_string = "%A, %B %d, %Y %I:%M:%S %p" # فرمت ۱۲ ساعته با AM/PM
28 else:
29 format_string = "%A, %B %d, %Y %H:%M:%S" # فرمت ۲۴ ساعته
30
31 return date.strftime(format_string)
32
33# مثال استفاده
34try:
35 # زمان یونیکس استاندارد (۱۰ رقم)
36 print(convert_timestamp("1609459200", False))
37
38 # دقت میلیثانیه (۱۳ رقم)
39 print(convert_timestamp("1609459200000", False))
40
41 # دقت میکروثانیه (۱۶ رقم)
42 print(convert_timestamp("1609459200000000", True))
43except ValueError as e:
44 print(e)
45
1<?php
2// تبدیل زمان PHP با شناسایی خودکار فرمت
3function convertTimestamp($timestamp, $use12Hour = false) {
4 // اطمینان از اینکه زمان یک رشته است برای بررسی طول
5 $timestamp = trim((string)$timestamp);
6
7 // شناسایی فرمت زمان بر اساس طول رقم
8 if (strlen($timestamp) === 16) {
9 // دقت میکروثانیه (تقسیم بر ۱۰۰۰۰۰۰ برای به دست آوردن ثانیهها)
10 $seconds = $numericTimestamp / 1000000;
11 echo "شناسایی شده: زمان میکروثانیهای\n";
12 } elseif (strlen($timestamp) === 13) {
13 // دقت میلیثانیه
14 $milliseconds = (float)$timestamp;
15 echo "شناسایی شده: زمان میلیثانیهای\n";
16 } elseif (strlen($timestamp) === 10) {
17 // زمان یونیکس استاندارد (ثانیهها)
18 $seconds = (float)$timestamp;
19 echo "شناسایی شده: زمان یونیکس استاندارد (ثانیهها)\n";
20 } else {
21 throw new Exception("فرمت زمان نامعتبر. انتظار میرود ۱۰، ۱۳ یا ۱۶ رقم باشد.");
22 }
23
24 // فرمت رشته
25 $formatString = $use12Hour
26 ? 'l, F j, Y g:i:s A' // فرمت ۱۲ ساعته با AM/PM
27 : 'l, F j, Y H:i:s'; // فرمت ۲۴ ساعته
28
29 // تبدیل و فرمت تاریخ
30 return date($formatString, $seconds);
31}
32
33// مثال استفاده
34try {
35 // زمان یونیکس استاندارد (۱۰ رقم)
36 echo convertTimestamp("1609459200", false) . "\n";
37
38 // دقت میلیثانیه (۱۳ رقم)
39 echo convertTimestamp("1609459200000", false) . "\n";
40
41 // دقت میکروثانیه (۱۶ رقم)
42 echo convertTimestamp("1609459200000000", true) . "\n";
43} catch (Exception $e) {
44 echo $e->getMessage() . "\n";
45}
46?>
47
1// تبدیل زمان جاوا با شناسایی خودکار فرمت
2import java.time.Instant;
3import java.time.LocalDateTime;
4import java.time.ZoneId;
5import java.time.format.DateTimeFormatter;
6
7public class TimestampConverter {
8 public static String convertTimestamp(String timestamp, boolean use12Hour) {
9 // Trim the input
10 timestamp = timestamp.trim();
11
12 // شناسایی فرمت زمان بر اساس طول رقم
13 LocalDateTime dateTime;
14 if (timestamp.length() == 16) {
15 // دقت میکروثانیه (تقسیم بر ۱۰۰۰۰۰۰ برای به دست آوردن ثانیهها)
16 long microseconds = Long.parseLong(timestamp);
17 Instant instant = Instant.ofEpochSecond(0, microseconds * 1000); // تبدیل به نانوثانیه
18 dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
19 System.out.println("شناسایی شده: زمان میکروثانیهای");
20 } else if (timestamp.length() == 13) {
21 // دقت میلیثانیه
22 long milliseconds = Long.parseLong(timestamp);
23 Instant instant = Instant.ofEpochMilli(milliseconds);
24 dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
25 System.out.println("شناسایی شده: زمان میلیثانیهای");
26 } else if (timestamp.length() == 10) {
27 // زمان یونیکس استاندارد (ثانیهها)
28 long seconds = Long.parseLong(timestamp);
29 Instant instant = Instant.ofEpochSecond(seconds);
30 dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
31 System.out.println("شناسایی شده: زمان یونیکس استاندارد (ثانیهها)");
32 } else {
33 throw new IllegalArgumentException("فرمت زمان نامعتبر. انتظار میرود ۱۰، ۱۳ یا ۱۶ رقم باشد.");
34 }
35
36 // ایجاد فرمتکننده بر اساس فرمت مورد نظر
37 DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
38 use12Hour ? "EEEE, MMMM d, yyyy h:mm:ss a" : "EEEE, MMMM d, yyyy HH:mm:ss"
39 );
40
41 // فرمت تاریخ
42 return dateTime.format(formatter);
43 }
44
45 public static void main(String[] args) {
46 try {
47 // زمان یونیکس استاندارد (۱۰ رقم)
48 System.out.println(convertTimestamp("1609459200", false));
49
50 // دقت میلیثانیه (۱۳ رقم)
51 System.out.println(convertTimestamp("1609459200000", false));
52
53 // دقت میکروثانیه (۱۶ رقم)
54 System.out.println(convertTimestamp("1609459200000000", true));
55 } catch (IllegalArgumentException e) {
56 System.err.println(e.getMessage());
57 }
58 }
59}
60
1// تبدیل زمان C# با شناسایی خودکار فرمت
2using System;
3
4class TimestampConverter
5{
6 public static string ConvertTimestamp(string timestamp, bool use12Hour)
7 {
8 // Trim the input
9 timestamp = timestamp.Trim();
10
11 // شناسایی فرمت زمان بر اساس طول رقم
12 DateTime dateTime;
13 if (timestamp.Length == 16)
14 {
15 // دقت میکروثانیه (تقسیم بر ۱۰۰۰۰۰۰ برای به دست آوردن ثانیهها)
16 if (!double.TryParse(timestamp, out double microseconds))
17 throw new ArgumentException("فرمت زمان نامعتبر");
18
19 // تبدیل میکروثانیهها به DateTime
20 dateTime = DateTimeOffset.FromUnixTimeSeconds(0).DateTime.AddSeconds(microseconds / 1000000);
21 Console.WriteLine("شناسایی شده: زمان میکروثانیهای");
22 }
23 else if (timestamp.Length == 13)
24 {
25 // دقت میلیثانیه
26 if (!long.TryParse(timestamp, out long milliseconds))
27 throw new ArgumentException("فرمت زمان نامعتبر");
28
29 dateTime = DateTimeOffset.FromUnixTimeMilliseconds(milliseconds).DateTime;
30 Console.WriteLine("شناسایی شده: زمان میلیثانیهای");
31 }
32 else if (timestamp.Length == 10)
33 {
34 // زمان یونیکس استاندارد (ثانیهها)
35 if (!long.TryParse(timestamp, out long seconds))
36 throw new ArgumentException("فرمت زمان نامعتبر");
37
38 dateTime = DateTimeOffset.FromUnixTimeSeconds(seconds).DateTime;
39 Console.WriteLine("شناسایی شده: زمان یونیکس استاندارد (ثانیهها)");
40 }
41 else
42 {
43 throw new ArgumentException("فرمت زمان نامعتبر. انتظار میرود ۱۰، ۱۳ یا ۱۶ رقم باشد.");
44 }
45
46 // فرمت رشته بر اساس ترجیحات ۱۲ ساعته یا ۲۴ ساعته
47 string formatString = use12Hour
48 ? "dddd, MMMM d, yyyy h:mm:ss tt" // فرمت ۱۲ ساعته با AM/PM
49 : "dddd, MMMM d, yyyy HH:mm:ss"; // فرمت ۲۴ ساعته
50
51 // بازگشت رشته تاریخ فرمت شده
52 return dateTime.ToString(formatString);
53 }
54
55 static void Main()
56 {
57 try
58 {
59 // زمان یونیکس استاندارد (۱۰ رقم)
60 Console.WriteLine(ConvertTimestamp("1609459200", false));
61
62 // دقت میلیثانیه (۱۳ رقم)
63 Console.WriteLine(ConvertTimestamp("1609459200000", false));
64
65 // دقت میکروثانیه (۱۶ رقم)
66 Console.WriteLine(ConvertTimestamp("1609459200000000", true));
67 }
68 catch (ArgumentException e)
69 {
70 Console.WriteLine(e.Message);
71 }
72 }
73}
74
مدیریت موارد حاشیهای
هنگام کار با زمانهای یونیکس با دقتهای مختلف، مهم است که موارد حاشیهای را به درستی مدیریت کنید. در اینجا مثالی است که مدیریت جامع موارد حاشیهای را نشان میدهد:
1// مدیریت جامع موارد حاشیهای در جاوااسکریپت برای چندین فرمت زمان
2function safeConvertTimestamp(timestamp, use12Hour = false) {
3 // اعتبارسنجی ورودی
4 if (timestamp === undefined || timestamp === null || timestamp === '') {
5 return "خطا: زمان خالی یا تعریف نشده است";
6 }
7
8 // اطمینان از اینکه زمان یک رشته است برای بررسی طول
9 const timestampStr = String(timestamp).trim();
10
11 // بررسی اینکه آیا زمان فقط شامل ارقام است
12 if (!/^\d+$/.test(timestampStr)) {
13 return "خطا: زمان باید فقط شامل ارقام باشد";
14 }
15
16 // شناسایی فرمت بر اساس طول
17 let date;
18 try {
19 if (timestampStr.length === 16) {
20 // دقت میکروثانیه
21 const microseconds = Number(timestampStr);
22 date = new Date(microseconds / 1000); // تبدیل به میلیثانیه
23 console.log("پردازش زمان میکروثانیهای (۱۶ رقم)");
24
25 // بررسی تاریخ نامعتبر
26 if (isNaN(date.getTime())) {
27 return "خطا: زمان میکروثانیهای نامعتبر";
28 }
29 } else if (timestampStr.length === 13) {
30 // دقت میلیثانیه
31 const milliseconds = Number(timestampStr);
32 date = new Date(milliseconds);
33 console.log("پردازش زمان میلیثانیهای (۱۳ رقم)");
34
35 // بررسی تاریخ نامعتبر
36 if (isNaN(date.getTime())) {
37 return "خطا: زمان میلیثانیهای نامعتبر";
38 }
39 } else if (timestampStr.length === 10) {
40 // زمان یونیکس استاندارد (ثانیهها)
41 const seconds = Number(timestampStr);
42 date = new Date(seconds * 1000);
43 console.log("پردازش زمان استاندارد (۱۰ رقم)");
44
45 // بررسی تاریخ نامعتبر
46 if (isNaN(date.getTime())) {
47 return "خطا: زمان استاندارد نامعتبر";
48 }
49
50 // بررسی مشکل Y2K38 (برای سیستمهای ۳۲ بیتی)
51 const maxInt32 = 2147483647; // حداکثر مقدار برای عدد صحیح ۳۲ بیتی
52 if (seconds > maxInt32) {
53 console.warn("هشدار: زمان از محدودیت عدد صحیح ۳۲ بیتی فراتر میرود (مسئله Y2K38)");
54 }
55 } else {
56 return "خطا: طول زمان نامعتبر. انتظار میرود ۱۰، ۱۳ یا ۱۶ رقم باشد.";
57 }
58
59 // فرمت تاریخ
60 const options = {
61 year: 'numeric',
62 month: 'long',
63 day: 'numeric',
64 weekday: 'long',
65 hour: use12Hour ? 'numeric' : '2-digit',
66 minute: '2-digit',
67 second: '2-digit',
68 hour12: use12Hour
69 };
70
71 return date.toLocaleString(undefined, options);
72 } catch (error) {
73 return "خطا در تبدیل زمان: " + error.message;
74 }
75}
76
77// آزمایش با موارد حاشیهای مختلف
78console.log(safeConvertTimestamp("1609459200")); // استاندارد (۱۰ رقم)
79console.log(safeConvertTimestamp("1609459200000")); // میلیثانیه (۱۳ رقم)
80console.log(safeConvertTimestamp("1609459200000000")); // میکروثانیه (۱۶ رقم)
81console.log(safeConvertTimestamp("abc123")); // غیر عددی
82console.log(safeConvertTimestamp("12345")); // طول نامعتبر
83console.log(safeConvertTimestamp("9999999999999999")); // زمان میکروثانیهای بسیار بزرگ
84console.log(safeConvertTimestamp("")); // رشته خالی
85
سوالات متداول
زمان یونیکس چیست؟
زمان یونیکس تعداد ثانیههایی است که از ۱ ژانویه ۱۹۷۰ (نیمه شب UTC/GMT) گذشته است، بدون احتساب ثانیههای کبیسه. این زمان یک روش فشرده و مستقل از زبان برای نمایندگی یک لحظه خاص در زمان را ارائه میدهد.
شناسایی خودکار فرمت زمان چگونه کار میکند؟
مبدل به طور خودکار فرمت زمان را بر اساس تعداد ارقام شناسایی میکند:
- ۱۰ رقم: زمان یونیکس استاندارد (ثانیهها از Epoch)
- ۱۳ رقم: زمان با دقت میلیثانیه
- ۱۶ رقم: زمان با دقت میکروثانیه
چرا به دقت میلیثانیه یا میکروثانیه نیاز دارم؟
دقت میلیثانیه (۱۳ رقم) برای برنامههایی که نیاز به زمانبندی دقیقتری دارند، مانند نظارت بر عملکرد، پیگیری تعاملات کاربری و برخی برنامههای مالی مفید است. دقت میکروثانیه (۱۶ رقم) برای محاسبات با عملکرد بالا، برنامههای علمی و سیستمهای معاملاتی با فرکانس بالا که نیاز به زمانبندی بسیار دقیقی دارند، ضروری است.
آیا میتوانم تاریخهای قبل از ۱۹۷۰ را با استفاده از زمانهای یونیکس تبدیل کنم؟
بله، تاریخهای قبل از ۱ ژانویه ۱۹۷۰ با استفاده از زمانهای منفی نمایان میشوند. با این حال، برخی سیستمها ممکن است نتوانند زمانهای منفی را به درستی مدیریت کنند، بنابراین اگر نیاز به کار با تاریخهای تاریخی دارید، مهم است که این عملکرد را آزمایش کنید.
مشکل سال ۲۰۳۸ چیست؟
مشکل سال ۲۰۳۸ به این دلیل است که بسیاری از سیستمها زمانهای یونیکس را به عنوان اعداد صحیح ۳۲ بیتی ذخیره میکنند، که تنها میتوانند تاریخها را تا ۱۹ ژانویه ۲۰۳۸ نمایان کنند. پس از این تاریخ، عدد صحیح سرریز خواهد شد و ممکن است باعث بروز مشکلات سیستمی شود. سیستمهای مدرن به طور فزایندهای از اعداد صحیح ۶۴ بیتی برای جلوگیری از این مشکل استفاده میکنند.
چگونه میتوانم تبدیلهای منطقه زمانی را با زمانهای یونیکس مدیریت کنم؟
زمانهای یونیکس همیشه در UTC (زمان جهانی هماهنگ) هستند. برای تبدیل به یک منطقه زمانی خاص، باید پس از تبدیل زمان به تاریخ، offset مناسب را اعمال کنید. بیشتر زبانهای برنامهنویسی توابع داخلی برای مدیریت تبدیلهای منطقه زمانی ارائه میدهند.
تفاوت بین زمان یونیکس و ISO 8601 چیست؟
زمان یونیکس یک نمایندگی عددی (ثانیهها از Epoch) است، در حالی که ISO 8601 یک فرمت رشتهای (مانند "۲۰۲۱-۰۱-۰۱T۰۰:۰۰:۰۰Z") است. زمان یونیکس فشردهتر و برای محاسبات آسانتر است، در حالی که ISO 8601 قابل خواندنتر و خودتوصیفیتر است.
دقت زمانهای یونیکس چقدر است؟
زمانهای یونیکس استاندارد دقت سطح ثانیه را دارند. برای برنامههایی که به دقت بیشتری نیاز دارند، زمانهای میلیثانیهای (۱۳ رقم) دقت ۱/۱۰۰۰ ثانیهای را ارائه میدهند و زمانهای میکروثانیهای (۱۶ رقم) دقت ۱/۱۰۰۰۰۰۰ ثانیهای را ارائه میدهند.
آیا زمانهای یونیکس به ثانیههای کبیسه توجه میکنند؟
خیر، زمان یونیکس به عنوان تعداد ثانیهها از Epoch تعریف میشود و ثانیههای کبیسه را شامل نمیشود. این بدان معناست که در طول یک ثانیه کبیسه، زمان یونیکس افزایش نمییابد. این موضوع میتواند در برنامههایی که نیاز به زمان دقیق نجومی دارند، مشکلاتی ایجاد کند.
آیا میتوانم از زمانهای یونیکس برای برنامهریزی رویدادهای آینده استفاده کنم؟
بله، زمانهای یونیکس به طور گستردهای برای برنامهریزی استفاده میشوند. با این حال، برای تاریخهای بسیار دور، از محدودیتهای احتمالی مانند مشکل سال ۲۰۳۸ برای سیستمهای ۳۲ بیتی و مدیریت تغییرات منطقه زمانی و انتقالهای زمان تابستانی آگاه باشید.
منابع
۱. "زمان یونیکس." ویکیپدیا، بنیاد ویکیمدیا، 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." انتشارات پرنتیس هال، ۱۹۸۸.
۷. "زمانبندی دقیق در محاسبات با عملکرد بالا." نظرسنجیهای محاسباتی ACM، https://dl.acm.org/doi/10.1145/3232678
۸. "نمایش زمان در سیستمهای مالی." مجله فناوری مالی، https://www.fintech-journal.com/time-representation
اکنون مبدل زمان ما را امتحان کنید تا به راحتی زمانهای یونیکس با هر دقتی را به تاریخهای قابل خواندن انسانی تبدیل کنید. چه با زمانهای یونیکس استاندارد، دقت میلیثانیه یا دقت میکروثانیه کار کنید، ابزار ما به طور خودکار فرمت را شناسایی کرده و تبدیلهای دقیقی را ارائه میدهد.
بازخورد
برای شروع دادن بازخورد درباره این ابزار، روی توست بازخورد کلیک کنید
ابزارهای مرتبط
کشف ابزارهای بیشتری که ممکن است برای جریان کاری شما مفید باشند