PDA

View Full Version : مقاله: بدست آوردن روزهای مابین دو تاریخ شمسی ( تفاضل روزهای مابین دو تاریخ شمسی )



ROSTAM2
جمعه 29 اردیبهشت 1391, 21:27 عصر
اینم واسه کسانی که می خوان روزهای مابین دو تا تاریخ شمسی رو محاسبه کنند ، برای یه پروژه نیاز شد که این تابع رو (بهمراه یه تابع کمکی) بنویسم بد ندیدم اینجا بزارمشون تا دیگران هم استفاده کنند البته سالهای کبیسه رو محاسبه نمی کنه و روز پایانی سال از ماه دوازدهم رو کم نمی کنه :لبخندساده:



Function GetDiffDays(ByVal FirstDate As String, ByVal SecondDate As String) As Integer
Dim FirstDay, FirstMonth, FirstYear, SecondDay, SecondMonth, SecondYear As String
' FirstDate = "1391/02/05" : SecondDate = "1391/03/02"
Dim FD, FM, FY, SD, SM, SY, ExpDays As Integer
' Split First Date As FirstDay, FirstMonth and FirstYear As String
FirstDay = Split(FirstDate, "/")(2)
FirstMonth = Split(FirstDate, "/")(1)
FirstYear = Split(FirstDate, "/")(0)
' Integer of Day of First Date
FD = CInt(If(Left(FirstDay, 1) = "0", Right(FirstDay, 1), FirstDay))
' Integer of Month of First Date
FM = CInt(If(Left(FirstMonth, 1) = "0", Right(FirstMonth, 1), FirstMonth))
' Integer of Year of First Date
FY = CInt(FirstYear)
' Split Second Date As SecondDay, SecondMonth and SecondYear As String
SecondDay = Split(SecondDate, "/")(2)
SecondMonth = Split(SecondDate, "/")(1)
SecondYear = Split(SecondDate, "/")(0)
' Integer of Day of Second Date
SD = CInt(If(Left(SecondDay, 1) = "0", Right(SecondDay, 1), SecondDay))
' Integer of Month of Second Date
SM = CInt(If(Left(SecondMonth, 1) = "0", Right(SecondMonth, 1), SecondMonth))
' Integer of Year of Second Date
SY = CInt(SecondYear)
ExpDays = If(SY < FY, 0, (SY - FY) * 365)
ExpDays += If(SM > FM, MonthDays(SM) - MonthDays(FM), 0)
' ExpDays -= If(SM < FM, MonthDays(FM - SM), 0)'
ExpDays += If(SD > FD, SD - FD, 0)
' ExpDays -= If(SD < FD, FD - SD, 0)'
Return ExpDays
End Function

Function MonthDays(ByVal MonthInt As Integer) As Integer
Dim DiffDays As Integer = 0
DiffDays = If(MonthInt <= 7, MonthInt * 30, ((MonthInt - 7) * 31) + 210)
Return DiffDays
End Function


تابع MonthDays اشتباها 6 ماه اول رو 30 روزه حساب می کرد با این جایگزین می شه:

Function MonthDays(ByVal MonthInt As Integer) As Integer
Dim DiffDays As Integer = 0
DiffDays = If(MonthInt <= 7, ((MonthInt - 7) * 31) + 210, MonthInt * 30)
Return DiffDays
End Function

aknj56
جمعه 29 اردیبهشت 1391, 23:39 عصر
با تشکر از شما دوست عزیز
اما نیاز به این همه کد نیست فقط با یک خط کد میشه بدست آورد چه اختلاف ماه رو چه سال رو و چه روز رو
امیدوارم که موفق باشی

ROSTAM2
جمعه 29 اردیبهشت 1391, 23:51 عصر
با تشکر از شما دوست عزیز
اما نیاز به این همه کد نیست فقط با یک خط کد میشه بدست آورد چه اختلاف ماه رو چه سال رو و چه روز رو
امیدوارم که موفق باشی

دقت نکردی چی شد فاصله مابین دو تاریخ برحسب روز رو محاسبه می کنه یعنی سال و ماه و روز رو با هم به روز تبدیل می کنه...
راستی شما اصلا این دستور و امتحان کردید؟

