در تابع Shamsi در دو متغیر تاریخ شمسی و میلادی مبنا ذخیره میشود ، با تابع DateDiff خود اکسس اختلاف روزهای دو تاریخِ روز و تاریخ میلادی مبنا محاسبه شده و اگر بزرگتر از صفر بود به تابع AddDay پاس داده میشود تا این تعداد روز بدست آمده به تاریخ شمسی مبنا اضافه شود هر چقدر تاریخ مبنا با تاریخ روز نزدیک تر شود جواب سریعتر پاسخ داده میشود یعنی هر چند سال یکبار باید تاریخ مبناها را عوض کنید.
Public Function shamsi() As Long
Dim Shamsi_Mabna As Long
Dim Miladi_mabna As Date
Dim Dif As Long
Shamsi_Mabna = 13791012
Miladi_mabna = #1/1/2001#
Dif = DateDiff("d", Miladi_mabna, Date)
If Dif < 0 Then
MsgBox "?!!!"
Else
shamsi = AddDay(Shamsi_Mabna, Dif)
End If
End Function
در تابع زیر کبیسه بودن سال شمسی را مشخص میکند البته از Mod 4 برای تمام سال های شمسی از ابتدا تا ... نمی توان استفاده کرد چون سال کبیسه ۵ ساله هم وجود دارد.
برای تشخیص سالهای کبیسه در گاهشماری رسمی ایران شیوه کاملاً یکنواختی وجود ندارد. برای سالهای ۱۲۴۴ تا ۱۳۴۲ چنانچه باقیماندهٔ حاصل تقسیم سال مورد نظر بر عدد ۳۳، یکی از اعداد (۱، ۵، ۹، ۱۳، ۱۷، ۲۱، ۲۶ و ۳۰) باشد آن سال کبیسه خواهد بود.و برای سالهای اخیر (سالهای ۱۳۴۳ تا ۱۴۷۲)، بهجای ۲۱، باقیماندهٔ ۲۲ ملاک خواهد بود. برای دیگر سالها و دورهها نیز به مراتب تفاوتهایی در اعداد هشتگانه فوق وجود دارد. برای نمونه سال ۱۳۹۱ سالی کبیسه است چراکه باقیماندهٔ تقسیم آن بر عدد ۳۳ برابر عدد ۵ است.
تابع زیر دو تاریخ را میگیرد و تعداد روزهای بین آنها را باز می گرداند البته بهتر و کمتر از اینهم می توان نوشت.
مثال ۲۷۹ روزبه تاریخ ۱۶ ۱۲ ۱۳۷۰ اضافه شود
۱۳۷۰ ۱۲ ۱۶
add=۲۷۹
R=۱۶
m=۱۲
s=۱۳۷۰
K=۱ چون سال ۱۳۷۰ کبیسه است
پاسکاری سال و ماه به تابع MahDays برای استخراج تعداد روز در متغیر Days و چون سال کبیسه است پس ۳۰ روز را بر می گرداند
Days=۳۰
چون add بزرگتر از Addays-R است add میشود و R را یک قرار می دهیم ، چون ماه ۱۲ است عدد m را یک در نظر میگیریم و به عدد سال هم اضافه میکنیم
add=۲۷۹-(۳۰-۱۶+۱)=۲۶۴
R=1
m=1
s=۱۳۷۱
حالا محاسبات تبدیل این ۲۶۴ رابه روزه و ماه باید انجام دهیم بنابراین درون لوپی قرار میگیرد.
K=0 چون سال ۱۳۷۱ کبیسه نیست
R = R + add
R = ۱ + ۱۸ = ۱۹
S = ۱۳۷۱
۱۳۷۱ ۰۸ ۱۹
البته باید ۱۸ بشود چون اختلاف بین دو تاریخ ۱۶ ۱۲ ۱۳۷۰ تا ۱۳۷۱ ۰۸ ۱۸ میشود۲۷۹ روز به باحساب مراجعه شود.
در قسمت CASE ELSE فرضاً اگر عدد add بالاتر از ۳۶۵ یا ۳۶۶ ( منهای یک ) باشد یک عدد به عدد سال اضافه میکند و بعد این اعداد از عدد add کسر میشوند و تا جایی ادامه پیدا میکند که عدد مانده درون یکی از دو کیس قرار گیرد یعنی یا کمتر از عدد ماه مربوطه شود یا بین عدد ماه تا عدد سال باشد و بعد درون مورد اول قرار گیرد.
تابع زیر با توجه به عدد سال و عدد ماه تعداد روزهای آن ماه را بازیابی می کند در تابع جایی نوشته شده اگر سال کبیسه باشد تعداد روزهای آن ماه را ۳۰ روز تعیین کند
۲۰ آدر ۱۴۰۳
حقیقتی که به زودی افشا می شود
فراربشاراسد و آزادی زندانیان درست مثل تجاوز طالبان به افغانستان
تجاوز جنسی گسترده در زندان مخوف صیدنایا
با این حال، تا چند روز دیگر پرده از اسرار این زندان مخوف برداشته می شود. اکنون زندان به دست انقلابیون افتاده و آنها به برخی طبقات این زندان پیچیده دسترسی پیدا کرده اند. احتمالا تا چند روز دیگر تمام زندان به دست انقلابیون کشف شده و دادگاه عاملان و مجرمان این زندان نیز برگزار می گردد.
طبق گزارش الجزیره، نخستین برخورد انقلابیون با زندان صیدنایا شوکه کننده بوده است. انقلابیون زندانیانی را آزاد کرده اند که به مدت 40 سال در سلول های تنگ و تاریک صیدنایا زندانی بوده اند. «راغید الطاطاری» یکی از این زندانیان است. او خلبان نیروی هوایی سوریه بود که ۴۳سال پیش به علت سرپیچی از دستور بمباران حماه توسط حافظ اسد زندانی شد. او دیروز از زندان صیدنایا آزاد شد.
شبکه الجزیره از جنازههای تازه زندانیان کشته شده توسط رژیم اسد در صیدنایا گزارش تهیه کرده و خبرنگارش به نقل از چند شاهد در صحنه میگوید این جسدها که همگی بر اثر شکنجه به قتل رسیدهاند حداکثر مربوط به ۱۰ تا ۱۴ روز قبل از سقوط بشار اسد است.
independentpersian ✓
Twitter › indypersian
علی خامنهای، رهبر جمهوری اسلامی، روز یکشنبه دوم دی ماه در دیدار با جمعی از مداحان به موضوع حمایت احتمالی آمریکا از اعتراضات در ایران واکنش نشان داد. او گفت: «یک عنصر از مسئولین آمریکایی میگوید هر کس که در ایران اغتشاش کند، ما کمکش کنیم. احمقها بوی کباب شنیدهاند.» جمهوری…
Twitter • ۳ ساعت پیش ( ۲ دیماه ۱۴۰۳ )
Function CheckValidShamsiDate(Dt) As Boolean
اگر فرمت بدین شکل باشد و / در فیلد ذخیره شود و سال هم چهار رقمی باشد 0000/00/00
((Y=Val(Mid(Dt,1,4
((M=val(Mid(Dt,6,2
((D=Val(Mid(Dt,9,2
If Y<1 And Y>2500 Then
CheckValidShamsiDate=False
End if
Select Case M
Case 1 To 6
If D>31 And D<1 Then
CheckValidShamsiDate=False
End if
Case 7 To 11
If D>30 And D<1 Then
CheckValidShamsiDate=False
End if
Case 12
If KabisehShamsi(Y)=True Then
If D>30 And D<1 Then CheckValidShamsiDate=False
Else if KabisehShamsi(Y)=False
If D>29 Abd D<1 Then CheckValidShamsiDate=False
End if
End Select
تابع بالا را میتوان در رویداد Exit تکست باکس نوشت که اگر False شد Cancel برابر True شود. چک کردن سال کبیسه ی شمسی هم مفصل در جای دیگر بحث شده.
روش :
1-جداکردن ماه ، روز و سال و ذخیره در Alias ها ی M,D,Y که برای تاریخ میلادی بسیار آسان است
(Y=Year(Dt
(M=Month(Dt
(D=Day(Dt
و اگر تاریخ ورودی اعتبار نداشته باشد فرضا ماهی که ۲۹ روزه است را سی روزه وارد کنید یا ماه را بیشتراز ۱۲ تایپ کنید یا فرمت اشتباه باشد خودش ارور را اعلام میکند احتمالا بعنوان Type Mismatch ... از توابع بالا برای ماه شمسی نمی توانید استفاده کنید چونکه روزهای ماه شمسی با میلادی فرق میکند.
۲-لوپ زدن از یک تا تعداد روزی که باید به تاریخ اضافه شود یعنی n منهای یک
۳-D=D+1
4-اگر D بزرگتر از تعداد روزهای میلادی شد D برابر یک خواهد شد ( (البته باید طبق سال کبیسه باشد ) و M=M+1
5-اگر Y بزرگتر از ۱۲ شد Y=Y+1 و M=1
البته این کانتراست و بسیاردقیق ، اگر فواصل تاریخی زیاد باشد این روش مناسب نیست چون حدود ۳ ثانیه طول میکشد تا جواب را برگرداند .
اضافه کردن 474003 روز به ۲۲ مارس ۶۲۲ که برابر روز جمعه اول فروردین سال یک است .
بدست آوردن شمسی : (البته با DateDiff میتوان اختلاف بین ۲۲ مارس ۶۲۲ تا ۳۱ دسامبر ۱۹۱۹ را بدست آورد که همین عدد است)
۱-تعداد روزهای سپری شده از اول ماه شمسی که اینجا یک فروردین سال یک است معادل ۲۲ مارس ۶۲۲ موردنظر که اینجا ۱ است
۲-تعداد کبیسه های میلادی که ۳۱۴ است
474,003−(1,298×365)−314+
1
در معادله ی بالا عدد منفی شده که با ۳۶۵ اگر جمع کنیم عدد ۲۸۵ حاصل میگردد که هدف ماست بعد از کم کردن تعداد ماه های شمسی از عدد تا زمانیکه منفی نشده روز بدست می آید که همان ۹ است و تعداد ماه های کم شده باضافه ی یک هم ماه مذبور
میشود یعنی ۱۰ ... پس تاریخ ۹ دیماه ۱۲۹۸ خواهد شد
: بدست آوردن میلادی
اگر عدد کوچکتر مساوی صفر شد با ۳۶۵ جمع میزنیم
474,003−(1,298×365)−314
+81+365=365
اضافه کردن ۴۳۰۸ روز به ۳/۲۱/۲۰۰۶ یا معادل شمسی ۸۵/۱/۱
تعداد کبیسه ی ۲۰۰۶ تا ۲۰۱۷ سه است و برای شمسی تعدا د روز را یک فروردین میگیریم در ۸۵/۱/۱
4,308−(11×365)−3+1=291
میلادی ۲۰۰۶
تعدادکبیسه ی ۲۰۰۶ تا ۲۰۱۷ سه است و روزهای سپری شده ی سال ۲۰۰۶ هم عدد ۸۰ است
4,308−(11×365)−3+80=370
که یکی به سال اضافه میشود و ماه یک میشود ، روز میلادی هم ۵ خواهدشد
مثال های زیر در ایجاد تقویم شمسی کمک خواهند کرد فقط با محاسبه ی روزهای سپری شده از جمعه ۱/۱/۱
از جمعه ۱/۱/۱ تا دوشنبه ۱۳۹۸/۲/۳۰ میشود ۵۱۰۳۰۳
510303 mod 7 = 3
اگر مانده ی تقسیم صفرشد یعنی جمعه هست ... ۳ یعنی دوشنبه
۱۳۷۸/۱۰/۱۱ : ۵۰۳۲۲۴
معادل شنبه یک ژانویه ی ۲۰۰۰
503224 mod 7 = 1
یک یعنی شنبه
۱۳۷۹/۱۰/۱۲ : ۵۰۳۵۹۰
معادل دوشنبه ۱ ژانویه ۲۰۰۱
۵۰۳۵۹۰ mod ۷ = ۳
۳ یعنی دوشنبه
۱۳۵۷/۶/۲۰ : ۴۹۵۴۴۲
معادل دوشنبه ۱۱ سپتامبر ۱۹۷۸
۴۹۵۴۴۲ mod ۷ = ۳
۳ یعنی دوشنبه
۱۲۹۸/۱۰/۱۰ : ۴۷۴۰۰۴
معادل پنج شنبه ۱ ژانویه ۱۹۲۰
۴۷۴۰۰۴ mod ۷ = ۶
۶ یعنی پنج شنبه
۱۳۹۸/۱/۱ : ۵۱۰۲۴۳
معادل پنج شنبه ۲۱ مارس ۲۰۱۹
۵۱۰۲۴۳ mod ۷ = ۶
۶ یعنی پنج شنبه
لینک محاسبه گر روز و اختلافhttps://www.bahesab.ir/time/age/
لینک مانده ی تقسیمhttps://www.omnicalculator.com/math/modulo