زمان یکی از مهم ترین اطلاعاتی هست که در نرم افزارها ذخیره میشه و پردازش هایی روش صورت میگیره. رایانه ها و نرم افزارها به حای استفاده از تاریخ و ساعت معمولی ما انسان ها از سیستم زمانی خاصی به نام تایم استمپ استفاده میکنن چرا که پردازشش به مراتب بسیار ساده تره. در واقع تایم استمپ مقدار ثانیه های سپری شده از یکم ژانویه سال 1970 میلادی تا زمان کنونی است. به یکم ژانویه سال 1970 در اصطلاح زمان مبدأ (Epoch Time) گفته میشه. برای گزارش تایم استمپ زمان های پس از زمان مبدأ از یک عدد مثبت و برای گزارش تایم استمپ زمان های پیش از زمان مبدأ از یک عدد منفی استفاده میکنیم.
مزایا و معایب زمان یونیکس (تایم استمپ)
1) پردازش تاریخ و زمان توسط رایانه یا نرم افزار بسیار ساده تر خواهد شد. یک رایانه قادر است تایم استمپ را تنها در چند هزارم ثانیه محاسبه و پردازش کند.
2) تایم استمپ یا زمان یونیکس مستقل از اختلاف زمانی میان کشورهای مختلف است چرا که در هر کشوری با هر سیستم تقویمی (میلادی، شمسی، قمری و …) مدت زمان سپری شده بر حسب ثانیه از زمان مبدأ یکسان خواهد بود.
3) ذخیره سازی اطلاعات مربوط به زمان به صورت تایم استمپ فضای کمتری را نسبت به ذخیره سازی اطلاعات زمانی به صورت عادی اشغال خواهد کرد.
4) زحمت ایونت نوشتن و در کل برنامه نویسی در صورت به کار گرفتن تایم استمپ بیشتر خواهد شد چرا که حداقل دو مرحله تبدیل و محاسبه تایم استمپ مطرح خواهد شد.
5) طبق محاسبات انجام شده طول تایم استمپ در 19 ژانویه 2038 از 32 بیت تجاوز خواهد کرد. بنابراین بسیاری از نرم افزارها که برای ذخیره سازی تایم استمپ از متغیرهایی با ظرفیت 32 بیت استفاده می کنند دچار مشکل خواهند شد و با مشکل Overflow (سرریز) متغیرها در حین اجرا مواجه خواهند شد که باعث از کار افتادن برنامه ها خواهد شد.
نحوه محاسبه زمان یونیکس (تایم استمپ)
به هیچ وجه نیازی نیست که محاسبات زیر رو در پروژه خودتون پیاده سازی کنین چرا که این روزا تمامی زبان های رایج برنامه نویسی دنیا و حتی کانستراکت (البته به صورت غیر مستقیم) مجهز به ساز و کاری برای دریافت و تبدیل تایم استمپ هستن. آنچه که در ادامه مطرح میشه تنها برای ایجاد درک بهتر از سیستم زمانی یونیکس هست.
مهم ترین چالش پیش روی ما در محاسبه تایم استمپ سال های کبیسه (Leap Years) هستند. در سیستم تقویم میلادی سال هایی کبیسه هستند که حاصل تقسیم اونها بر عدد چهار برابر با صفر بشه و به عبارت دیگه بر عدد 4 بخش پذیر باشن. اما استثنایی هم هست و اونم اینه که برای سال های انتهایی سده (سال هایی که صد هستن) باید بررسی کنیم که سال موردنظرمون بر 400 بخش پذیر هست یا خیر.
سال 2004 میلادی رو در نظر بگیرین. این سال چون بر عدد 4 بخش پذیره کبیسه است. اما سال 1900 میلادی با اینکه بر چهار بخش پذیره اما کبیسه نیست چرا که گفتیم برای سال های انتهایی سده (سال هایی که صد هستن) باید بررسی کنیم که سال موردنظر بر 400 بخش پذیره که در مورد سال 1900 اینطور نیست.
اگر بخوایم دقیقتر به مسئله کبیسه بودن سالها در سیستم تقویم میلادی نگاه کنیم باید این رو در نظر داشته باشیم که طبق توافق هر چهار قرن سه کبیسه چهارساله حذف میشن.
در ضمن در سال های کبیسه میلادی ماه فوریه 29 روزی هست نه 28 روزی.
برای محاسبه تعداد سال های کبیسه سپری شده از فرمول زیر استفاده می کنیم:
عبارت Epoch بیانگر سال مبدأ و Current Year بیانگر سال کنونی است. کلید واژه Floor هم به این معناست که باید حاصل به دست اومده رو در صورتی که اعشاری و بزرگتر از یک شد قطع کرد. در صورتی که حاصل اعشاری و کوچکتر از یک (مثلاً 0.75) شد باید حاصل به دست آمده را به بالا گرد کرد.
** برای محاسبه تعداد سال های غیرکبیسه و معمولی (N) باید از فرمول زیر استفاده کرد:
عبارت Current Year بیانگر سال کنونی است و عبارت L هم بیانگر مقدار به دست آمده قطع یا گرد شده از فرمول قبلی است.
** برای محاسبه ثانیه های سپری شده از سال های کبیسه پشت سر گذاشته شده از فرمول زیر استفاده می کنیم:
عبارت L هم بیانگر مقدار به دست آمده قطع یا گرد شده از فرمول نخست می باشد.
** برای محاسبه ثانیه های سپری شده از سال های عادی و غیرکبیسه سپری شده از فرمول زیر استفاده می کنیم:
عبارت N بیانگر تعداد سال های عادی و غیرکبیسه می باشد.
** برای محاسبه تعداد روزهای سپری شده از سال جاری (کنونی) بر حسب ثانیه (D) باید تعداد روزهای سپری شده از ابتدای سال را ضربدر 86400 کنیم. دقت کنید که اگر سال جاری (کنونی) کبیسه باشد فوریه 29 روزی خواهد بود.
** برای محاسبه ثانیه های سپری شده از روز کنونی ساعت موردنظر را در فرمول زیر قرار می دهیم:
عبارت h بیانگر ساعت، m بیانگر دقیقه و S بیانگر ثانیه ساعت موردنظر می باشد.
** در نهایت تایم استمپ موردنظر حاصل مجموع مقادیر LS و M و NS و D خواهد بود. البته بدون شک محاسبه ما تا این لحظه تقریبی بوده و برای این که مقدار دقیق تایم استمپ را به دست آوریم باید موارد خطا را نیز پوشش دهیم. یعنی:
در حاشیه:
دقت داشته باشین که شما میتونین زمان مبدأ (Epoch Time) رو هر مقدار دلخواهی که دوست دارین در نظر بگیرین اما در اینصورت باید محاسبات و مراحل متفاوتی رو طی کنین.
نحوه تبدیل زمان یونیکس (تایم استمپ) به ساعت و تاریخ عادی
کمی قبل تر به تفصیل راجع به محاسبه تایم استمپ صحبت کردیم و یک مثال عملی رو هم پیاده سازی کردیم. اما برای تبدیل تایم استمپ به زمان و تاریخ عادی باید چه کنیم؟
برای فهمیدن سال کافیه مقدار تایم استمپ رو بر 31536000 تقسیم کنیم و مقدار تقریبی (قطع شده) به دست اومده رو بعلاوه سال مبدأ یعنی 1970 کنیم. برای به دست آوردن ماه و روز ماه و ساعت هم میتونیم تایم استمپ یکم ژانویه سال موردنظر رو محاسبه کنیم و بعد حاصل به دست اومده رو از تایم استمپی که داریم کم کنیم تا متوجه بشیم که چند ثانیه از ابتدای سال سپری شده. بعد با توجه به مقدار ثانیه سپری شده از ابتدای سال میتونیم ماه، روز ماه و ساعت رو به دست بیاریم. چون این مسئله تجزیه و تحلیل خاصی نیاز نداره برای جلوگیری از بیشتر شدن حجم مطلب از گفتنش صرف نظر کردم و به همین مقدمه بسنده میکنم.
- هر ثانیه یک واحد اضافه می شود.
- هر یک روز 86400 واحد اضافه می گردد.
- هر یک هفته 604800 واحد اضافه می گردد.
دقت کنید مقادیر فوق بدون محاسبه سال کبیسه می باشد.
برای تبدیل فورمت های تاریخ می توانید از سایت های آماده داخلی و خارجی به صورت آنلاین استفاده کنید.