فرید نجفلو
جمعه 29 اردیبهشت 1391, 23:53 عصر
سلام دوست عزیز
اولا از زحمتی که کشیدی ممنون و بسار جای تقدیر داره
ولی کد تون و اشکال عمده داره :
شما سال های کبیسه رو حساب نکردید!
سال ها اگه پس و پیش بشن یکیشون صفر بر می گردونه (به جای منفی)
و اینکه کدتون رو خیلی پیچیده کردید و می تونستید با استفاده از امکانات دات نت هم کد رو کم کنید و هم چند منظوره کنید (الان فقط تفاوت دو تاریخ حساب می شه)

فرید نجفلو
جمعه 29 اردیبهشت 1391, 23:56 عصر
با اجازه تون من توابعی می دم که علاوه بر تفاوت دو تاریخ کارای دیگه ای هم می تونید بکنید:

Private Function PersianDateDiff(Date1 As String, Date2 As String, Optional Interval As DateInterval = DateInterval.Day) As Integer
Dim d1 = CDate(GregorianDate(Date1))
Dim d2 = CDate(GregorianDate(Date2))
Return DateDiff(Interval , d1, d2)
End Function
Private Function PersianDate(Optional InDate As Date = Nothing) As String
Try
If InDate.Year <= 1 Then InDate = Now
Dim PClndr As New Globalization.PersianCalendar
Dim DateInIran As String = PClndr.GetYear(InDate)
DateInIran &= "/" & Strings.Right(("0" & PClndr.GetMonth(InDate)), 2)
DateInIran &= "/" & Strings.Right(("0" & PClndr.GetDayOfMonth(InDate)), 2)
Return DateInIran
Catch ex As Exception
Return ""
End Try
End Function
Private Function GregorianDate(InDate As String) As String
If InDate.Length <> 10 Then Return ""
Dim Year As Integer = Mid(InDate, 1, 4)
If Year < 1300 OrElse Mid(InDate, 1, 4) > 1500 Then Return ""
Dim Month As Integer = Mid(InDate, 6, 2)
If Not IsNumeric(Month) OrElse Month > 12 OrElse Month < 1 Then Return ""
Dim Day As Integer = Mid(InDate, 9, 2)
If Day < 1 OrElse Day > 31 Then Return ""
Try
Dim PClndr As New Globalization.PersianCalendar
Return PClndr.ToDateTime(Year, Month, Day, 0, 0, 0, 0).ToString
Catch ex As Exception
Return ""
End Try
End Function

فرید نجفلو
جمعه 29 اردیبهشت 1391, 23:58 عصر
این واسه اینکه بتونید نتایج رو با هم مقایسه کنید:
کد های من و خودتون رو باه یه جا (داخل فرم) کپی کنید (یه لیت باکس هم به فرم اضافه کنید)

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Dim strYear As Integer = 1390
Dim strDM = "/01/01"
For i = 0 To 10
Dim d1 = (strYear + i) & strDM
Dim d2 = strYear & strDM
Me.ListBox1.Items.Add(String.Format("You: {0} - {1} = {2}", d1, d2, GetDiffDays(d1, d2)))
Me.ListBox1.Items.Add(String.Format("You: {0} - {1} = {2}", d2, d1, GetDiffDays(d2, d1)))
Me.ListBox1.Items.Add("")
Me.ListBox1.Items.Add(String.Format("Me: {0} - {1} = {2}", d1, d2, PersianDateDiff(d1, d2)))
Me.ListBox1.Items.Add(String.Format("Me: {0} - {1} = {2}", d2, d1, PersianDateDiff(d2, d1)))
Me.ListBox1.Items.Add("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -")
Next
End Sub

فرید نجفلو
شنبه 30 اردیبهشت 1391, 00:01 صبح
با تشکر از شما دوست عزیز
اما نیاز به این همه کد نیست فقط با یک خط کد میشه بدست آورد چه اختلاف ماه رو چه سال رو و چه روز رو
امیدوارم که موفق باشی

دوست عزیز می تونید اون یه خط کد رو برامون بنویسید!

