زمان یونیکس (Unix Time) یا تایم استمپ (Time Stamp) چیست؟
#1
Lightbulb 
به نام خدا 
سلام دوستان امیدوارم حالتون خوب باشه...
امروز قصد داریم راجع به زمان یونیکس (Unix Time) یا همون تایم استمپ (Time Stamp) صحبت کنیم. همونطور که میدونیم زمان یکی از مهم ترین اطلاعاتی هست که در نرم افزارها ذخیره میشه و پردازش هایی روش صورت میگیره. رایانه ها و نرم افزارها به حای استفاده از تاریخ و ساعت معمولی ما انسان ها از سیستم زمانی خاصی به نام تایم استمپ استفاده میکنن چرا که پردازشش به مراتب بسیار ساده تره. در واقع تایم استمپ مقدار ثانیه های سپری شده از یکم ژانویه سال 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 روزی.
قبل از اینکه بقیه مطلب رو ادامه بدیم بد نیست تعداد روزهای ماه های میلادی رو بدونیم:
[تصویر:  %D9%85%D8%A7%D9%87-%D9%87%D8%A7%DB%8C-%D...50x341.jpg]
(در صورت عدم مشاهده تصویر بالا اینجا را کلیک کنید.)

** برای محاسبه تعداد سال های کبیسه سپری شده از فرمول زیر استفاده می کنیم:

[تصویر:  2.png]
عبارت Epoch بیانگر سال مبدأ و Current Year بیانگر سال کنونی است. کلید واژه Floor هم به این معناست که باید حاصل به دست اومده رو در صورتی که اعشاری و بزرگتر از یک شد قطع کرد. در صورتی که حاصل اعشاری و کوچکتر از یک (مثلاً 0.75) شد باید حاصل به دست آمده را به بالا گرد کرد.
** برای محاسبه تعداد سال های غیرکبیسه و معمولی (N) باید از فرمول زیر استفاده کرد: 
[تصویر:  3.png]
عبارت Current Year بیانگر سال کنونی است و عبارت هم بیانگر مقدار به دست آمده قطع یا گرد شده از فرمول قبلی است.
** برای محاسبه ثانیه های سپری شده از سال های کبیسه پشت سر گذاشته شده از فرمول زیر استفاده می کنیم:
[تصویر:  4.png]عبارت هم بیانگر مقدار به دست آمده قطع یا گرد شده از فرمول نخست می باشد.
** برای محاسبه ثانیه های سپری شده از سال های عادی و غیرکبیسه سپری شده از فرمول زیر استفاده می کنیم:
[تصویر:  5.png]


عبارت بیانگر تعداد سال های عادی و غیرکبیسه می باشد.
** برای محاسبه تعداد روزهای سپری شده از سال جاری (کنونی) بر حسب ثانیه (D) باید تعداد روزهای سپری شده از ابتدای سال را ضربدر 86400 کنیم. دقت کنید که اگر سال جاری (کنونی) کبیسه باشد فوریه 29 روزی خواهد بود.
** برای محاسبه ثانیه های سپری شده از روز کنونی ساعت موردنظر را در فرمول زیر قرار می دهیم:
[تصویر:  6.png]
عبارت بیانگر ساعت، بیانگر دقیقه و بیانگر ثانیه ساعت موردنظر می باشد. 
** در نهایت تایم استمپ موردنظر حاصل مجموع مقادیر LS و M و NS و D خواهد بود. البته بدون شک محاسبه ما تا این لحظه تقریبی بوده و برای این که مقدار دقیق تایم استمپ را به دست آوریم باید موارد خطا را نیز پوشش دهیم. یعنی:
[تصویر:  fr.png]
در حاشیه: 
دقت داشته باشین که شما میتونین زمان مبدأ (Epoch Time) رو هر مقدار دلخواهی که دوست دارین در نظر بگیرین اما در اینصورت باید محاسبات و مراحل متفاوتی رو طی کنین.
مثال:
قصد داریم تایم استمپ سوم ژانویه 2020 ساعت 17:01:23 را محاسبه کنیم.
  • ابتدا باید تعداد سال های کبیسه سپری شده را محاسبه کنیم:
[تصویر:  l.png] 
  • در مرحله دوم تعداد سال های عادی و غیرکبیسه را محاسبه می کنیم:
[تصویر:  n.png]
  • در مرحله سوم ثانیه های سپری شده از سال های کبیسه پشت سر گذاشته شده را محاسبه می کنیم:
[تصویر:  ls.png]
  • در مرحله چهـارم ثانیه های سپری شده از سال های غیر کبیسه و عادی پشت سر گذاشته شده را محاسبه می کنیم:
[تصویر:  ns.png]
  • در مرحله پنجم ثانیه های سپری شده از ابتدای سال تا امروز را محاسبه می کنیم:
[تصویر:  d2.png]
  • در مرحله ششم ساعت موردنظر را در فرمول قرار می دهیم تا ثانیه های سپری شده از ابتدای روز (M) را محاسبه کنیم:[تصویر:  m2.png]
  • در پایان هم تمامی مقادیر به دست آمده (و NS و LS) را با هم جمع میزنیم و خطاها را هم طبق فرمول نهایی گفته شده به حساب می آوریم تا تایم استمپ به دست آید:
[تصویر:  final.png]در نهایت تایم استمپ به دست آمده برابر با 1578058283 شد. 
نحوه تبدیل زمان یونیکس (تایم استمپ) به ساعت و تاریخ عادی : 
کمی قبل تر به تفصیل راجع به محاسبه تایم استمپ صحبت کردیم و یک مثال عملی رو هم پیاده سازی کردیم. اما برای تبدیل تایم استمپ به زمان و تاریخ عادی باید چه کنیم؟ 
برای فهمیدن سال کافیه مقدار تایم استمپ رو بر 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(تایم استمپ)"
(در کد بالا به جای کلمه «تایم استمپ» تایم استمپ موردنظر را وارد کنید. در ضمن دقت کنید که خروجی ساعت این تابع جاوا اسکریپت بر حسب ساعت GMT خواهد بود.)
برای تبدیل تاریخ و ساعت دلخواه به تایم استمپ هم میتونین از اکشن Execute Javascript به شکل زیر استفاده کنین:
کد:
"function toTimestamp(strDate){
var datum = Date.parse(strDate);
return datum/1000;
}
toTimestamp('02/13/2020 23:30')"
(در کد بالا به جای تاریخ و ساعت وارد شده مقابل عبارت toTimestamp تاریخ و ساعت موردنظر خودتون رو وارد کنین.)
 دریافت و تبدیل زمان یونیکس (تایم استمپ) به کمک PHP :
شما میتونین به کمک PHP و شیء اِی جَکس (AJAX) هم تایم استمپ رو دریافت و یا تبدیل کنین.
دریافت تایم استمپ: به منظور دریافت تایم استمپ کنونی کد PHP زیر رو در هاست یا سرور خودتون ذخیره کنین.
کد php:
<?php
// تعریف مجوز برای درخواست ajax برای سازگاری با انواع مرورگرها
header('Access-Control-Allow-Origin: *');
// چاپ تایم استمپ در خروجی
echo time();
?>
کافیه چنین ریکوئستی به فایل PHP تون بزنین:
کد:
yourhost.com/file.php
حالا می تونین با اکسپرشن AJAX.LASTDATA مقدار تایم استمپ کنونی رو در محیط کانستراکت دریافت کنید.
 تبدیل تایم استمپ به تاریخ و ساعت عادی: به منظور تبدیل تایم استمپ موردنظر به تاریخ و ساعت عادی باید کد 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);
