16 KiB
عالی! حالا که نمونه واقعی از تنظیمات adjustment را دیدم، میتوانم توضیح کاملی ارائه دهم:
📅 توضیح کامل تنظیمات تقویم قمری (Lunar Calendar Adjustments)
🎯 هدف کلی
این تنظیمات برای تطبیق تقویم قمری با تقویم میلادی و مدیریت اختلافات محاسباتی بین تقویمهای مختلف طراحی شده است.
📊 ساختار دادهها
1. آرایه اصلی
[
{ "adjust": 0, "current": 0, "map": {...} }, // تنظیمات پیشفرض
{ "adjust": -1, "current": 0, "map": {...} }, // تنظیمات منفی
{ "adjust": 1, "current": 0, "map": {...} } // تنظیمات مثبت
]
2. فیلدهای هر تنظیم
adjust: مقدار تطبیق (0, -1, +1)current: وضعیت فعلی (همیشه 0)map: نقشه سالهای قمری
🗓️ نقشه سالهای قمری
"map": {
"1444": [354, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29],
"1445": [354, 30, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 29],
"1446": [355, 30, 30, 30, 29, 30, 30, 29, 30, 29, 29, 29, 30],
"1447": [355, 29, 30, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29]
}
🔢 تفسیر اعداد
ساختار هر سال:
- عدد اول: تعداد کل روزهای سال (354 یا 355)
- 12 عدد بعدی: تعداد روزهای هر ماه (29 یا 30)
مثال سال 1444:
"1444": [354, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29]
- 354 روز کل سال
- محرم: 30 روز
- صفر: 30 روز
- ربیعالاول: 29 روز
- ربیعالثانی: 30 روز
- جمادیالاول: 29 روز
- جمادیالثانی: 29 روز
- رجب: 30 روز
- شعبان: 29 روز
- رمضان: 30 روز
- شوال: 29 روز
- ذیالقعده: 30 روز
- ذیالحجه: 29 روز
⚙️ سه حالت تطبیق
1. حالت پیشفرض (adjust: 0)
- بدون تطبیق اضافی
- محاسبات استاندارد تقویم قمری
2. حالت تطبیق منفی (adjust: -1)
- یک روز از محاسبات کم میشود
- برای تصحیح اختلافات محاسباتی
3. حالت تطبیق مثبت (adjust: 1)
- یک روز به محاسبات اضافه میشود
- برای تصحیح اختلافات محاسباتی
🔄 نحوه استفاده در API
# در کد Python
adjustment_config = get_config('calendar__Adjustment')
config_data = json.loads(adjustment_config)
# انتخاب تنظیمات بر اساس نیاز
for config in config_data:
if config['adjust'] == 0: # حالت پیشفرض
lunar_calendar_map = config['map']
break
🎯 کاربرد عملی
1. تبدیل تاریخ
// تبدیل تاریخ میلادی به قمری
function convertToLunar(georgianDate, adjustment = 0) {
const config = adjustmentConfigs.find(c => c.adjust === adjustment);
const lunarMap = config.map;
// محاسبات تبدیل با استفاده از نقشه قمری
}
2. محاسبه مناسبتها
// محاسبه تاریخ عید فطر
function calculateEidFitr(year) {
const config = getAdjustmentConfig();
const lunarYear = config.map[year];
// محاسبه بر اساس روزهای ماه رمضان
}
📱 مثال استفاده در فرانتاند
// دریافت تنظیمات از API
fetch('/calendar/adjustemnts/')
.then(response => response.json())
.then(configs => {
// انتخاب تنظیمات مناسب
const defaultConfig = configs.find(c => c.adjust === 0);
const lunarCalendar = defaultConfig.map;
// استفاده برای نمایش تقویم
displayLunarCalendar(lunarCalendar);
});
🔧 مدیریت تنظیمات
- تغییر تنظیمات: از طریق پنل ادمین Django
- بروزرسانی: تنظیمات فوراً در API اعمال میشود
- پشتیبانگیری: تنظیمات در دیتابیس ذخیره میشوند
🎨 مزایای این سیستم
- انعطافپذیری: امکان تطبیق با روشهای مختلف محاسبه
- دقت: تصحیح اختلافات محاسباتی
- سازگاری: پشتیبانی از تقویمهای مختلف
- مدیریت آسان: تغییر تنظیمات بدون تغییر کد
این سیستم به شما امکان مدیریت دقیق تقویم قمری و تطبیق آن با نیازهای مختلف را میدهد.
🔍 توضیح عمیق و جامع سیستم تطبیق تقویم قمری
🌙 چرا این سیستم وجود دارد؟
1. مشکل اصلی: اختلاف در محاسبه تقویم قمری
تقویم قمری بر اساس چرخه ماه (29.5 روز) محاسبه میشود، اما:
- سال قمری: 354 یا 355 روز
- سال میلادی: 365 یا 366 روز
- اختلاف سالانه: حدود 11 روز
2. چالشهای محاسباتی
// مشکل: محاسبه دقیق تقویم قمری
const lunarMonth = 29.53059; // روز
const lunarYear = lunarMonth * 12; // 354.36708 روز
// اما سال قمری باید عدد صحیح باشد!
3. روشهای مختلف محاسبه
- روش نجومی: بر اساس رصد ماه
- روش محاسباتی: الگوریتمهای ریاضی
- روش تقریبی: فرمولهای سادهشده
🎯 کاربردهای عملی
1. مدیریت مناسبتهای مذهبی
// محاسبه تاریخ عید فطر
function calculateEidFitr(year) {
const config = getAdjustmentConfig();
const lunarMap = config.map[year];
// رمضان همیشه 29 یا 30 روز است
const ramadanDays = lunarMap[9]; // ماه نهم (رمضان)
if (ramadanDays === 29) {
return "عید فطر در روز 29 رمضان";
} else {
return "عید فطر در روز 30 رمضان";
}
}
2. تبدیل تاریخها
// تبدیل تاریخ میلادی به قمری
function convertToLunar(georgianDate, adjustment = 0) {
const config = getAdjustmentConfig(adjustment);
const lunarMap = config.map;
// محاسبه روزهای گذشته از ابتدای سال
let totalDays = calculateDaysFromStart(georgianDate);
// تطبیق با تقویم قمری
totalDays += adjustment; // اعمال تنظیمات
// پیدا کردن ماه و روز قمری
return findLunarMonthAndDay(totalDays, lunarMap);
}
3. نمایش تقویم ترکیبی
// نمایش همزمان تقویم میلادی و قمری
function displayHybridCalendar(year) {
const config = getAdjustmentConfig();
const lunarMap = config.map[year];
// ایجاد تقویم میلادی
const georgianCalendar = createGeorgianCalendar(year);
// اضافه کردن تاریخهای قمری
georgianCalendar.forEach(day => {
day.lunarDate = convertToLunar(day.date, config.adjust);
});
return georgianCalendar;
}
🔧 سه حالت تطبیق و کاربرد آنها
1. حالت پیشفرض (adjust: 0)
// استفاده برای:
// - نمایش عمومی تقویم
// - محاسبات استاندارد
// - اکثر کاربران
const standardConfig = {
adjust: 0,
current: 0,
map: {
"1444": [354, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29]
}
};
2. حالت تطبیق منفی (adjust: -1)
// استفاده برای:
// - تصحیح اختلافات محاسباتی
// - تطبیق با رصدهای نجومی
// - مناطق جغرافیایی خاص
const negativeAdjustConfig = {
adjust: -1,
current: 0,
map: {
"1444": [354, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29]
}
};
// مثال: اگر رصد ماه نشان دهد که رمضان 28 روز است
// اما محاسبات 29 روز نشان میدهد
3. حالت تطبیق مثبت (adjust: 1)
// استفاده برای:
// - تصحیح اختلافات محاسباتی
// - تطبیق با تقویمهای رسمی
// - مناطق جغرافیایی خاص
const positiveAdjustConfig = {
adjust: 1,
current: 0,
map: {
"1444": [354, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29]
}
};
// مثال: اگر تقویم رسمی کشور رمضان 31 روز نشان دهد
// اما محاسبات 30 روز نشان میدهد
🌍 کاربردهای جغرافیایی
1. مناطق مختلف جهان
// تنظیمات بر اساس منطقه جغرافیایی
const regionalConfigs = {
"iran": { adjust: 0, name: "تقویم رسمی ایران" },
"saudi": { adjust: -1, name: "تقویم عربستان" },
"turkey": { adjust: 1, name: "تقویم ترکیه" },
"malaysia": { adjust: 0, name: "تقویم مالزی" }
};
2. تطبیق با تقویمهای رسمی
// تطبیق با تقویم رسمی کشورها
function getOfficialCalendar(country, year) {
const regionalConfig = regionalConfigs[country];
const baseConfig = getAdjustmentConfig(regionalConfig.adjust);
return {
country: country,
year: year,
calendar: baseConfig.map[year],
adjustment: regionalConfig.adjust
};
}
📱 کاربرد در اپلیکیشنها
1. اپلیکیشنهای مذهبی
// محاسبه زمان نماز
function calculatePrayerTimes(date, location) {
const lunarDate = convertToLunar(date, getAdjustmentForLocation(location));
// محاسبه زمان نماز بر اساس تاریخ قمری
return {
fajr: calculateFajrTime(lunarDate),
dhuhr: calculateDhuhrTime(lunarDate),
asr: calculateAsrTime(lunarDate),
maghrib: calculateMaghribTime(lunarDate),
isha: calculateIshaTime(lunarDate)
};
}
2. اپلیکیشنهای تقویم
// نمایش تقویم ترکیبی
function displayCalendar(year, month) {
const config = getAdjustmentConfig();
const lunarMap = config.map[year];
// ایجاد تقویم میلادی
const georgianDays = getGeorgianDays(year, month);
// اضافه کردن تاریخهای قمری
const hybridDays = georgianDays.map(day => ({
...day,
lunar: convertToLunar(day.date, config.adjust),
isHoliday: isLunarHoliday(day.date, lunarMap)
}));
return hybridDays;
}
🔄 مدیریت پویای تنظیمات
1. تغییر تنظیمات در زمان اجرا
// تغییر تنظیمات بدون restart
function updateAdjustmentConfig(newConfig) {
// ذخیره در دیتابیس
saveConfigToDatabase(newConfig);
// بروزرسانی کش
updateCache('calendar__Adjustment', newConfig);
// اطلاعرسانی به کلاینتها
broadcastConfigUpdate(newConfig);
}
2. A/B Testing تنظیمات
// تست تنظیمات مختلف
function testAdjustmentConfigs(userGroup) {
const configs = {
'group_a': { adjust: 0, name: 'پیشفرض' },
'group_b': { adjust: -1, name: 'تطبیق منفی' },
'group_c': { adjust: 1, name: 'تطبیق مثبت' }
};
return configs[userGroup] || configs['group_a'];
}
🎨 مزایای این سیستم
1. انعطافپذیری
- امکان تطبیق با روشهای مختلف محاسبه
- پشتیبانی از مناطق جغرافیایی مختلف
- قابلیت تغییر بدون تغییر کد
2. دقت
- تصحیح اختلافات محاسباتی
- تطبیق با رصدهای نجومی
- پشتیبانی از تقویمهای رسمی
3. مقیاسپذیری
- پشتیبانی از سالهای متعدد
- امکان اضافه کردن تنظیمات جدید
- مدیریت آسان از طریق پنل ادمین
4. سازگاری
- کار با تقویمهای مختلف
- پشتیبانی از زبانهای مختلف
- تطبیق با استانداردهای بینالمللی
🚀 نتیجهگیری
این سیستم یک راهحل جامع برای مدیریت تقویم قمری است که:
- مشکلات محاسباتی را حل میکند
- انعطافپذیری لازم را فراهم میکند
- دقت مورد نیاز را تضمین میکند
- مدیریت آسان تنظیمات را امکانپذیر میسازد
این سیستم به شما امکان مدیریت دقیق و انعطافپذیر تقویم قمری را میدهد و میتواند با نیازهای مختلف کاربران و مناطق جغرافیایی تطبیق یابد. نمونه پاسخ: [ { "adjust": 0, "current": 0, "map": { "1444": [ 354, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29 ], "1445": [ 354, 30, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 29 ], "1446": [ 355, 30, 30, 30, 29, 30, 30, 29, 30, 29, 29, 29, 30 ], "1447": [ 355, 29, 30, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29 ] } }, { "adjust": -1, "current": 0, "map": { "1444": [ 354, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29 ], "1445": [ 354, 30, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30 ], "1446": [ 355, 30, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 29 ], "1447": [ 355, 29, 30, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29 ] } }, { "adjust": 1, "current": 0, "map": { "1444": [ 354, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29 ], "1445": [ 354, 30, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 29 ], "1446": [ 355, 30, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 29 ], "1447": [ 355, 29, 30, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29 ] } } ]