اگر روی پروژه های فارسی و داخل ایران کار کرده باشین قطعا میدونید که تبدیل تاریخ و زمان کاری هست که زیاد باهاش سروکار داریم حالا ما در این پست با تبدیل تاریخ با استفاده از جاوا اسکریپت کار داریم در واقع تاریخ رو از سرور میگیریم و سمت کلاینت تبدیل می کنیم، میخوام براتون توابعی بنویسم و قرار بدم که تبدیل تاریخ میلادی به شمسی و شمسی به میلادی رو انجام بده و در ادامه هم یک مثال کاربردی و عملی از دیتابیس MySQL و مقدار پیشفرض CURRENT_TIMESTAMP از نوع TIMESTAMP که دارای مقدار دیفالت میلادی هست بزنم که یک نمونه قابل استفاده در پروژه هامون که با MySQL کار میکنن داشته باشیم
function miladi_be_shamsi(gy, gm, gd) {
var g_d_m, jy, jm, jd, gy2, days;
g_d_m = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
gy2 = (gm > 2) ? (gy + 1) : gy;
days = 355666 + (365 * gy) + ~~((gy2 + 3) / 4) - ~~((gy2 + 99) / 100) + ~~((gy2 + 399) / 400) + gd + g_d_m[gm - 1];
jy = -1595 + (33 * ~~(days / 12053));
days %= 12053;
jy += 4 * ~~(days / 1461);
days %= 1461;
if (days > 365) {
jy += ~~((days - 1) / 365);
days = (days - 1) % 365;
}
if (days < 186) {
jm = 1 + ~~(days / 31);
jd = 1 + (days % 31);
} else {
jm = 7 + ~~((days - 186) / 30);
jd = 1 + ((days - 186) % 30);
}
return [jy + '/' + jm + '/' + jd];
}
console.log(miladi_be_shamsi(1990, 07, 22));
// Output: ['1369/4/31']
function shamsi_be_miladi(jy, jm, jd) {
var sal_a, gy, gm, gd, days;
jy += 1595;
days = -355668 + (365 * jy) + (~~(jy / 33) * 8) + ~~(((jy % 33) + 3) / 4) + jd + ((jm < 7) ? (jm - 1) * 31 : ((jm - 7) * 30) + 186);
gy = 400 * ~~(days / 146097);
days %= 146097;
if (days > 36524) {
gy += 100 * ~~(--days / 36524);
days %= 36524;
if (days >= 365) days++;
}
gy += 4 * ~~(days / 1461);
days %= 1461;
if (days > 365) {
gy += ~~((days - 1) / 365);
days = (days - 1) % 365;
}
gd = days + 1;
sal_a = [0, 31, ((gy % 4 === 0 && gy % 100 !== 0) || (gy % 400 === 0)) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
for (gm = 0; gm < 13 && gd > sal_a[gm]; gm++) gd -= sal_a[gm];
return [gy + '/' + gm + '/' + gd];
}
console.log(shamsi_be_miladi(1369, 04, 31));
// Output: ['1990/7/22']
خب تا اینجا تبدیل تاریخ با جاوا اسکریپت رو یاد گرفتیم حال می خواهیم این تبدیل را بر روی رشته تاریخ با فرمت دیفالت MySQL انجام بدیم قبلش یک نگاهی به مدل ذخیره سازی و نگهداری تاریخ و زمان در دیتابیس MySQL بندازیم تا با فرمتش آشنا بشیم
حالا که با فرمت های تاریخ و زمان دیتابیس MySQL آشنا شدید شاید براتون سوال شده باشه که چرا فرمت DATETIME و TIMESTAMP یکسان هستند!؟ در پاسخ به این سوال باید بگم که:
DATETIME شامل تاریخ و زمان با فرمت 'YYYY-MM-DD hh:mm:ss' با محدوده پشتیبانی از '1000-01-01 00:00:00' تا '9999-12-31 23:59:59' می باشد، همچنین در مقابل TIMESTAMP هم شامل تاریخ و زمان اما با محدوده پشتیبانی UTC (ساعت هماهنگ جهانی) می باشد و دارای محدوده پشتیبانی از '1970-01-01 00:00:01' تا '2038-01-19 03:14:07' است حالا بریم که یک مثال عملی از نوع MySQL هم داشته باشیم
let mysql_timestamp = '2015-03-17 15:42:08';
let date_convert_y = parseInt(mysql_timestamp.substr(0, 4));
let date_convert_m = parseInt(mysql_timestamp.substr(5, 2));
let date_convert_d = parseInt(mysql_timestamp.substr(8, 2));
console.log(miladi_be_shamsi(date_convert_y, date_convert_m, date_convert_d));
// Output: ['1393/12/26']
let mysql_timestamp = '1393-12-26 15:42:08';
let date_convert_y = parseInt(mysql_timestamp.substr(0, 4));
let date_convert_m = parseInt(mysql_timestamp.substr(5, 2));
let date_convert_d = parseInt(mysql_timestamp.substr(8, 2));
console.log(shamsi_be_miladi(date_convert_y, date_convert_m, date_convert_d));
// Output: ['2015/3/17']
در کد بالا متغیر mysql_timestamp در واقع مقداریست که از سرور دریافت می کنیم که به صورت کامل یعنی تاریخ و زمان می باشد سپس با استفاده از فانکشن ()parseInt رشته مورد نظرمون رو به عدد صحیح (Integer) تبدیل میکنیم (اگر از نوع رشته باشه کار نمیکنه) و با استفاده از تابع ()substr سال، ماه، روز را از کل رشته برش می دهیم و داخل فانکشن تبدیل تاریخمان از این اعداد به دست آمده استفاده میکنیم تا به نتیجه درست برسیم، خلاص ¯\_(ツ)_/¯