?>
حالا کافیه چنین ریکوئستی به فایل PHP ارسال کنین:
کد:
yourhost.com/file.php?timestamp=x
(به جای عبارت 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");
?>
برای تبدیل ساعت و تاریخ دلخواه به تایم استمپ باید ریکوئستی مشابه نمونه زیر به این فایل PHP ارسال کنین:
کد:
yourhost.com/file.php?day=25&month=6&year=2018&hour=23&minute=15&second=11
(کافی است مقدار دلخواه رو جایگزین کنین.)
امیدوارم این مطلب براتون مفید و کاربردی واقع شده باشه و از این به بعد در پروژه هاتون به جای تاریخ و ساعت عادی از تایم استمپ استفاده کنین.
خوشحال میشم در ادامه نظراتتون رو بیان کنین و اگر جایی اشتباه بیان شده یا نامفهوم هست به بنده گوشزد بفرمایین.
با آرزوی بهترین ها...
غایب
  پاسخ


 سپاس شده توسط: M.gh ، oak ، hasansanaei ، nariman ، shazde ، amin hosseini ، ᔕinaᗪehghani
#2
Nice  16
  پاسخ


 سپاس شده توسط: Master Badfar ، ᔕinaᗪehghani
#3
واقعا عالی 4141
[تصویر:  default-yellow.svg]
غایب
  پاسخ


 سپاس شده توسط: Master Badfar ، ᔕinaᗪehghani
#4
سلام

اگر اشتباه نکنم ی پلاگینی رو رکس قبلا منتشر کرده بود که راحت تر میشد باهاش کار کرد با date و اگر اشتباه نکنم تایم استمپ هم اوکی هست .
Redirecting to https://c2rexplugins.weebly.com/rex_date.html

از فی لتر شکن استفاده کنید .
  پاسخ


 سپاس شده توسط: Master Badfar ، ᔕinaᗪehghani
#5
(1399/2/10، 07:36 عصر)hesam3 نوشته است: سلام

اگر اشتباه نکنم ی پلاگینی رو رکس قبلا منتشر کرده بود که راحت تر میشد باهاش کار کرد با date و اگر اشتباه نکنم تایم استمپ هم اوکی هست .
Redirecting to Redirecting to https://c2rexplugins.weebly.com/rex_date.html

از فی لتر شکن استفاده کنید .
سلام حسام جان؛
من یک پلاگین رو چند وقت پیش تست کردم عملکردش ایراد داشت. حالا نمیدونم این پلاگین بود یا نه.
ممنون بابت یادآوری...
غایب
  پاسخ


 سپاس شده توسط: hasansanaei ، ᔕinaᗪehghani
#6
(1399/2/10، 07:39 عصر)Master Badfar نوشته است:
(1399/2/10، 07:36 عصر)hesam3 نوشته است: سلام

اگر اشتباه نکنم ی پلاگینی رو رکس قبلا منتشر کرده بود که راحت تر میشد باهاش کار کرد با date و اگر اشتباه نکنم تایم استمپ هم اوکی هست .
Redirecting to Redirecting to Redirecting to https://c2rexplugins.weebly.com/rex_date.html

از فی لتر شکن استفاده کنید .
سلام حسام جان؛
من یک پلاگین رو چند وقت پیش تست کردم عملکردش ایراد داشت. حالا نمیدونم این پلاگین بود یا نه.
ممنون بابت یادآوری...
آره بلعکس من خودمم از این استفاده نکردم ، اما چند وقت پیش توی انجمن اصلی دیدمش که اکشن های جالبی داره ؛ حالا ی بررسی بکنید ببینید اگر همین پلاگینو استفاده کردید که عملکردش مشکل داشته بگید تا ببینیم میشه حلش کرد یا نه .
  پاسخ


 سپاس شده توسط: Master Badfar ، ᔕinaᗪehghani
#7
(1399/2/10، 07:51 عصر)hesam3 نوشته است:
(1399/2/10، 07:39 عصر)Master Badfar نوشته است:
(1399/2/10، 07:36 عصر)hesam3 نوشته است: سلام

اگر اشتباه نکنم ی پلاگینی رو رکس قبلا منتشر کرده بود که راحت تر میشد باهاش کار کرد با date و اگر اشتباه نکنم تایم استمپ هم اوکی هست .
Redirecting to Redirecting to Redirecting to Redirecting to https://c2rexplugins.weebly.com/rex_date.html

از فی لتر شکن استفاده کنید .
سلام حسام جان؛
من یک پلاگین رو چند وقت پیش تست کردم عملکردش ایراد داشت. حالا نمیدونم این پلاگین بود یا نه.
ممنون بابت یادآوری...
آره بلعکس من خودمم از این استفاده نکردم ، اما چند وقت پیش توی انجمن اصلی دیدمش که اکشن های جالبی داره ؛ حالا ی بررسی بکنید ببینید اگر همین پلاگینو استفاده کردید که عملکردش مشکل داشته بگید تا ببینیم میشه حلش کرد یا نه .
حسام جان من قسمت تایم استمپش رو (دریافت تایم استمپ کنونی و تبدیل یک تاریخ به تایم استمپ) بررسی کردم و 49971 سال از زمان خودش جلوتر بود!
اما دریافت تاریخ معمولیش ظاهراً درست بود.
[تصویر:  res.PNG]
غایب
  پاسخ


 سپاس شده توسط: hasansanaei ، ᔕinaᗪehghani
#8
آقای Master Badfar متاسفانه لینک تصاویر مشکل دارن ، من هرکاری میکنم برام باز نمیشن
حتی وقتی توی صفحه جدید بازش می کنم
[تصویر:  default-yellow.svg]
غایب
  پاسخ


 سپاس شده توسط:
#9
سلام Oak عزیز؛
بابت اطلاع رسانی متشکرم و سعی میکنم به زودی لینک ها رو تعمیر کنم.
غایب
  پاسخ


 سپاس شده توسط: oak
#10
لینک تصاویر اصلاح شد!
غایب
  پاسخ


 سپاس شده توسط: oak


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
  آموزش پروژه محور ساخت بازی مار و پله mohsen_nasri 6 3,807 1403/10/24، 09:38 عصر
آخرین ارسال: Tggi
Star مهم آموزش خروجی اندروید روی سیستم شخصی rezamms 128 86,462 1403/10/23، 04:58 عصر
آخرین ارسال: Tggi
  مهم آموزش تصویری خروجی مستقیم - یکبار برای همیشه! rezamms 33 20,911 1401/2/13، 09:39 عصر
آخرین ارسال: kamran_cn
  خروجی اندرید davinmstr1 2 2,601 1400/8/4، 10:23 عصر
آخرین ارسال: ᔕinaᗪehghani
  AAB (بسته برنامه اندروید) چيست؟ + نحوه خروجي گرفتن در كرودوا ᔕinaᗪehghani 15 8,600 1400/6/21، 01:55 صبح
آخرین ارسال: mehdi1100

پرش به انجمن: