ثبت نام

راه حل تبدیل timestamp تاریخ های قبل از سال 01-01-1970

مدیر ارشد و مؤسس سایت
آواتار کاربر
پست: 28
تشکر کرده: 16 پست
تشکر شده: 13 پست
تاریخ عضویت: 20 بهمن 91, 03:55
محل اقامت: اهواز

راه حل تبدیل timestamp تاریخ های قبل از سال 01-01-1970

پستتوسط Nabi » 1 مرداد 94, 10:46

برخی افراد برای نگهداری تاریخ ها در دیتابیس از فیلدهای از نوع int استفاده میکنند و معادل UNIX timestamp تاریخ مورد نظر را در دیتابیس ذخیره میکنند.
اینکار به این دلیل است که کارهای محاسباتی روی فیلد تاریخ ساده تر شود.
اما میدانیم که timestamp تنها تاریخهای بعد از 01-01-1970 را درخود نگه میدارد. که این تاریخ مبدأ بوجود آمدن سیستم عامل یونیکس است.
بنابراین مشکل از همینجا آغاز میشود که تاریخهای قبل از 01-01-1970 به timestamp تبدیل نمیشوند و امکان ذخیره سازی آنها در دیتابیس وجود ندارد و یا ممکن است مقدار صفر ذخیره شود و در مجموع با مشکلاتی روبرو خواهید شد.
برای مثال ممکن است تاریخ تولد افراد را در فرم ثبت نام گرفته اید و ترجیح داده اید بصورت timestamp در دیتابیس نگهدارید تا محاسبه و تشخیص سن آنها ساده تر باشد.
حال طبعاً سن برخی افراد قبل از سال 1970 است و این مشکلاتی را در ذخیره اطلاعات بوجود خواهد آورد.
اما راه حل چیست؟
راه حل استفاده از آبجکت DateTime می باشد.
این آبجکت جزو آبجکت های هسته PHP است و نیاز به الحاق کتابخانه خاصی به پروژه نمی باشد. توسط متد getTimestamp از این آبجکت شما میتوانید timestamp هر تاریخی را برگردانید با این تفاوت که این متد، برای تاریخهای قبل از سال 1970، مقدار منفی برمیگرداند، بنابراین محسابات شما را دچار اشکال نخواهد کرد.
همچنین بازهم میتوانید timestamp منفی را به این آبجکت بدهید و تاریخ معادل آن را در هر فورمت دلخواه داشته باشید.
در نهایت برای محاسبه سن شخص، کافیست timestamp تاریخ تولد که قبلاً به شکل منفی در دیتابیس است را از timestamp زمان حال کسر کنید تا به سن شخص برسید.
به نمونه کد زیر توجه فرمائید:
کد: انتخاب همه
<?php

$date = new DateTime("1960-05-06");
$timestamp = $date->getTimestamp();
echo $timestamp; //-304707600

echo "\n";

$date = new DateTime();
$date->setTimestamp($timestamp);
$birthday = $date->format("Y-m-d");
echo $birthday; //1960-05-06

echo "\n";

echo date("Y") - $date->format("Y"); //سن شخص 55 سال (برای تاریخ امسال 2015)

?>


خروجی:
کد: انتخاب همه
-304732800
1960-05-06
55


تست کد به شکل آنلاین: https://ideone.com/sKjBWS

پ.ن.: شخصاً این موضوع که تاریخ به شکل timestamp در دیتابیس ذخیره شود را به صورت قطعی تائید نمیکنم چراکه مدت زیادی است که این موضوع حل شده است و امکان کارهای محاسباتی روی تاریخها درون کوئری ها میسر شده است.

mjm از این پست تشکر کرده است.

آواتار کاربر
پست: 13
تشکر کرده: 1 پست
تشکر شده: 15 پست
تاریخ عضویت: 31 تیر 94, 09:36

Re: راه حل تبدیل timestamp تاریخ های قبل از سال 01-01-1970

پستتوسط php6 » 1 مرداد 94, 13:51

البته timestamp به طور عادی در محدوده ی زیر قابل استفاده می باشد:
از برچسب زمان 2147483647- تا 2147483647
از ۱۲۸۰/۰۹/۲۴ تا ۱۴۱۶/۱۰/۲۹ ، هجری شمسی
از 15-12-1901 تا 18-01-2038 ، میلادی گرگوری
--------------------------------------------------
و همچنین استفاده از برچسب زمان برای ذخیره ی تاریخ و زمان درج ، اصلاح و انتشار مطالب در CMS ها توصیه می گردد که کاربرد عمده ی ذخیره ی زمان ها می باشد.
برای مواردی مثل تاریخ تولّد که نیازی به نگهداری ساعت و دقیقه و ثانیه نمی باشد ، می توان از همان فرمت معمول استفاده نمود.
[*]
البته یک نوع تاریخ روزشمار هم وجود دارد که می توان برای ثبت مواردی مثل تاریخ تولد و ... از آن استفاده کرد:
Julian Day Count یا به اختصار JD که در بخش Calendar Functions سایت http://php.net توابع آن معرفی شده اند.
توسّط : متخصّص php - JavaScript - Html - Css - MySql - Apachi - WEB

mjm از این پست تشکر کرده است.

مدیر ارشد و مؤسس سایت
آواتار کاربر
پست: 28
تشکر کرده: 16 پست
تشکر شده: 13 پست
تاریخ عضویت: 20 بهمن 91, 03:55
محل اقامت: اهواز

Re: راه حل تبدیل timestamp تاریخ های قبل از سال 01-01-1970

پستتوسط Nabi » 1 مرداد 94, 15:52

php6 نوشته است:البته timestamp به طور عادی در محدوده ی زیر قابل استفاده می باشد:
از برچسب زمان 2147483647- تا 2147483647

البته احتمالاً فرض شما فیلد عددی دو بایتی (INT) بوده وگرنه برای نوع BIGINT دامنه آن خیلی بزرگتر است.

mjm از این پست تشکر کرده است.

آواتار کاربر
پست: 13
تشکر کرده: 1 پست
تشکر شده: 15 پست
تاریخ عضویت: 31 تیر 94, 09:36

Re: راه حل تبدیل timestamp تاریخ های قبل از سال 01-01-1970

پستتوسط php6 » 1 مرداد 94, 20:38

خیر ، منظورم پشتیبانی توسّط تابع ()date به صورت عادی است. که معمولاً در محدوده ای که ذکر کردم بدون مشکل کار میکنه.
و برای تاریخ های تنها (بدون ساعت و دقیقه و ثانیه) و احتمالاً خارج از محدوده ی مذکور از JD استفاده می کنیم.
توسّط : متخصّص php - JavaScript - Html - Css - MySql - Apachi - WEB

mjm از این پست تشکر کرده است.

مدیر ارشد و مؤسس سایت
آواتار کاربر
پست: 28
تشکر کرده: 16 پست
تشکر شده: 13 پست
تاریخ عضویت: 20 بهمن 91, 03:55
محل اقامت: اهواز

Re: راه حل تبدیل timestamp تاریخ های قبل از سال 01-01-1970

پستتوسط Nabi » 1 مرداد 94, 00:52

البته عرض بنده هم در مورد محدودیت فیلد دیتابیس اشتباه نبود. اما ظاهراً اشاره شما به توابع PHP بوده که صحیح هم است.
لازم به ذکره این مسئله از نسخه 5.1.0 به بعد پشتیبانی شده و قبل از اون، دامنه 01-01-1970 تا 19-01-2038 بوده است. (منبع) که البته برای سیستم های 32 بیتی می باشد و برای سیستمهای 64 بیتی تا 293 بیلیون سال پشتیبانی میشود. (منبع)

2 کاربر از این پست تشکر کرده اند.

مدیر سایت
آواتار کاربر
پست: 7
تشکر کرده: 15 پست
تشکر شده: 7 پست
تاریخ عضویت: 20 بهمن 91, 04:06

Re: راه حل تبدیل timestamp تاریخ های قبل از سال 01-01-1970

پستتوسط mjm » 4 مرداد 94, 08:32

Nabi نوشته است:برخی افراد برای نگهداری تاریخ ها در دیتابیس از فیلدهای از نوع int استفاده میکنند و معادل UNIX timestamp تاریخ مورد نظر را در دیتابیس ذخیره میکنند.
اینکار به این دلیل است که کارهای محاسباتی روی فیلد تاریخ ساده تر شود.
اما میدانیم که timestamp تنها تاریخهای بعد از 01-01-1970 را درخود نگه میدارد. که این تاریخ مبدأ بوجود آمدن سیستم عامل یونیکس است.
بنابراین مشکل از همینجا آغاز میشود که تاریخهای قبل از 01-01-1970 به timestamp تبدیل نمیشوند و امکان ذخیره سازی آنها در دیتابیس وجود ندارد و یا ممکن است مقدار صفر ذخیره شود و در مجموع با مشکلاتی روبرو خواهید شد.
برای مثال ممکن است تاریخ تولد افراد را در فرم ثبت نام گرفته اید و ترجیح داده اید بصورت timestamp در دیتابیس نگهدارید تا محاسبه و تشخیص سن آنها ساده تر باشد.
حال طبعاً سن برخی افراد قبل از سال 1970 است و این مشکلاتی را در ذخیره اطلاعات بوجود خواهد آورد.
اما راه حل چیست؟
...[/i]


جالب بود، تا حالا بهش فکر نکرده بودم :D
دنیای مجازی من
www . MJM3D . com

بازگشت به مقالات آموزشی PHP

چه کسی آنلاین است

کاربران حاضر در این انجمن : کاربر عضو شده ای موجود نیست و 1 مهمان