راه حل تبدیل timestamp تاریخ های قبل از سال 01-01-1970
6 پست
• صفحه 1 از 1
- Nabi
- مدیر ارشد و مؤسس سایت
- پست: 28
- تشکر کرده: 16 پست
- تشکر شده: 13 پست
- تاریخ عضویت: 20 بهمن 91, 03:55
- محل اقامت: اهواز
راه حل تبدیل timestamp تاریخ های قبل از سال 01-01-1970
برخی افراد برای نگهداری تاریخ ها در دیتابیس از فیلدهای از نوع int استفاده میکنند و معادل UNIX timestamp تاریخ مورد نظر را در دیتابیس ذخیره میکنند.
اینکار به این دلیل است که کارهای محاسباتی روی فیلد تاریخ ساده تر شود.
اما میدانیم که timestamp تنها تاریخهای بعد از 01-01-1970 را درخود نگه میدارد. که این تاریخ مبدأ بوجود آمدن سیستم عامل یونیکس است.
بنابراین مشکل از همینجا آغاز میشود که تاریخهای قبل از 01-01-1970 به timestamp تبدیل نمیشوند و امکان ذخیره سازی آنها در دیتابیس وجود ندارد و یا ممکن است مقدار صفر ذخیره شود و در مجموع با مشکلاتی روبرو خواهید شد.
برای مثال ممکن است تاریخ تولد افراد را در فرم ثبت نام گرفته اید و ترجیح داده اید بصورت timestamp در دیتابیس نگهدارید تا محاسبه و تشخیص سن آنها ساده تر باشد.
حال طبعاً سن برخی افراد قبل از سال 1970 است و این مشکلاتی را در ذخیره اطلاعات بوجود خواهد آورد.
اما راه حل چیست؟
راه حل استفاده از آبجکت DateTime می باشد.
این آبجکت جزو آبجکت های هسته PHP است و نیاز به الحاق کتابخانه خاصی به پروژه نمی باشد. توسط متد getTimestamp از این آبجکت شما میتوانید timestamp هر تاریخی را برگردانید با این تفاوت که این متد، برای تاریخهای قبل از سال 1970، مقدار منفی برمیگرداند، بنابراین محسابات شما را دچار اشکال نخواهد کرد.
همچنین بازهم میتوانید timestamp منفی را به این آبجکت بدهید و تاریخ معادل آن را در هر فورمت دلخواه داشته باشید.
در نهایت برای محاسبه سن شخص، کافیست timestamp تاریخ تولد که قبلاً به شکل منفی در دیتابیس است را از timestamp زمان حال کسر کنید تا به سن شخص برسید.
به نمونه کد زیر توجه فرمائید:
خروجی:
تست کد به شکل آنلاین: https://ideone.com/sKjBWS
پ.ن.: شخصاً این موضوع که تاریخ به شکل 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 از این پست تشکر کرده است.
Re: راه حل تبدیل timestamp تاریخ های قبل از سال 01-01-1970
البته timestamp به طور عادی در محدوده ی زیر قابل استفاده می باشد:
از برچسب زمان 2147483647- تا 2147483647
از ۱۲۸۰/۰۹/۲۴ تا ۱۴۱۶/۱۰/۲۹ ، هجری شمسی
از 15-12-1901 تا 18-01-2038 ، میلادی گرگوری
--------------------------------------------------
و همچنین استفاده از برچسب زمان برای ذخیره ی تاریخ و زمان درج ، اصلاح و انتشار مطالب در CMS ها توصیه می گردد که کاربرد عمده ی ذخیره ی زمان ها می باشد.
برای مواردی مثل تاریخ تولّد که نیازی به نگهداری ساعت و دقیقه و ثانیه نمی باشد ، می توان از همان فرمت معمول استفاده نمود.
[*]
البته یک نوع تاریخ روزشمار هم وجود دارد که می توان برای ثبت مواردی مثل تاریخ تولد و ... از آن استفاده کرد:
Julian Day Count یا به اختصار JD که در بخش Calendar Functions سایت http://php.net توابع آن معرفی شده اند.
از برچسب زمان 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 از این پست تشکر کرده است.
- Nabi
- مدیر ارشد و مؤسس سایت
- پست: 28
- تشکر کرده: 16 پست
- تشکر شده: 13 پست
- تاریخ عضویت: 20 بهمن 91, 03:55
- محل اقامت: اهواز
Re: راه حل تبدیل timestamp تاریخ های قبل از سال 01-01-1970
php6 نوشته است:البته timestamp به طور عادی در محدوده ی زیر قابل استفاده می باشد:
از برچسب زمان 2147483647- تا 2147483647
البته احتمالاً فرض شما فیلد عددی دو بایتی (INT) بوده وگرنه برای نوع BIGINT دامنه آن خیلی بزرگتر است.
mjm از این پست تشکر کرده است.
Re: راه حل تبدیل timestamp تاریخ های قبل از سال 01-01-1970
خیر ، منظورم پشتیبانی توسّط تابع ()date به صورت عادی است. که معمولاً در محدوده ای که ذکر کردم بدون مشکل کار میکنه.
و برای تاریخ های تنها (بدون ساعت و دقیقه و ثانیه) و احتمالاً خارج از محدوده ی مذکور از JD استفاده می کنیم.
و برای تاریخ های تنها (بدون ساعت و دقیقه و ثانیه) و احتمالاً خارج از محدوده ی مذکور از JD استفاده می کنیم.
توسّط : متخصّص php - JavaScript - Html - Css - MySql - Apachi - WEB
mjm از این پست تشکر کرده است.
- Nabi
- مدیر ارشد و مؤسس سایت
- پست: 28
- تشکر کرده: 16 پست
- تشکر شده: 13 پست
- تاریخ عضویت: 20 بهمن 91, 03:55
- محل اقامت: اهواز
Re: راه حل تبدیل timestamp تاریخ های قبل از سال 01-01-1970
البته عرض بنده هم در مورد محدودیت فیلد دیتابیس اشتباه نبود. اما ظاهراً اشاره شما به توابع PHP بوده که صحیح هم است.
لازم به ذکره این مسئله از نسخه 5.1.0 به بعد پشتیبانی شده و قبل از اون، دامنه 01-01-1970 تا 19-01-2038 بوده است. (منبع) که البته برای سیستم های 32 بیتی می باشد و برای سیستمهای 64 بیتی تا 293 بیلیون سال پشتیبانی میشود. (منبع)
لازم به ذکره این مسئله از نسخه 5.1.0 به بعد پشتیبانی شده و قبل از اون، دامنه 01-01-1970 تا 19-01-2038 بوده است. (منبع) که البته برای سیستم های 32 بیتی می باشد و برای سیستمهای 64 بیتی تا 293 بیلیون سال پشتیبانی میشود. (منبع)
2 کاربر از این پست تشکر کرده اند.
Re: راه حل تبدیل timestamp تاریخ های قبل از سال 01-01-1970
Nabi نوشته است:برخی افراد برای نگهداری تاریخ ها در دیتابیس از فیلدهای از نوع int استفاده میکنند و معادل UNIX timestamp تاریخ مورد نظر را در دیتابیس ذخیره میکنند.
اینکار به این دلیل است که کارهای محاسباتی روی فیلد تاریخ ساده تر شود.
اما میدانیم که timestamp تنها تاریخهای بعد از 01-01-1970 را درخود نگه میدارد. که این تاریخ مبدأ بوجود آمدن سیستم عامل یونیکس است.
بنابراین مشکل از همینجا آغاز میشود که تاریخهای قبل از 01-01-1970 به timestamp تبدیل نمیشوند و امکان ذخیره سازی آنها در دیتابیس وجود ندارد و یا ممکن است مقدار صفر ذخیره شود و در مجموع با مشکلاتی روبرو خواهید شد.
برای مثال ممکن است تاریخ تولد افراد را در فرم ثبت نام گرفته اید و ترجیح داده اید بصورت timestamp در دیتابیس نگهدارید تا محاسبه و تشخیص سن آنها ساده تر باشد.
حال طبعاً سن برخی افراد قبل از سال 1970 است و این مشکلاتی را در ذخیره اطلاعات بوجود خواهد آورد.
اما راه حل چیست؟
...[/i]
جالب بود، تا حالا بهش فکر نکرده بودم
دنیای مجازی من
www . MJM3D . com
www . MJM3D . com
6 پست
• صفحه 1 از 1
چه کسی آنلاین است
کاربران حاضر در این انجمن : کاربر عضو شده ای موجود نیست و 0 مهمان