PDA

View Full Version : سوال: مشكل در تبديل تاريخ شمسي به ميلادي



morteza271
چهارشنبه 29 دی 1389, 14:32 عصر
سلام دوستان.

من با استفاده از كد زير تاريخ شمسي (مثلا : 29/12/1389) رو به ميلادي تبديل ميكنم ولي جوابش استباهه!!
كسي ميتونه راهنمايي كنه؟

DateTime dt = new DateTime(1389, 10, 29);
System.Globalization.HijriCalendar hc = new System.Globalization.HijriCalendar();
DateTime dt_miladi = new DateTime(hc.GetYear(dt), hc.GetMonth(dt), hc.GetDayOfMonth(dt));
MessageBox.Show(dt_miladi.ToShortDateString()); // 11/1/0791
همونطور كه نوشتم تاريخ 0791/1/11 رو برميگردونه!
با تشكر...

sajadjamalian
چهارشنبه 29 دی 1389, 14:56 عصر
سلام دوست عزیز:
من امتحان کردم درست بود،
http://barnamenevis.org/showthread.php?245861-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D9%87%D8%A7%DB%8C-%D8%B4%D9%85%D8%B3%DB%8C-%D9%88-%D9%82%D9%85%D8%B1%DB%8C-%D9%88-%D9%85%DB%8C%D9%84%D8%A7%D8%AF%DB%8C-%D8%A8%D9%87-%DB%8C%DA%A9%D8%AF%DB%8C%DA%AF%D8%B1

Reza,M
چهارشنبه 29 دی 1389, 15:09 عصر
با سلام
اين كد رو در يك Button كپي كن

Dim da As New Globalization.PersianCalendar
TextBox2.Text = Str(da.GetYear(TextBox1.Text)) + " /" + Str(da.GetMonth(TextBox1.Text)) + " /" + Str(da.GetDayOfMonth(TextBox1.Text))

