PDA

View Full Version : سوال: مشكل و خطا در محاسبه بين دو تاريخ (هجري شمسي)



bhasoft
پنج شنبه 15 اردیبهشت 1390, 17:42 عصر
با سلام.
دوستان خسته نباشيد.
راستش در مورد محاسبه بين دو تاريخ مشكلاتي دارم كه ممنون ميشم كمكم كنيد...
خيلي ضروريه.
تو بعضي تاريخ ها كار ميكنه ولي تو بعضي ديگه نه!
مثلا وقتي ميزني 1370/02/31 خطا ميده!
من فايل ضميمه رو اينجا ميزارم تا يه نگاهي بهش بكنين.
من تو اين برنامه سن تقريبي فرد رو محاسبه ميكنم كه از سال جاري كسر ميشه و ميگه فرد چند سالشه!
ممنون ميشم راهنمائي كنين.

bhasoft
جمعه 16 اردیبهشت 1390, 10:40 صبح
دوستان كسي نيست جواب سوال منو بده؟؟
خواهشا فايل ضميمه رو دانلود كنيد و بهم كمك كنيد.
ممنون ميشم....

barbodsoft.com
جمعه 16 اردیبهشت 1390, 14:40 عصر
کد های فرمت رو با کد زیر جایگزین کن.


Imports System.Globalization

Public Class Form1
Public shamsi As New Globalization.PersianCalendar
Private Sub MaskedTextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MaskedT6.TextChanged

If MaskedT6.MaskCompleted = True Then
Dim DateBrith As Date = ShamsiToMiladi(MaskedT6.Text)
Dim Y As Integer = DateDiff(DateInterval.Year, DateBrith, Now)
DateBrith = DateBrith.AddYears(Y)
Dim M As Integer = DateDiff(DateInterval.Month, DateBrith, Now)
DateBrith = DateBrith.AddMonths(M)
Dim D As Integer = DateDiff(DateInterval.Day, DateBrith, Now)
MsgBox("your age is :" & Y & "/" & M & "/" & D)
sen.Text = Y & "/" & M & "/" & D
End If
End Sub

Public Function ShamsiToMiladi(ByVal SDate As String) As String

Dim pc As New Globalization.PersianCalendar
ShamsiToMiladi = ""
Dim Tarikh
Tarikh = Split(SDate, "/")
ShamsiToMiladi = (pc.ToDateTime(Tarikh(0), Tarikh(1), Tarikh(2), 0, 0, 0, 0))
Return ShamsiToMiladi
End Function
End Class

bhasoft
شنبه 17 اردیبهشت 1390, 00:19 صبح
مرسي باربدسافت عزيز...:قلب:
قربونه دستت...
فقط داداشي اگه زحمتي نيست بعضي جاهاي كدتو برام توضيح بده.
ميخوام بدونم چيكار ميكنه و به خاطر همين وقتي تاريخ ماه و روز به ترتيب 12 و 31 به بالا وارد شدن خطا نده و جلوشو بگيرم.و همينطور وقتي مقدارشون صفر وارد ميشه هم نذارم.
ممنونت ميشم.
مرسيييييييييييييييييييييي ي

barbodsoft.com
شنبه 17 اردیبهشت 1390, 01:31 صبح
جلوی هر خطی که لازم به توضیح بود. توضیح دادم. چون شما از goto استفاده کرده بودی من هم از این روش استفاده کردم.


Imports System.Globalization

Public Class Form1
Public shamsi As New Globalization.PersianCalendar
Private Sub MaskedTextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MaskedT6.TextChanged
Try
If MaskedT6.MaskCompleted = True Then
If Val(MaskedT6.Text.Substring(5, 2)) > 12 Then GoTo M ' چک می کند تاریخ ماه بیشتر از 12 نباشد
If Val(MaskedT6.Text.Substring(8, 2)) > 31 Then GoTo D ' چک می کند تاریخ روز بیشتر 31 نباشد
Dim DateBrith As Date = ShamsiToMiladi(MaskedT6.Text) 'معادل میلادی تاریخ وارد شده حساب می شود ShamsiToMiladi از طریق تابع
Dim Y As Integer = DateDiff(DateInterval.Year, DateBrith, Now) ' اختلاف تاریخ به سال محاسبه می شود
DateBrith = DateBrith.AddYears(Y) 'اختلاف سال به DateBrith اضافه می شود
Dim M As Integer = DateDiff(DateInterval.Month, DateBrith, Now) ' اختلاف ماه محاسبه می شود
DateBrith = DateBrith.AddMonths(M) ' اختلاف ماه به DateBrith اضافه می شود
Dim D As Integer = DateDiff(DateInterval.Day, DateBrith, Now) ' اختلاف روز محاسبه می شود
MsgBox("your age is :" & Y & "/" & M & "/" & D)
sen.Text = Y & "/" & M & "/" & D
GoTo close
Else
GoTo close
End If
Catch ex As Exception
GoTo tryGo ' در صورتی که فرمت تاریخ صحیح نباشه مثلا تاریخ 1358/12/31 وارد شود. اسفند 31 روزه نداریم
End Try


M:
MsgBox("error Month")
GoTo close

D:
MsgBox("error Day")
GoTo close

tryGo:
MsgBox("error Format")
GoTo close

close:
End Sub

Public Function ShamsiToMiladi(ByVal SDate As String) As String
'تابع تبدیل تاریخ شمسی به میلادی
Dim pc As New Globalization.PersianCalendar
ShamsiToMiladi = ""
Dim Tarikh
Tarikh = Split(SDate, "/")
ShamsiToMiladi = (pc.ToDateTime(Tarikh(0), Tarikh(1), Tarikh(2), 0, 0, 0, 0))
Return ShamsiToMiladi
End Function
End Class

bhasoft
شنبه 17 اردیبهشت 1390, 11:18 صبح
ممنونم داداش خوبم.شرمنده به زحمت انداختمت.
دستت درد نكنه....