PDA

View Full Version : سوال: كم كردن 2 تاريخ شمسي موجود در Textbox از يكديگر



barnamenevisjavan
چهارشنبه 20 اردیبهشت 1391, 14:29 عصر
سلام من اين سوال رو چندبار بطور ديگه پرسيدم ولي جواب درست و حسابي نگرفتم من ميخوام از دوتا Textbox كه تو هركدومش 2تا تاريخ شمسي وجود داره تاريخ هارو از هم ديگه كم بكنم و در اخر تبديل به روز بشه. مثل مثال زير
textbox1=1391/2/20
textbox2=1391/3/25

كه اگر اين هارو از هم كم بكنيم ميشه 25 روز
يكي گفت از Datediff استفاده كن ولي جواب نداد لطفا كمك كنيد يه كدي بديد بهم

فرید نجفلو
چهارشنبه 20 اردیبهشت 1391, 14:54 عصر
سلام
دوست عزیز من دو تا تابع بهتون می دم که نه فقط این کار بلکه خیلی کار ها می تونید انجام بدید:
من همون مثال خودتون رو نوشتم
البته باید یادتون باشه که تاریخ رو باید کامل وارد کنید یعنی 10 رقمی مثل 20/02/1391

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim Date1 = CDate(GregorianDate(TextBox1.Text)) '1391/02/20
Dim Date2 = CDate(GregorianDate(TextBox2.Text)) '1391/03/25
Dim DayDif = Date1.Subtract(Date2).Days
MsgBox(DayDif)
End Sub
''' <summary>
''' برگردان تاریخ میلادی به شمسی
''' </summary>
''' <param name="InDate">تاریخ میلادی</param>
''' <returns></returns>
''' <remarks></remarks>
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

''' <summary>
''' برگردان تاریخ شمسی به میلادی
''' </summary>
''' <param name="InDate">تاریخ شمسی</param>
''' <returns></returns>
''' <remarks></remarks>
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


در ضمن من همین توابع رو با چند تا تابع مفید تو این تاپیک گذاشتم:
http://barnamenevis.org/showthread.php?333713-برنامه-نویسی-پایگاه-داده-به-صورت-گام-به-گام&p=1472084&viewfull=1#post1472084

barnamenevisjavan
چهارشنبه 20 اردیبهشت 1391, 14:57 عصر
خيلي ممنون تاريخ من بصورت 1391/2/5 هست چيكار كنم؟منظورم اينه بصورت 10 رقمي نيستش!

Hybrid
چهارشنبه 20 اردیبهشت 1391, 15:19 عصر
خيلي ممنون تاريخ من بصورت 1391/2/5 هست چيكار كنم؟منظورم اينه بصورت 10 رقمي نيستش!

میتونی فرمت بندیش کنی . شما مگه از طریق persian calender تاریخ شمسی رو بدست نمیاری خوب میتونی ماه و روز رو فرمت بندی کنین به وسیله ی tostring("00") . فکر کنم جواب شما رو دادم :

#7 (http://barnamenevis.org/showthread.php?340161-%D9%83%D9%85-%D9%83%D8%B1%D8%AF%D9%86-%D8%A7%D8%B9%D8%AF%D8%A7%D8%AF-%D9%85%D9%88%D8%AC%D9%88%D8%AF-%D8%AF%D8%B1-2-%D8%AA%D9%83%D8%B3%D8%AA-%D8%A8%D8%A7%D9%83%D8%B3-%D8%A7%D8%B2-%D9%87%D9%85%D8%AF%D9%8A%DA%AF%D9%87&p=1500729&viewfull=1#post1500729)
با TimeSpan نیازی به فرمت بندی هم نیست

M.KH-SH
چهارشنبه 20 اردیبهشت 1391, 20:40 عصر
دوست عزیز::::

Dim d1, d2 As Date
d1 = "1390/01/02"
d2 = "1390/01/29"
Label1.Text = DateDiff(DateInterval.Day, d1, d2)


شما به هر صورتی که دلت میخواد وارد کن

barnamenevisjavan
چهارشنبه 20 اردیبهشت 1391, 21:07 عصر
تشكر كار راه افتاد

فرید نجفلو
چهارشنبه 20 اردیبهشت 1391, 23:13 عصر
دوست عزیز::::

Dim d1, d2 As Date
d1 = "1390/01/02"
d2 = "1390/01/29"
Label1.Text = DateDiff(DateInterval.Day, d1, d2)


شما به هر صورتی که دلت میخواد وارد کن

سلام
دوست عزیز قصد جسارت ندارم ولی ما بیکار نبودیم که رفتیم اون همه کد رو نوشتیم!!!
این کد رو تست کن متوجه می شی:

Dim d1, d2 As Date
d1 = "1390/02/02"
d2 = "1390/02/29"
Label1.Text = DateDiff(DateInterval.Day, d1, d2)

توضیح:
تو کد شما اون تاریخ به شمسی تبدیل نمشه بلکه یک تاریخ میلادی در نظر گرفته می شه
و تعداد روز های ماه های میلادی با ماه های شمسی هم خونی ندره
تو این مثال بنده هم ماه دوم میلادی 28 روز هست واسه همین خطا می ده (آیا ما ماهی با 28 روز داریم؟؟!! حتی ماه دوم ما 31 روز هست یعنی سه روز تفاوت!!!)

M.KH-SH
چهارشنبه 20 اردیبهشت 1391, 23:27 عصر
دوست عزیز قصد جسارت ندارم ولی ما بیکار نبودیم که رفتیم اون همه کد رو نوشتیم!!!بیکار یا باکار بودن شما به من ربطی نداره
با یک تبدیل تاریخ به راحتی مشکل برطرف میشه

بله شما هم استاد هستی و هم برنامه نویس آقا تنها کدهای شما درست.

فرید نجفلو
پنج شنبه 21 اردیبهشت 1391, 14:53 عصر
بیکار یا باکار بودن شما به من ربطی نداره
با یک تبدیل تاریخ به راحتی مشکل برطرف میشه

بله شما هم استاد هستی و هم برنامه نویس آقا تنها کدهای شما درست.

سلام مجدد

باید به این نکته توجه کنید که ما اینجا قصد راهنمایی داریم نه اینکه بیام یه روش کاملا اشتباه رو بدیم و ملت رو دور خودش بپیچونیم
میگید نه؟؟!! پس به این تاپیک سر بزنید:
اين خطا رو چطوري رفع كنم؟Is not Declared (http://barnamenevis.org/showthread.php?340722-اين-خطا-رو-چطوري-رفع-كنم؟Is-not-Declared)
می بینید همین دوستمون دارن درست از روش شما استفاده می کنن و بعد ها دچار مشکل می شن و خودتون هم می دونید
اگر هم بگیم نیت کمک کردن مهمه این نکته رو هم باید در نظر داشت که موقع دادن پاسخ حداقل کاری که می تونید بکنید یک بار تست کردن کدتون هست

در ضمن اگه ممکنه این رو هم توضیح بدید که منظورتون رو اصلا متوجه نشدم

با یک تبدیل تاریخ به راحتی مشکل برطرف میشه

و اما قسمت شخصی مسئله:

جناب M.KH-SH (http://barnamenevis.org/member.php?220554-M.KH-SH) اولا من شما رو دوست عزیزم خطاب کردم .دوما گفتم که قصد جسارت ندارم(اعم از تمسخر ، توهین و غیره)
من کلمه بیکار رو نوشتم فقط جهت تاکید چون شما به قدری مطمئن پست زده بودید ("دلت میخواد" ) که منم شک ورداشت
فکر کنم باید در مورد حرف زدنتون هم تجدید نظر کنید و زود از کوره در نرید و طاقت انتقاد رو هم داشته باشید

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

اگر هم خدای نکرده هرگونه بی ادبی از من احساس کردید همینجا کمال عذرخواهی رو از شما دارم

bastakboys
جمعه 22 اردیبهشت 1391, 06:57 صبح
دوست عزیز دو تاریختو تبدیل کن به میلادی بعد با تابع

DateDiff(DateInterval.Day, d1, d2)
به قول خودتون از هم کم کنید
جوابش هم درست میاد.

barnamenevisjavan
جمعه 22 اردیبهشت 1391, 19:51 عصر
اقا ممنون كارم راه افتاد با كدهاي شما عزيزان

teymoorei
یک شنبه 23 مهر 1391, 00:20 صبح
سلام
دوستان لطفا کمک کنید .
من از این کد برای بدست آوردن تاریخ استفاده می کنم :
Dim TARIKH As New System.Globalization.PersianCalendar
Dim strTarikh As String = "{0}/{1}/{2}"
strTarikh = String.Format(strTarikh, TARIKH.GetYear(DateTime.Now), TARIKH.GetMonth(DateTime.Now), TARIKH.GetDayOfMonth(DateTime.Now))
lblDate.Text = strTarikh
چیزی که نمایش میده با این قالبه :
1390/1/1
در حالی که من می خوام این حالتی نمایش بده :
1390/01/01
لطفا کمک کنید خلیلی عجله دارم

Hybrid
یک شنبه 23 مهر 1391, 14:20 عصر
در حالی که من می خوام این حالتی نمایش بده :
1390/01/01
سلام ، داخل تاپیکی که قبلا خودتون ایجاد کرده بودین (http://barnamenevis.org/showthread.php?364833-%D9%86%D9%85%D8%A7%DB%8C%D8%B4-48-%D8%B3%D8%A7%D8%B9%D8%AA-%D8%AF%DB%8C%DA%AF%D9%87&p=1610583&viewfull=1#post1610583) جواب خودتون رو دادین !! :متفکر:


Private Function MiladiToShamsi(ByVal MiladDate As Date) As String
Dim sb As New System.Text.StringBuilder
Dim pc As New System.Globalization.PersianCalendar
sb.Append(pc.GetYear(DateAndTime.Now).ToString("0000") + "/")
sb.Append(pc.GetMonth(DateAndTime.Now).ToString("00") + "/")
sb.Append(pc.GetDayOfMonth(DateAndTime.Now).ToStri ng("00"))
Return sb.ToString()
End Function