ROSTAM2
شنبه 30 اردیبهشت 1391, 00:40 صبح
خسته نباشید فرید خان ، دستتون درد نکنه منم مشکلم همین بود که نمی دونستم سالهای کبیسه رو چطور حساب کنم


سال ها اگه پس و پیش بشن یکیشون صفر بر می گردونه (به جای منفی)
خواستم که صفر پس بده، به فاصله زمانی دقیق اونا برای محاسبه اولویت بندی نیاز بود

عالی بود، ممنون از شما

aknj56
شنبه 30 اردیبهشت 1391, 11:16 صبح
(TextBox3.Text = DateDiff("d", TextBox1.Text, TextBox2.Text
این کد رو داخل یک button بگذارید و 3 تکس باکس بذارید توی فرم
برای محاسبه اختلاف بین روز از d و برای محاسبه ماه از m و برای محاسبه سال y استفاده میکنیم ضما تکس باکس اول تاریخ شروع محاسبه و تکس باکس دوم تاریخی که میخاهیم اختلاف با آن را حساب کنیم است
ضمنا تاریخ ور هم طوری تنظیم کنید که به شکل 1391/1/1 باشد
امتحان کنید و نظر بدهید

ROSTAM2
شنبه 30 اردیبهشت 1391, 11:58 صبح
(TextBox3.Text = DateDiff("d", TextBox1.Text, TextBox2.Text

این دستور تاریخ میلادی رو پشتیبانی می کنه دوست عزیز فکر کنم توی تاپیک های گذشته این موضوع مطرح شده بود
واسه همینم وقت گذاشتیم و برای تاریخ شمسی کد نوشتیم

فرید نجفلو
شنبه 30 اردیبهشت 1391, 13:33 عصر
(TextBox3.Text = DateDiff("d", TextBox1.Text, TextBox2.Text
این کد رو داخل یک button بگذارید و 3 تکس باکس بذارید توی فرم
برای محاسبه اختلاف بین روز از d و برای محاسبه ماه از m و برای محاسبه سال y استفاده میکنیم ضما تکس باکس اول تاریخ شروع محاسبه و تکس باکس دوم تاریخی که میخاهیم اختلاف با آن را حساب کنیم است
ضمنا تاریخ ور هم طوری تنظیم کنید که به شکل 1391/1/1 باشد
امتحان کنید و نظر بدهید

دوست عزیز امتحان نمی خواد شما به این تاپیک (از پست 5 به بعد) (http://barnamenevis.org/showthread.php?340673-كم-كردن-2-تاريخ-شمسي-موجود-در-Textbox-از-يكديگر&p=1502880&viewfull=1#post1502880) برید جوابتون رو دادم

aknj56
شنبه 30 اردیبهشت 1391, 13:41 عصر
با سلام دوست عزیز
شما اول اونو امتحان بکن
برای تاریخ شمسی هم کار میکنه

فرید نجفلو
شنبه 30 اردیبهشت 1391, 14:15 عصر
با سلام دوست عزیز
شما اول اونو امتحان بکن
برای تاریخ شمسی هم کار میکنه

شما هم اول به اون جایی که گفتم سربزن می فهمی که من امتحان کردم یا نه!!!

aknj56
یک شنبه 31 اردیبهشت 1391, 07:47 صبح
سلام دوست عزیز این نمونه برنامه رو دانلود کن ببین اختلاف ماه روز وسال ر و در میاره یا نه؟
نظر بده
http://p30upload.com/download.php?filename=1337484283_WindowsApplicatio n1.rar

فرید نجفلو
یک شنبه 31 اردیبهشت 1391, 15:10 عصر
سلام
دوست عزیز اولا باید از تلاش و نیت خیر شما تشکر کنم
و لطف می کنید این تاریخ ها رو با کد خودتون تست کنید

1390/12/1 با 1/1/1391

و

1390/11/12 با 1/12/1390

اگه تست کردید بگید!

ROSTAM2
یک شنبه 31 اردیبهشت 1391, 16:46 عصر
سلام
دوست عزیز اولا باید از تلاش و نیت خیر شما تشکر کنم
و لطف می کنید این تاریخ ها رو با کد خودتون تست کنید

1390/12/1 با 1/1/1391

و

1390/11/12 با 1/12/1390

اگه تست کردید بگید!

1391/2/2 .. 1391/3/2 .. 28

1391/4/2 .. 1391/5/2 .. 30

1391/7/2 .. 1391/8/2 .. 31

1391/8/2 .. 1391/9/2 .. 31


1391/10/2 .. 1391/11/2 .. 31

این چندتا تاریخ رو تست کنی می بینی که بصورت میلادی محاسبه می شن یعنی ماههای 28 روزه 30 و 31 روزه تر تیب خاصی ندارن ولی تو تاریخ شمسی 6 ماه اول 31 روزه و 6 ماه دوم 30 روزه است که ماه دوازدهم 29 روزه هم میشه

sehm67
پنج شنبه 30 آذر 1391, 00:14 صبح
سلام

یه نگاهی به برنامه زیر بندازید

امکاناتی از قبیل :

اختلاف بین تاریخ

تاریخ شمسی ، میلادی

تبدیل تاریخ ها

جمع تاریخ

تاریخ امروز ، دیروز ، فردا ، یک هفته بعد و ...

تعیین کبیسه بودن

و ...

فرید نجفلو
پنج شنبه 30 آذر 1391, 17:47 عصر
سلام

یه نگاهی به برنامه زیر بندازید
امکاناتی از قبیل :
اختلاف بین تاریخ
تاریخ شمسی ، میلادی
تبدیل تاریخ ها
جمع تاریخ
تاریخ امروز ، دیروز ، فردا ، یک هفته بعد و ...
تعیین کبیسه بودن
و ...
دوست عزیز کمپوننت برای این نوع کارا زیاده یه سرچ کوچیک تو همین سایت هم بزنید می بینید
اگه کد PersianToolS.dll رو داریئ بذارید اگر هم که نه پس این پروژه شما بار علمی زیادی برای ما نخواهد داشت!

mehrbani
پنج شنبه 30 آذر 1391, 18:07 عصر
با استفاده از PersianCalendar خود NET Framework. ابتدا تاریخ ها رو به میلادی تبدیل کنید و سپس با استفاده از متد DateTime.Subtract اختلاف دو تاریخ را به سال ، ماه ، هفته ، روز ، ساعت ، دقیق ، ثانیه به دست بیارین.نیازی به این همه مشقت نیست دوستان

فرید نجفلو
پنج شنبه 30 آذر 1391, 22:15 عصر
با استفاده از PersianCalendar خود NET Framework. ابتدا تاریخ ها رو به میلادی تبدیل کنید و سپس با استفاده از متد DateTime.Subtract اختلاف دو تاریخ را به سال ، ماه ، هفته ، روز ، ساعت ، دقیق ، ثانیه به دست بیارین.نیازی به این همه مشقت نیست دوستان

پست پنجم همین تاپیک رو با دقت بیشتری بخونید (تابع اول همین کار رو می کنه!)

sheibanizaveh
چهارشنبه 04 بهمن 1391, 16:58 عصر
با سللام و ممنون بابت زحماتتون یه سوال اگه ما تعداد روز های بین دو تاریخ رو بخواهیم پس تابع PersianDate چه نقشی در برنامه شما داره .

فرید نجفلو
چهارشنبه 04 بهمن 1391, 20:10 عصر
سلام

فکر کنم هنوز تعداد از دوستان هنوز متوجه قضیه نشدن!
مثال خیلی جالب این مورده که میلادی یه ماه 28 روزه داره! (همین ماه بعدی یعنی فبریه 2013 رو ببینید)
حالا به نظر شما از اول ان ماه به اندازه دو ماه بریم جلو تعداد روز ها درست در میاد (چون محاسبه سیستم میلادی این ماه رو معادل 28 روز حساب می کنه و جمع میزنه

یا مورد دیگه اینکه ترتیب ماه های 30 رزوه و 31 روزه ما و اونا فرق می کنه
همین الان موس رو ببرید رو ساعت سیستم و خودتون ببینید!