امام جمعه قم ( حسینی همدانی ) با اشاره به اقامه نماز رییس جمهوری اسلامی ایران در کاخ کرملین گفت: احتمال این وجود دارد که رییس جمهور ما در کاخ سفید هم نماز بخواند زیرا این نمازی که در کاخ کرملین خوانده شد پیام های مهمی در پی داشت.
بررسی روش های تبدیل میلادی به شمسی و معایب آن بصورت کاملا تخصصی
بررسی اختلافِ روزها از سال 1300 تا تاریخ شمسی بزرگتر از این تاریخ
بررسی روزِ هفته یِ تاریخ شمسی مورد نظر و مروری بر تابع پربرکت WeekDay در اکسس
بررسی تابع بابرکت Choose در اکسس
بررسی سن فرد
با ما باشید حتی اگر Vba نمی دانید مباحث در انتها شیرین خواهد شد
دوستان گرامی لطفا پس از مطالعه در نظرسنجی شرکت کرده و در صورت لزوم زیر مطلب نظر دهید با تشکر
dDate : "2021/01/04" .... 1400/10/14
گرفتن سال ، ماه و روز بصورت جداگانه با توابعی که اکسس در اختیار ما قرار داده
YY=Year(dDate)=2021
MM=Month(dDate)=1
DD=Day(dDate)=4
Every year that is exactly divisible by four is a leap year, except for years that are exactly divisible by 100, but these centurial years are leap years if they are exactly divisible by 400. For example, the years 1700, 1800, and 1900 are not leap years, but the years 1600 and 2000 are
هر سالی که دقیقا بر 4 بخش پذیر باشد ، سال کبیسه است ( Leap Year ) ، جز سال هایی که بر یک قرن که 100 سال است بخش پذیر باشد . اینها در صورتی کبیسه هستند که دقیقا بر 400 بخش پذیر باشند. مثلا سال های 1700 ، 1800 و 1900 کبیسه نیستند ولی 1600 و 2000 کبیسه هستند.
پس سال 2022 کبیسه نیست و ماه فوریه 28 روز است .
تابع زیر تاریخ میلادی را داخل دابل کوتیشن می گیرد و مقدار Boolean را بر می گرداند.اگر کبیسه نباشد مقدار برگشتی False است.
IsLeapYear(dDate As Date) As Boolean
Dim GetYear As Long
GetYear=Year(dDate)
IsLeapYear=?
'select iif(612 mod 100=0,iif(612 mod '400=0,True,False),iif(612 mod 4=0,True,False))
?IsLeapYear("2021/01/04"
False
Leap years within your range:1600~2004
1600, 1604, 1608, 1612, 1616, 1620, 1624, 1628, 1632, 1636, 1640, 1644, 1648, 1652, 1656, 1660, 1664, 1668, 1672, 1676, 1680, 1684, 1688, 1692, 1696, 1704, 1708, 1712, 1716, 1720, 1724, 1728, 1732, 1736, 1740, 1744, 1748, 1752, 1756, 1760, 1764, 1768, 1772, 1776, 1780, 1784, 1788, 1792, 1796, 1804, 1808, 1812, 1816, 1820, 1824, 1828, 1832, 1836, 1840, 1844, 1848, 1852, 1856, 1860, 1864, 1868, 1872, 1876, 1880, 1884, 1888, 1892, 1896, 1904, 1908, 1912, 1916, 1920, 1924, 1928, 1932, 1936, 1940, 1944, 1948, 1952, 1956, 1960, 1964, 1968, 1972, 1976, 1980, 1984, 1988, 1992, 1996, 2000, 2004
سرآغاز گاهشماری ایران روز جمعه «۱ فروردین سال ۱ هجری خورشیدی» (۲۹ شعبان ۱ سال پیش از هجرت)[۷] برابر با ۱۹ مارس ۶۲۲ میلادی قدیم (یولیانی) و ۲۲ مارس ۶۲۲ میلادی جدید (گرگوری) است؛ یعنی، ۱۱۹ روز پیش از مبدأ گاهشماری هجری قمری و ۱۷۹ روز پیش از هجرت.[۸]
کبیسه گیری گاه شمار رسمی ایران :
تقویم رسمی کنونی ایران معمولاً هر چهار سال یکبار کبیسه میشود و برای جبران کسر سال حقیقی، در آغاز هر دورهٔ ۲۹، ۳۳ یا ۳۷ساله، یک کبیسه پنج ساله وجود دارد. در یک فراز پنج هزارساله، ما به ازای هر دورهٔ ۳۷ساله، نزدیک به پنج دورهٔ ۲۹ساله و تقریباً ۲۰ دورهٔ ۳۳ساله وجود دارد. ترتیب و توالی کبیسهها قاعدهمند نیست. چنانچه لحظه تحویل سال خورشیدی بعد از ظهر ۳۶۶اُمین روز از سال باشد، آن سال کبیسه و روز بعد نوروز است.[۱۴]
برای تشخیص سالهای کبیسه در گاهشماری رسمی ایران شیوه کاملاً یکنواختی وجود ندارد. برای سالهای ۱۲۴۴ تا ۱۳۴۲ چنانچه باقیماندهٔ حاصل تقسیم سال مورد نظر بر عدد ۳۳، یکی از اعداد (۱، ۵، ۹، ۱۳، ۱۷، ۲۱، ۲۶ و ۳۰) باشد آن سال کبیسه خواهد بود.[۷] و برای سالهای اخیر (سالهای ۱۳۴۳ تا ۱۴۷۲)، بهجای ۲۱، باقیماندهٔ ۲۲ ملاک خواهد بود
مانده سال شمسی مورد نظر تقسیم بر 128 اگر یکی از اعداد بالا بود آن سال کبیسه است و برای سال های 1 تا 473 گفته اعداد داخل کمان مد نظر است.
البته گفته شده چون در چند دوره 33 ساله قرار گرفته ایم مانده عدد تقسیم بر عدد 33 اگر اعدادی در بازه 1 ، 5 ، 9 ، 13 ، 17 ، 21 ، 26 ، 30 بود آن سال کبیسه است البته اگر عدد 22 شد کبیسه ۵ ساله می شود.
سال 1300، 1304 ، 1309 کبیسه هستند.
128 : 1,309−1,280=29
1,375−1,280=95
33 : 1,309−33×39=22 کبیسه پنج ساله
33 : 1,375−41×33=22 کبیسه پنج ساله
سالهای 1399 و 1403 کبیسه 4 ساله و سال 1408 کبیسه پنج ساله هستند چون مانده تقسیم 1408 بر 33 عدد 22 است.
1,408−42×33=22
1,408−11×128=0 طبق جدول
یک راه قرار دادی دیگر که رایانه ای است و سریع قابل محاسبه است نیز داده شده
(۱۳۹۱+۲۳۴۶)×(۰/۲۴۲۱۹۸۵۸۱۵۶) =۹۰۵/۰۹۶۰۹۹۲۹۱
اگر عدد اعشار که درمثال بالا 0.096099291 از عدد 0.24219858156 کمتر بود آن سال کبیسه است یا
27,399÷365.24=75
1300+75=1375 ' سال شمسی
27399-75×365.24=6 '6+1 =7 روز شمسی
عدد 6 را با عدد یک جمع می کنیم میشود روز هفتم
26,126−365.24×71=193.96 'int(193.96)
193+1-6×31=8 ' روز شمسی
6+1=7 ' ماه شمسی
1921/03/21=?
'select 'datediff("d","1921/03/21","1921/03/21")
0
0\365.24=0
برای این موارد که صفر است هم باید در نظر گرفته شود که عدد بدست آمده باضافه یک شود و در لوپ جمع روزهای سال شمسی قرار بگیرد و ماه مورد نظر و روز را بدست آورد
Function ShamsiDate(dDate As Date)
Dim Miladi As Date, Shamsi
Dim DaysDiff As Long
Miladi = "1921/03/21"
Shamsi = "1300/01/01"
DaysDiff = DateDiff("d", Miladi, dDate)
debug.Print DaysDiff
?shamsiDate("2016/10/31")
34923
جمع بندی برای محاسبه از طریق 365.24
34,923÷365.2421985815 =95.618
(34923+1)-95×365.2421985815=225.99
226 1395/08/10
22,036÷365.2421985815 =60 .33
(22036+1)-365.2421985815×60 =122.46
122 1360/04/29
27,393÷365.2421985815=74.99
(27,393+1)−365.2421985815×74=366.07
366 1375/01/01
33,602÷365.2421985815=91.99
(33,602+1)−365.2421985815×91=365.95
365 1391/12/30
20,993÷365.2421985815÷57.47
(20,993+1)−365.2421985815×57 =175. 19
175 1357/06/20
26,126÷365.2421985815=71.53
(26,126+1)-365.2421985815×71=194.80
194 1371/07/08
روش بالا هم بی اشکال نیست چون یک روز اختلاف در آن اجتناب ناپذیر است اگر روش شما تست نشود مثل تصویر زیر خواهد شد که اختلاف یکروز را منجر خواهد شد:
روش دیگر این است که تعداد کبیسه های دو تاریخ میلای بدست آید یکی از آن کم شود بعد در 366 ضرب شده و از اختلاف روزهای دو تاریخ میلادی کم شوند و سپس بر 365 تقسیم شده .....
1921/03/21 'مبنای ما 1300/01/01
1996/03/20 ' تاریخی که باید تبدیل شود
DateDiff=27393
NumberOfLeapYearsInRange(1921,1996)=19
19-1=18
(27393-18×366)÷365=57
57-1=56
(27393-18×366)-56×365=365
365+1=366 'چون 1300 کبیسه بود
1300+18+56=1374
1374 ' کبیسه نیست و 365 روز دارد
چون عدد 366 بدست آمد به 1374 می افزائیم در نتیجه چون سال 74 کبیسه نیست پس 365 روز و معادل یکسال است در نتیجه سال 75 میشود و یک روز اینجا باقی میماند که میشود روز یکم فروردین
1375/01/01
2013/03/20
NumberOfLeapYearsInRange(1921,2013)=23
DateDiff=33602
23-1=22
(33602-22×366)÷365=70
70-1=69
(33602-22×366)-365×69=365
365+1=366
1300+22+69=1391 ' کبیسه است
چون 1391 کبیسه است لذا 366 روزه است و در نتیجه سال همان 1391 باقی می ماند و ماه سال میشود 12 و روز نیز میشود 30 اُم ...... پس تاریخ میلادی 2013/03/20 معادل 1391/12/30 شد.
2000/03/20 =????? 137901/01
1921/03/21~2000/03/20
DaysDiff=28854
NumberOfLeapYersInRange(1921,2000)=18
18-1=17
(28854-17×366)÷365=62.005
62-1=61
(28854-17×366)-365×61=367
1300+17+61=1378
خب باروش بالا هم به بن بست خوردیم
پس دقیق ترین روش استفاده از Counter است که تعداد اختلاف روزها را به 1300/01/01 اضافه کنیم و اینکار اگر بخواهد یک روز یک روز به این تاریخ اضافه کند یک مقدار زمانبر است ولی خب بسیار دقیق است البته کبیسه گیری شمسی نیز در این امر بسیار مهم است !!!
در مثال زیر تعداد کبیسه های شمسی از 1300 تا 1391 23 تاست که کبیسه اول ( چون اختلاف اول فروردین تا 30 اسفند 1300 ، 365 روز است ) و آخر ( سال 91 ) از آن کم شده که تا تقریبا یکسال قبلش بدست آید 91=70+21 ، سال 1391 و کبیسه است پس 366 روز میشود همان 12/30
71-1=70
(33,602−21×366)−70×365=366
(6,574−3×366)÷365=15
15-1=14
(6,574−3×366)-14×365=366
1300+3+14=1317 ' کبیسه است
1317/12/30
(6,575−3×366)−14×365=367
1300+3+14=1317 ' کبیسه است
366 '1317/12/30
1 '1318/01/01
نوشتن لوپ برای کم کردن 365 یا 366 روز از اختلاف روزهای میلادی
'1978/09/11=1357/06/20
ii=0
DaysDiff=DateDiff("d","1921/03/21","1978/09/11")
Diff=DaysDiff
Do
x=Diff-iif(IsLeapYears1(1300+i)=True,366,365)
Y=Year(dDate)+1 ' تابع Year("1978/09/11")=1978
YY=1300+i
ii=ii+1
Loop Until Y=Year(dDate)-1
Debug.Print x
Debug.Print YY
???? Maybe Use But Not Reliable
(6,575−4×366)−13×365=366 '1300+4+13=1317/12/30
از 1921 تا 2013 =92
Right Way '2013/03/20
(33,602+1−22×366)−69×365=366 '1300+22×69=1391/12/30
' Loop : To Get jalali leap years from 1300
t=1300+(2013-1)-(1921+1) '1390
For i = 1300 To t '1390
x = x + IIf(IsShamsiLeapYears1(i) = True, 1, 0)
DoEvents
Num=x
If IsShamsiLeapYears1((1390)) = True Then Num = x - 1
Next
Debug.Print Num
?ShamsiDate()
22
e = Int((DaysDiff+1 - Num * 366) / 365) - 1
Y=1300+e+Num '1300+22+69
Debug.Print "Contant :" & e
diff = (DaysDiff+1 - Num * 366) - e * 365
Debug.Print "Diff :" & diff
از یک لوپ بعنوان کانتر می شود استفاده کرد که بین 1 تا عدد 366 یا بیشتر که بدست آمد یک Counter یا شمارنده ایجاد بنماید ( حالت افزایشی تکی ) .Increment مثل عبارت Counter استفاده شده در AutoNumber .
'Counter
Function ShamsiDateCounter(yy, diff)
Dim Y As Single
Dim MM, DD, i, a As Integer
For i = 1 To diff
DD = DD + 1
If DD > IIf(MM=12 And IsShamsiLeapYears1(yy) = True, 30, GetShamsiDays(MM)) Then MM = MM + 1: DD = 1
If MM > 12 Then yy = yy + 1: MM = 1
'CurrentDb.Execute ("delete from table2")
'CurrentDb.Execute ("insert into table2 (mah,rooz) values (" & MM & "," & DD & ")")
Next
Debug.Print yy & "..." & MM & "..." & DD
End Function
?ShamsiDateCounter(1378,36)
1378...2...6
از کانتر بالا نیز می توان برای چند ماه و چند روز از سال گذشته استفاده کرد . تاریخ شمسی طبق روز میلادی جاری بدست آمده و فقط یک پارامتر Optional به آن اضافه کنید ، اگر مقدارآن True بود تاریخ شمسی را بگیرد و سپس لوپ را تا آن ماه مشخص ادامه دهد.
برای وارد کردن صحیح ماه و روز در تکست باکس در زمان Data Entry یا زمان داده گیری ، می توان در رویداد OnExit خود تکست باکس نوشت در صورتیکه Dirty=True شد چک کند که ماه بین یک تا 12 باشد و روز هم طبق ماهی که وارد شده و کبیسه بودنش اگر نبود Undo کند و در BeforeUpdate فرم هم می توان نوشت که تکست باکس اگر خالی باشد Cance=True شود.
پس راه من درآوردی ما بدین شکل شد :
1-مبنای محاسبه را تاریخ 1921/03/21 معادل 1300/01/01 قرار دادیم.
2-بدست آوردن کبیسه های شمسی بین دو بازه تاریخ میلادی البته یک واحد از سال میلادی مورد نظر کم می کنیم و به مبنا اضافه ، فرضا سال میلادی تبدیلی 2013 است
2012-1922=90 ' 1300+90=1390
تعداد سال های کبیسه از 1300 تا 1390 طبق لیست کبیسه ها که در بالاتر ذکر شده 22 است.اگرسال آخر کبیسه بود یک واحد از تعداد کبیسه ها کم می کنیم.
3-اختلاف روزهای دوبازه تاریخی یعنی مبنا و تاریخ تبدیلی را با تابع بسیار پربرکت DateDiff بدست می آوریم و یک واحد بخاطر جبران سال 1300 مبنا که کبیسه است و اختلاف اول فروردین آن تا 30 اسفند آن 365 روز است ، اضافه می نمائیم . از سایت w3Schools نیز می توانید استفاده کنید اگر سیستم ندارید مثال :
DaysDiff=DateDiff("d","1921/03/21","2013/03/20")
پس طبق تصویر اختلاف روزهای دو تاریخ میلادی شد 33602 روز. و با یک جمع می کنید 33603
4-تعدادکبیسه در 366 را از روزهای بدست آمده کم می کنیم و بر 365 تقسیم می کنیم و عدد صحیح آنرا منهای یک می کنیم :
(33603-22×366)/365=70.0027
Int((33603-22×366)/365)=70
70-1=69
5- 69 را با تعداد کبیسه ها جمع می کنیم میشود 91
6- حاصل عدد 69 در 365 را از حاصل تفریق تعداد کبیسه در 366 و تعداد روزها + یک میشود مانده ی ما یا Diff
(33,603−22×366)−69×365=366
7-عدد حاصله را در یک تابع Counter گذاشتیم تا بگوید 366 روز بعد از سال 91 چه تاریخی خواهد شد .
چون 91 کبیسه است 366 اُمین روزش میشود 12/30 در نتیجه خروجی ما 1391/12/30 خواهد بود.
میشود از کانتر استفاده کرد و عدد 33602 باضافه یک را یکی یکی اضافه کرد تا بعد از 1300 را نشان دهد ولی خب کُندِس و حدود 5 ثانیه طول میکشد تا جواب بدهد.
مثال دیگر : 2022/01/08 ( مبنا 1921/03/21 )
DaysDiff=36818
2022-1-1922=99+1300=1399
Leaps Between 1300 ~ 1399=25
چون 1399 کبیسه است پس یک واحد از تعداد کبیسه کم کنیم.
int((36,818+1−24×366)÷365)=76.80
76-1=75
(36,818+1−24×366)-75×365=660
Y=1300+24+75=1399,Diff=660
چون 1399 کبیسه است 366 از 660 کم میشود و 294 می ماند 294 اُمین روز سال هم میشود 10/18 یا 294=18+30×3+31×6 .... کانتر محاسبه بعد از 1399 را انجام خواهد داد.
1921/03/21-1939/03/20:6573
1921/03/21-1939/03/21:6574
1921/03/21-1939/03/22:6575
اول اضافه کردن یک واحد به سال مبنا که 1921 است و کسر کردن یک واحد از سال تبدیلی که 1939 است
1300+(1,939−1)−(1,921+1)=1316
مورد اول تعداد کبیسه ها از 1300 تا 1316 ، عدد 4 است و خوشبختانه 1316 کبیسه نیست اگر بود از 4 یک واحد کسر می شد.
(6573+1-4×366)/365=14
14-1=13
(6,573+1−4×366)−13×365=365
1300+4+13=1317
سال 1317 کبیسه و 366 روزه است پس 365 اُمین روز آن 12/29 می شود 1317/12/29.
'6575
Diff=(6,575+1−4×366)−13×365=367
1300+4+13=1317 , 367
چون 1317 کبیسه است پس 366 از 367 کم شده و یکسال به سال اضافه میشود ( تابع کانتر را ملاحظه بفرمائید ) سال میشود 1318 و روز و ماه هم یک می شود.
1318/01/01
همانطور که شرح داده شد روش آخر اگر چه حدود دو ثانیه طول می کشد ولی Reliable است البته برای زیر 365 یا 366 نیز چاره ای بیاندیشید.
در مورد زیر :
1921/03/21~1922/03/22=366
1301/01/01
1300+1921+1-(1922-1)=1301
در 1300 تا 1301 یک کبیسه وجود دارد
(366+1-1×366)÷365=0.002
0
if 0 Then
Diff=DaysDiff+1 : Y=1300
End if
Counter (1300,367)
چون 1300 کبیسه است لذا 366 روزه است بعد از ارسال به کانتر باید جواب 1301/01/01 استخراج شود.
1921/03/21~1922/03/21=365
1300+(1921+1)-(1922-1)=1301
1 Leap Years ( jalali )
(365+1-1×366)=0
if 0 Then
Diff=365+1 : Y=1300
Counter(1300,365)
1300/12/30
1921/03/21~1922/06/13
DaysDiff(Use DateDiff)=449
1300+(1921+1)-(1922-1)=1301
(449+1-1×366)÷365=0
if 0 Then
Diff=449+1 : Y=1300
Counter(1300,450)
روش دیگری هم می توانید خلق کنید.
اگر روش های بالاتر را بکار ببرید اختلاف یکروز کاملا مشهود خواهد بود مثل تصویر زیر
92×365+22+1=33603
2013/03/20=1391/12/30
'jalali leap year 1300-1390=22-1=21
91×365+21+366=33602
چون تا 12/30 میشود 366 روز لذا اضافه شده
select datediff("d","1921/03/21","2022/01/09")
Equivalant :1400/10/19 - 2022/01/09
=36819
'jalali leap year 1300~1399=25-1=24
1400-1300=100
100×365+24=36524
36819-36524=295
295=6×31+3×30+19
100×365+24+6×31+3×30+19=36819
91×365+21+6×31+3×30+12=33524
33,524+(31+28+21)−91×365−22=367
سال 2012 کبیسه است و 366 روزه در نتیجه چون عدد 367 بدست آمد یک واحد به سال 2012 اضافه و روز و ماه نیز یک میشود
2013/01/01
20,993−365−56×365−14=174
174+80=254
1,920×365+(31+28+21)+480:1920÷4=701360
1300/01/01
1299×365+1+324:1299÷4=474460
701,360−474,460=226900
علت بازداشت وی هنوز مشخص نشده است. با این حال مرادخانی اخیرا در یک برنامه زوم شعری را به فرح پهلوی ملکه سابق ایران تقدیم کرده بود.
این فعال مدنی پیشتر نیز بهدلیل کمک به خانواده قربانیان اعتراضات ضد نظام و برخی اظهارات انتقادآمیز از شرایط کشور چندین بار توسط نهادهای امنیتی فراخوانده و بازداشت شده بود.
قبیله موسو در چین
این قبیله که موسو نام دارد یکی از نادرترین وعجیبترین قبیلهها در جهان است که در آن زن و شوهر با هم زندگی نمیکنند بلکه پیش پدر یا مادر خود میمانند. در قبیلهای بهنام موسو، مادربزرگ خانواده در واقع رهبر خانواده است و نامهای خانوادگی و هویت اجتماعی فرد از طریق مادر و اجداد او معنی مییابد.
چند شوهری
این قبیله در دامنههای هیمالیا وجود دارد و توسط زنان اداره میشود و مردان آن به کلی به حاشیه رانده شدهاند. در واقع نظام کمونیستی نتوانست تنوع فرهنگی این مردم را بر طبق اهداف کمونیستی، یکسان ساز کند. در این قبیله بسیاری از کارهای مهم توسط زنان انجام میشود اما شکار و ماهیگیری را همچنان مردان انجام میدهند.
ازدواج گذری در این جامعه یکی از صورتهای اصلی ازدواج است. به این ترتیب که زن میتواند همسران زیادی داشته باشد. در این قبیله مردها باید در خانه زن باشند. اما تا قبل از غروب آفتاب هر مرد باید به خانه مادرش بازگردد، اگر از این ازدواج فرزندی بهدنیا آمد، بزرگ کردن آن به عهده خانواده مادری است.
امام جمعه رفسنجان عنوان کرد: جمعیت عظیمی از شهدای بسیج داریم که بهدلیل غیرت دینی خود در صحنه به شهادت رسیدند. دشمنان دنبال این هستند که غیرت دینی را در جامعه کمرنگ کنند، اگر به جایگاه رهبری و ولایت فقیه توهین شود، برای کمرنگکردن غیرت دینی است. اگر مسأله بدحجابی یا بیحجابی را در جامعه ترویج میکنند یا یک خانم را از سر بیدینی و نفهمی تشویق میکنند که دوچرخهسواری کند، با اینکه دوچرخهسواری بانوان در انظار عموم حرام است، دنبال خدشهدار کردن غیرت دینی مردم هستند.
وی ادامه داد: اگر افسار سگ را به دست دختر و پسر ما در کوچه و خیابان دادند برای خدشهدارکردن غیرت دینی است و اگر به مسائل مذهبی، نماز و روزه ما حمله کردند دیدند که غیرت دینی جامعه را از بحرانها نجات میدهد که باید خیلی به هوش باشیم و از سر این قضایا بهسادگی نگذریم و بگوییم دختر جوان دوست دارد دورچرخهسواری کند! خیر، باید هوشیار باشیم و نگذاریم چنین کاری در جامعه گسترش پیدا کند.