silver_face
چهارشنبه 29 دی 1389, 19:10 عصر
این کد کامل تبدیل شمسی به میلادی و بر عکس هستش امیدوارم خوشتون بیاد(البته من با C# نوشته بودم که براتون به VBتبدیل کردم):

Function ShamsiToMiladi(ByVal ShamsiDate AsString) AsString
If IsNumeric(ShamsiDate.Replace("/", "")) = FalseThenReturn 0
Try
If ShamsiDate.Length <> 10 ThenReturn 0
Dim Date_Sh AsNew Globalization.PersianCalendar()
Dim Date_M As DateTime = Date_Sh.ToDateTime(ShamsiDate.Substring(0, 4), ShamsiDate.Substring(5, 2), _
ShamsiDate.Substring(8, 2), _
0, 0, 0, 0, _
Globalization.PersianCalendar.PersianEra)
Return Date_M.ToShortDateString
Catch ex As Exception
Return 0
EndTry
EndFunction

Function MiladiToShamsi(ByVal Year AsInteger, ByVal Month AsInteger, ByVal Day AsInteger) AsString
Try
Dim Date_M AsDate = Year & "/" & Month & "/" & Day
Dim Date_Sh AsNew Globalization.PersianCalendar
Return Date_Sh.GetYear(Date_M) & "/" & Format(Date_Sh.GetMonth(Date_M), "00") & "/" & Format(Date_Sh.GetDayOfMonth(Date_M), "00")
Catch ex As Exception
Return 0
EndTry
EndFunction

morteza271
چهارشنبه 29 دی 1389, 20:39 عصر
سلام دوست عزیز:
من امتحان کردم درست بود،
http://barnamenevis.org/showthread.php?245861-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D9%87%D8%A7%DB%8C-%D8%B4%D9%85%D8%B3%DB%8C-%D9%88-%D9%82%D9%85%D8%B1%DB%8C-%D9%88-%D9%85%DB%8C%D9%84%D8%A7%D8%AF%DB%8C-%D8%A8%D9%87-%DB%8C%DA%A9%D8%AF%DB%8C%DA%AF%D8%B1

ممنونم از توجهتون.
يعني شما همين كد منو امتحان كردين و درست بود؟!مگه ميشه؟ژس چرا براي من اشتباه جواب ميده؟!!
من اين كد رو دقيقا از روي همون آدرسي كه شما گذاشتين برداشتم!!
دليلش چيه كه اشتباه جواب ميده!

morteza271
چهارشنبه 29 دی 1389, 20:42 عصر
این کد کامل تبدیل شمسی به میلادی و بر عکس هستش امیدوارم خوشتون بیاد(البته من با C# نوشته بودم که براتون به VBتبدیل کردم):

Function ShamsiToMiladi(ByVal ShamsiDate AsString) AsString
If IsNumeric(ShamsiDate.Replace("/", "")) = FalseThenReturn 0
Try
If ShamsiDate.Length <> 10 ThenReturn 0
Dim Date_Sh AsNew Globalization.PersianCalendar()
Dim Date_M As DateTime = Date_Sh.ToDateTime(ShamsiDate.Substring(0, 4), ShamsiDate.Substring(5, 2), _
ShamsiDate.Substring(8, 2), _
0, 0, 0, 0, _
Globalization.PersianCalendar.PersianEra)
Return Date_M.ToShortDateString
Catch ex As Exception
Return 0
EndTry
EndFunction

Function MiladiToShamsi(ByVal Year AsInteger, ByVal Month AsInteger, ByVal Day AsInteger) AsString
Try
Dim Date_M AsDate = Year & "/" & Month & "/" & Day
Dim Date_Sh AsNew Globalization.PersianCalendar
Return Date_Sh.GetYear(Date_M) & "/" & Format(Date_Sh.GetMonth(Date_M), "00") & "/" & Format(Date_Sh.GetDayOfMonth(Date_M), "00")
Catch ex As Exception
Return 0
EndTry
EndFunction


ممنونم دوست عزيز ولي من با سي شارپ لازم داشتم نه با VB !!
به هر حال ممنونم.اگه رسيدي سي شارپشو برام بذار وگرنه خودم تبديلش ميكنم!
مرسي.

sajadjamalian
چهارشنبه 29 دی 1389, 21:07 عصر
ممنونم از توجهتون.
يعني شما همين كد منو امتحان كردين و درست بود؟!مگه ميشه؟ژس چرا براي من اشتباه جواب ميده؟!!
من اين كد رو دقيقا از روي همون آدرسي كه شما گذاشتين برداشتم!!
دليلش چيه كه اشتباه جواب ميده!


سلام دوست عزیز:
شما توی کدتون از hijricalender استفاده کردین که باید از persiancalender استفاده کنید، جواب اشتباهی که به شما میده بخاطر این هست که تاریخی رو که شما بهش دادید رو به عنوان یه تاریخ قمری شناسایی میکنه نه شمسی.
موفق باشید.

morteza271
چهارشنبه 29 دی 1389, 21:23 عصر
سلام دوست عزیز:
شما توی کدتون از hijricalender استفاده کردین که باید از persiancalender استفاده کنید، جواب اشتباهی که به شما میده بخاطر این هست که تاریخی رو که شما بهش دادید رو به عنوان یه تاریخ قمری شناسایی میکنه نه شمسی.
موفق باشید.

ممنونم.
خوب ميخوام شمسي رو به ميلادي تبديل كنم مگه نبايد از HijriCalendar استفاده كنم؟!
ميشه لطف كنيد و كد خودتون رو بذارين؟ممنون ميشم.

sajadjamalian
چهارشنبه 29 دی 1389, 22:24 عصر
سلام دوست عزیز:
همون کد خودتون فقط hijricalaender رو بجاش persiancalender بنویس.

DateTime dt = new DateTime(1389, 10, 29);
System.Globalization.PersianCalendar hc = new System.Globalization.PersianCalendar();
DateTime dt_miladi = new DateTime(hc.GetYear(dt), hc.GetMonth(dt), hc.GetDayOfMonth(dt));
MessageBox.Show(dt_miladi.ToShortDateString());

mohsen_csharp
پنج شنبه 30 دی 1389, 23:43 عصر
با سلام
حواستون باشه که این خط کد که شما نوشتید یکم اشتباه


DateTime dt = new DateTime(1389, 10, 29);

تو این خط کد شما در حقیقت یه تاریخ میلادی ایجاد کرده این که مربوط با سال 1389 میلادی هست نه 1389 شمسی!!!!!
شما باید اطلاعات تاریخ شمسی رو مستقیما به PresianCalendar بدین تا از بروز اشباهات احتمالی جلوگیری کنید چون به فرض تعداد روزهای ماه های شمسی با تعداد روزهای ماه های میلادی معادل ، برابر نیست و ممکنه به Exception برخورد کنید

morteza271
جمعه 01 بهمن 1389, 10:32 صبح
از همه دوستان ممنونم.
مشکلم برطرف شد!
اشتباه عجیبی کرده بودم:گیج::خجالت: