به نام خدا
سلام دوستان امیدوارم حالتون خوب باشه...
سلام دوستان امیدوارم حالتون خوب باشه...
امروز قصد داریم راجع به زمان یونیکس (Unix Time) یا همون تایم استمپ (Time Stamp) صحبت کنیم. همونطور که میدونیم زمان یکی از مهم ترین اطلاعاتی هست که در نرم افزارها ذخیره میشه و پردازش هایی روش صورت میگیره. رایانه ها و نرم افزارها به حای استفاده از تاریخ و ساعت معمولی ما انسان ها از سیستم زمانی خاصی به نام تایم استمپ استفاده میکنن چرا که پردازشش به مراتب بسیار ساده تره. در واقع تایم استمپ مقدار ثانیه های سپری شده از یکم ژانویه سال 1970 میلادی تا زمان کنونی است. به یکم ژانویه سال 1970 در اصطلاح زمان مبدأ (Epoch Time) گفته میشه. برای گزارش تایم استمپ زمان های پس از زمان مبدأ از یک عدد مثبت و برای گزارش تایم استمپ زمان های پیش از زمان مبدأ از یک عدد منفی استفاده میکنیم.
مزایا و معایب زمان یونیکس (تایم استمپ) :
نحوه محاسبه زمان یونیکس (تایم استمپ) :
به هیچ وجه نیازی نیست که محاسبات زیر رو در پروژه خودتون پیاده سازی کنین چرا که این روزا تمامی زبان های رایج برنامه نویسی دنیا و حتی کانستراکت (البته به صورت غیر مستقیم) مجهز به ساز و کاری برای دریافت و تبدیل تایم استمپ هستن. آنچه که در ادامه مطرح میشه تنها برای ایجاد درک بهتر از سیستم زمانی یونیکس هست.
مهم ترین چالش پیش روی ما در محاسبه تایم استمپ سال های کبیسه (Leap Years) هستند. در سیستم تقویم میلادی سال هایی کبیسه هستند که حاصل تقسیم اونها بر عدد چهار برابر با صفر بشه و به عبارت دیگه بر عدد 4 بخش پذیر باشن. اما استثنایی هم هست و اونم اینه که برای سال های انتهایی سده (سال هایی که صد هستن) باید بررسی کنیم که سال موردنظرمون بر 400 بخش پذیر هست یا خیر.
سال 2004 میلادی رو در نظر بگیرین. این سال چون بر عدد 4 بخش پذیره کبیسه است. اما سال 1900 میلادی با اینکه بر چهار بخش پذیره اما کبیسه نیست چرا که گفتیم برای سال های انتهایی سده (سال هایی که صد هستن) باید بررسی کنیم که سال موردنظر بر 400 بخش پذیره که در مورد سال 1900 اینطور نیست.
اگر بخوایم دقیقتر به مسئله کبیسه بودن سالها در سیستم تقویم میلادی نگاه کنیم باید این رو در نظر داشته باشیم که طبق توافق هر چهار قرن سه کبیسه چهارساله حذف میشن.
در ضمن در سال های کبیسه میلادی ماه فوریه 29 روزی هست نه 28 روزی.
قبل از اینکه بقیه مطلب رو ادامه بدیم بد نیست تعداد روزهای ماه های میلادی رو بدونیم:
![[تصویر: %D9%85%D8%A7%D9%87-%D9%87%D8%A7%DB%8C-%D...50x341.jpg]](http://mytarfand.com/wp-content/uploads/2019/01/%D9%85%D8%A7%D9%87-%D9%87%D8%A7%DB%8C-%D9%85%DB%8C%D9%84%D8%A7%D8%AF%DB%8C-550x341.jpg)
(در صورت عدم مشاهده تصویر بالا اینجا را کلیک کنید.)
** برای محاسبه تعداد سال های کبیسه سپری شده از فرمول زیر استفاده می کنیم:
![[تصویر: 2.png]](http://s5.picofile.com/file/8396564542/2.png)
عبارت Epoch بیانگر سال مبدأ و Current Year بیانگر سال کنونی است. کلید واژه Floor هم به این معناست که باید حاصل به دست اومده رو در صورتی که اعشاری و بزرگتر از یک شد قطع کرد. در صورتی که حاصل اعشاری و کوچکتر از یک (مثلاً 0.75) شد باید حاصل به دست آمده را به بالا گرد کرد.مزایا و معایب زمان یونیکس (تایم استمپ) :
- * 1) پردازش تاریخ و زمان توسط رایانه یا نرم افزار بسیار ساده تر خواهد شد. یک رایانه قادر است تایم استمپ را تنها در چند هزارم ثانیه محاسبه و پردازش کند.
- * 2) تایم استمپ یا زمان یونیکس مستقل از اختلاف زمانی میان کشورهای مختلف است چرا که در هر کشوری با هر سیستم تقویمی (میلادی، شمسی، قمری و ...) مدت زمان سپری شده بر حسب ثانیه از زمان مبدأ یکسان خواهد بود.
- * 3) ذخیره سازی اطلاعات مربوط به زمان به صورت تایم استمپ فضای کمتری را نسبت به ذخیره سازی اطلاعات زمانی به صورت عادی اشغال خواهد کرد.
- * 4) زحمت ایونت نوشتن و در کل برنامه نویسی در صورت به کار گرفتن تایم استمپ بیشتر خواهد شد چرا که حداقل دو مرحله تبدیل و محاسبه تایم استمپ مطرح خواهد شد.
- * 5) طبق محاسبات انجام شده طول تایم استمپ در 19 ژانویه 2038 از 32 بیت تجاوز خواهد کرد. بنابراین بسیاری از نرم افزارها که برای ذخیره سازی تایم استمپ از متغیرهایی با ظرفیت 32 بیت استفاده می کنند دچار مشکل خواهند شد و با مشکل Overflow (سرریز) متغیرها در حین اجرا مواجه خواهند شد که باعث از کار افتادن برنامه ها خواهد شد.
نحوه محاسبه زمان یونیکس (تایم استمپ) :
به هیچ وجه نیازی نیست که محاسبات زیر رو در پروژه خودتون پیاده سازی کنین چرا که این روزا تمامی زبان های رایج برنامه نویسی دنیا و حتی کانستراکت (البته به صورت غیر مستقیم) مجهز به ساز و کاری برای دریافت و تبدیل تایم استمپ هستن. آنچه که در ادامه مطرح میشه تنها برای ایجاد درک بهتر از سیستم زمانی یونیکس هست.
مهم ترین چالش پیش روی ما در محاسبه تایم استمپ سال های کبیسه (Leap Years) هستند. در سیستم تقویم میلادی سال هایی کبیسه هستند که حاصل تقسیم اونها بر عدد چهار برابر با صفر بشه و به عبارت دیگه بر عدد 4 بخش پذیر باشن. اما استثنایی هم هست و اونم اینه که برای سال های انتهایی سده (سال هایی که صد هستن) باید بررسی کنیم که سال موردنظرمون بر 400 بخش پذیر هست یا خیر.
سال 2004 میلادی رو در نظر بگیرین. این سال چون بر عدد 4 بخش پذیره کبیسه است. اما سال 1900 میلادی با اینکه بر چهار بخش پذیره اما کبیسه نیست چرا که گفتیم برای سال های انتهایی سده (سال هایی که صد هستن) باید بررسی کنیم که سال موردنظر بر 400 بخش پذیره که در مورد سال 1900 اینطور نیست.
اگر بخوایم دقیقتر به مسئله کبیسه بودن سالها در سیستم تقویم میلادی نگاه کنیم باید این رو در نظر داشته باشیم که طبق توافق هر چهار قرن سه کبیسه چهارساله حذف میشن.
در ضمن در سال های کبیسه میلادی ماه فوریه 29 روزی هست نه 28 روزی.
قبل از اینکه بقیه مطلب رو ادامه بدیم بد نیست تعداد روزهای ماه های میلادی رو بدونیم:
![[تصویر: %D9%85%D8%A7%D9%87-%D9%87%D8%A7%DB%8C-%D...50x341.jpg]](http://mytarfand.com/wp-content/uploads/2019/01/%D9%85%D8%A7%D9%87-%D9%87%D8%A7%DB%8C-%D9%85%DB%8C%D9%84%D8%A7%D8%AF%DB%8C-550x341.jpg)
(در صورت عدم مشاهده تصویر بالا اینجا را کلیک کنید.)
** برای محاسبه تعداد سال های کبیسه سپری شده از فرمول زیر استفاده می کنیم:
![[تصویر: 2.png]](http://s5.picofile.com/file/8396564542/2.png)
** برای محاسبه تعداد سال های غیرکبیسه و معمولی (N) باید از فرمول زیر استفاده کرد:
![[تصویر: 3.png]](http://s4.picofile.com/file/8396564684/3.png)
عبارت Current Year بیانگر سال کنونی است و عبارت L هم بیانگر مقدار به دست آمده قطع یا گرد شده از فرمول قبلی است.
** برای محاسبه ثانیه های سپری شده از سال های کبیسه پشت سر گذاشته شده از فرمول زیر استفاده می کنیم:
![[تصویر: 4.png]](http://s5.picofile.com/file/8396564900/4.png)
** برای محاسبه ثانیه های سپری شده از سال های عادی و غیرکبیسه سپری شده از فرمول زیر استفاده می کنیم:
![[تصویر: 5.png]](http://s4.picofile.com/file/8396566884/5.png)
عبارت N بیانگر تعداد سال های عادی و غیرکبیسه می باشد.
** برای محاسبه تعداد روزهای سپری شده از سال جاری (کنونی) بر حسب ثانیه (D) باید تعداد روزهای سپری شده از ابتدای سال را ضربدر 86400 کنیم. دقت کنید که اگر سال جاری (کنونی) کبیسه باشد فوریه 29 روزی خواهد بود.
** برای محاسبه ثانیه های سپری شده از روز کنونی ساعت موردنظر را در فرمول زیر قرار می دهیم:
![[تصویر: 6.png]](http://s5.picofile.com/file/8396565026/6.png)
عبارت h بیانگر ساعت، m بیانگر دقیقه و S بیانگر ثانیه ساعت موردنظر می باشد.
** در نهایت تایم استمپ موردنظر حاصل مجموع مقادیر LS و M و NS و D خواهد بود. البته بدون شک محاسبه ما تا این لحظه تقریبی بوده و برای این که مقدار دقیق تایم استمپ را به دست آوریم باید موارد خطا را نیز پوشش دهیم. یعنی:
![[تصویر: fr.png]](http://s4.picofile.com/file/8396565134/fr.png)
در حاشیه:
دقت داشته باشین که شما میتونین زمان مبدأ (Epoch Time) رو هر مقدار دلخواهی که دوست دارین در نظر بگیرین اما در اینصورت باید محاسبات و مراحل متفاوتی رو طی کنین.
مثال:
قصد داریم تایم استمپ سوم ژانویه 2020 ساعت 17:01:23 را محاسبه کنیم.
- * ابتدا باید تعداد سال های کبیسه سپری شده را محاسبه کنیم:
![[تصویر: l.png]](http://s5.picofile.com/file/8396565234/l.png)
- * در مرحله دوم تعداد سال های عادی و غیرکبیسه را محاسبه می کنیم:
![[تصویر: n.png]](http://s5.picofile.com/file/8396565268/n.png)
- * در مرحله سوم ثانیه های سپری شده از سال های کبیسه پشت سر گذاشته شده را محاسبه می کنیم:
![[تصویر: ls.png]](http://s4.picofile.com/file/8396565300/ls.png)
- * در مرحله چهـارم ثانیه های سپری شده از سال های غیر کبیسه و عادی پشت سر گذاشته شده را محاسبه می کنیم:
![[تصویر: ns.png]](http://s4.picofile.com/file/8396565318/ns.png)
- * در مرحله پنجم ثانیه های سپری شده از ابتدای سال تا امروز را محاسبه می کنیم:
![[تصویر: d2.png]](http://s4.picofile.com/file/8396565350/d2.png)
- * در مرحله ششم ساعت موردنظر را در فرمول قرار می دهیم تا ثانیه های سپری شده از ابتدای روز (M) را محاسبه کنیم:
- * در پایان هم تمامی مقادیر به دست آمده (M و NS و LS) را با هم جمع میزنیم و خطاها را هم طبق فرمول نهایی گفته شده به حساب می آوریم تا تایم استمپ به دست آید:
![[تصویر: final.png]](http://s5.picofile.com/file/8396565568/final.png)
نحوه تبدیل زمان یونیکس (تایم استمپ) به ساعت و تاریخ عادی :
کمی قبل تر به تفصیل راجع به محاسبه تایم استمپ صحبت کردیم و یک مثال عملی رو هم پیاده سازی کردیم. اما برای تبدیل تایم استمپ به زمان و تاریخ عادی باید چه کنیم؟
برای فهمیدن سال کافیه مقدار تایم استمپ رو بر 31536000 تقسیم کنیم و مقدار تقریبی (قطع شده) به دست اومده رو بعلاوه سال مبدأ یعنی 1970 کنیم. برای به دست آوردن ماه و روز ماه و ساعت هم میتونیم تایم استمپ یکم ژانویه سال موردنظر رو محاسبه کنیم و بعد حاصل به دست اومده رو از تایم استمپی که داریم کم کنیم تا متوجه بشیم که چند ثانیه از ابتدای سال سپری شده. بعد با توجه به مقدار ثانیه سپری شده از ابتدای سال میتونیم ماه، روز ماه و ساعت رو به دست بیاریم. چون این مسئله تجزیه و تحلیل خاصی نیاز نداره برای جلوگیری از بیشتر شدن حجم مطلب از گفتنش صرف نظر کردم و به همین مقدمه بسنده میکنم.
دریافت و تبدیل زمان یونیکس (تایم استمپ) در محیط کانستراکت :
ساده ترین راه دریافت تایم استمپ در کانستراکت استفاده از جاوا اسکریپت هست. ما میتونیم به کمک فانکشن Date.now() جاوا اسکریپت مقدار تایم استمپ کنونی رو به دست بیاریم. برای استفاده از جاوا اسکریپت در کانستراکت کافیه شیء Browser رو به پروژه مون اضافه کنیم و از اکشن Execute Javascript به شکل زیر کمک بگیریم:
کد:
"Date.now()"
کد:
"function unixTime(unixtime) {
var u = new Date(unixtime*1000);
return u.getUTCFullYear() +
'-' + ('0' + u.getUTCMonth()).slice(-2) +
'-' + ('0' + u.getUTCDate()).slice(-2) +
' ' + ('0' + u.getUTCHours()).slice(-2) +
':' + ('0' + u.getUTCMinutes()).slice(-2) +
':' + ('0' + u.getUTCSeconds()).slice(-2) +
'.' + (u.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5)
};
unixTime(تایم استمپ)"
برای تبدیل تاریخ و ساعت دلخواه به تایم استمپ هم میتونین از اکشن Execute Javascript به شکل زیر استفاده کنین:
کد:
"function toTimestamp(strDate){
var datum = Date.parse(strDate);
return datum/1000;
}
toTimestamp('02/13/2020 23:30')"
دریافت و تبدیل زمان یونیکس (تایم استمپ) به کمک PHP :
شما میتونین به کمک PHP و شیء اِی جَکس (AJAX) هم تایم استمپ رو دریافت و یا تبدیل کنین.
دریافت تایم استمپ: به منظور دریافت تایم استمپ کنونی کد PHP زیر رو در هاست یا سرور خودتون ذخیره کنین.
کد php:
<?php
// تعریف مجوز برای درخواست ajax برای سازگاری با انواع مرورگرها
header('Access-Control-Allow-Origin: *');
// چاپ تایم استمپ در خروجی
echo time();
?>
کد:
yourhost.com/file.php
تبدیل تایم استمپ به تاریخ و ساعت عادی: به منظور تبدیل تایم استمپ موردنظر به تاریخ و ساعت عادی باید کد PHP زیر رو در هاست یا سرورتون ذخیره کنین.
کد:
<?php
// تعریف مجوز برای درخواست ajax برای سازگاری با انواع مرورگرها
header('Access-Control-Allow-Origin: *');
// دریـافت مقدار تایم استمپ از کاربر جهت تبدیل به تاریخ و ساعت عـادی
$timestamp = $_GET['timestamp'] ;
// تعریف فـرمت تاریخ و ساعتی که به کاربر نمایش داده می شود
$datetimeFormat = 'Y-m-d | H:i:s';
$date = new \DateTime();
// تبدیل به سـاعت رسمی ایران
$date = new \DateTime('now', new \DateTimeZone('Asia/Tehran'));
// تبـدیل تایم استمپ به تاریخ و ساعت عادی
$date->setTimestamp($timestamp);
//در نهایت چاپ نتیجه
echo $date->format($datetimeFormat);
?>
کد:
yourhost.com/file.php?timestamp=x
تبدیل ساعت و تاریخ دلخواه به تایم استمپ: به منظور تبدیل ساعت و تاریخ دلخواه به تایم استمپ کد PHP زیر رو در هاست یا سرورتون ذخیره کنین.
کد:
<?php
// تعریف مجوز برای درخواست ajax برای سازگاری با انواع مرورگرها
header('Access-Control-Allow-Origin: *');
// دریافت تاریخ و زمان و ذخیره مقادیر در متغیر
$day = $_GET['day'];
$month = $_GET['month'];
$year = $_GET['year'];
$hour = $_GET['hour'];
$second = $_GET['second'];
$minute = $_GET['minute'];
// تعریف فرمت زمانی
date_default_timezone_set('Asia/Tehran');
// تبدیل تاریخ و ساعت به تایم استمپ و چاپ آن
echo strtotime("$month/$day/$year $hour:$minute");
?>
کد:
yourhost.com/file.php?day=25&month=6&year=2018&hour=23&minute=15&second=11
امیدوارم این مطلب براتون مفید و کاربردی واقع شده باشه و از این به بعد در پروژه هاتون به جای تاریخ و ساعت عادی از تایم استمپ استفاده کنین.
خوشحال میشم در ادامه نظراتتون رو بیان کنین و اگر جایی اشتباه بیان شده یا نامفهوم هست به بنده گوشزد بفرمایین.
با آرزوی بهترین ها...