PDA

View Full Version : مشکل در تبدیل تاریخ شمسی به میلادی روز 31 ماه



mehrnoosh_al62
دوشنبه 27 آبان 1387, 11:09 صبح
سلام دوستان
من تو برنامم برای نشان دادن تاریخ و تبدیل تاریخ میلادی به شمسی از کد زیر استفاده میکنم . ابتدا تاریخ رو از بانک بازیابی کرده و بعد اونو تبدیل میکنم.


Dim pc As New System.Globalization.PersianCalendar()
Dim dt As New Date()
dim date as string= pc.GetYear(dt).ToString() & "/" & pc.GetMonth(dt).ToString() & "/" & _
pc.GetDayOfMonth(dt).ToString()

اما تاریخ هایی که باید تبدیل به روز 31 ماه بشن مشکل داره و تبدیل نمیشه
ممکنه کمک کنید...:ناراحت::ناراحت::ناراح ت:

mostafaaa
دوشنبه 27 آبان 1387, 12:30 عصر
سلام دوستم من
من با متد زیر هر تاریخ میلادی رو به راحتی به شمسی تبدیل میکنم

''' <summary>
''' تبدیل تاریخ میلادی به شمسی
''' </summary>
''' <param name="MDate">فرمت ورودی تاریخ : MM-dd-yyyy</param>
''' <returns></returns>
''' <remarks></remarks>
Function MiladiToShamsi(ByVal MDate As Date) As String
Dim Pcal As New Globalization.PersianCalendar
Return Pcal.GetYear(MDate) & "/" & Pcal.GetMonth(MDate) & "/" & Pcal.GetDayOfMonth(MDate)
End Function
برای مثال

MiladiToShamsi("5/20/2008")
که این خروجی رو میده

1387/2/31

rooshan2008
دوشنبه 27 آبان 1387, 12:36 عصر
سلام




Dim s AsString = "2008/5/20"
Dim date1 AsString = pc.GetYear(s).ToString() & "/" & pc.GetMonth(s).ToString() & "/" & _
pc.GetDayOfMonth(s).ToString()
MsgBox(date1)

کدی که نوشته بودی دست بود مثلاً من با 2008/5/20 امتحان کردم درست بود
حالا یه سری به بانکت بزن شاید اونجا مشکلی باشه...

mehrnoosh_al62
دوشنبه 27 آبان 1387, 12:46 عصر
تاریخ مورد نظر تو بانکم به این شکله:


2008-10-29 08:38:36.937

mostafaaa
دوشنبه 27 آبان 1387, 17:18 عصر
من با همین فرمتی که توی بانکتون ذخیره شده هم تست کردم. مشکلی نبود.

Dim D As Date = "2008-5-20 08:38:36.937"
MsgBox(MiladiToShamsi(D))
خروجی

1387/2/31

mehrnoosh_al62
سه شنبه 28 آبان 1387, 08:22 صبح
من با همین فرمتی که توی بانکتون ذخیره شده هم تست کردم. مشکلی نبود.

Dim D As Date = "2008-5-20 08:38:36.937"
MsgBox(MiladiToShamsi(D))
خروجی

1387/2/31

ببینید من یه سری اطلاعات رو از بانک میخونم و با همین تابع شما در دیتا گرید نشونم میدم. تاریخ رو باید به شکل شمسی نشون بدم. اما تاریخ هایی که تو روز 31 ماهه با یه پیغام اروری که میده تبدیل نمیکنه. پیغام ارور رو در زیر گذاتشتم تا ببینید. دقیقا همین تاریخی که شما وارد کردید رو گذاشتم.

mostafaaa
سه شنبه 28 آبان 1387, 09:49 صبح
سلام دوست من
ایکاش از اول همین Error رو گزاشته بودی. به نظر میرسه مشکل از DataGridView باشه. احتمالا ValueType اون ستونی که توش تاریخ رو نشون میدی DateTime هستش. فکر میکنl با تغییر فرمت اون ستون مشکلت برطرف بشه.

mehrnoosh_al62
سه شنبه 28 آبان 1387, 10:13 صبح
من مستقیما اطلاعات رو از بانک میخونم یعنی DataPropertyName هر ستون رو طبق دستور Select از بانک قرار میدم. با این شرایط چطور میتونم ValueType رو تغییر بدم...؟؟؟

mostafaaa
سه شنبه 28 آبان 1387, 12:15 عصر
یعنی یه فیلدی توی بانک دارید با فرمت DateTime که توش تاریخ شمسی رو ذخیره کردید؟
اگه اینجوریه که معلومه چرا ارور میده تاریخ رو توی بانک یا به صورت میلادی ذخیره کن و یا اگه میخوای به صورت شمسی ذخیره کنی فرمت فیلدت رو Text بزار.

mehrnoosh_al62
سه شنبه 28 آبان 1387, 12:37 عصر
نه تاریخ توی بانکم به شکل میلادی ذخیره شده و نوعش هم DateTime هست. و میخوام تو دیتاگرید به صورت شمسی نشون بدم

naeeme
سه شنبه 28 آبان 1387, 14:35 عصر
من مستقیما اطلاعات رو از بانک میخونم یعنی DataPropertyName هر ستون رو طبق دستور Select از بانک قرار میدم. با این شرایط چطور میتونم ValueType رو تغییر بدم...؟؟؟
اگر شما اطلاعات رو مستقیما از بانک می خونین، پس چطور تاریخ شمسی در گرید می خواین نشون بدین؟؟
اما در هر حالٰ شما باید یک ستون در گرید تعریف کنین که valuetype اون از جنس string باشه.
برای چگونگی هم به MSDN مراجعه کنین:لبخندساده:

mehrnoosh_al62
سه شنبه 28 آبان 1387, 14:38 عصر
این ستون از گرید رو تو یه حلقه for تغییرش میدم و تبدیل به شمسی میکنم. به هر حال ممنون مشکلم حل شد

Morteza Manafpour
سه شنبه 28 آبان 1387, 14:38 عصر
Module Module1
Friend Function PDate(ByVal Model As Integer) As String
Dim PDate1 As String = ""
Dim x As New Globalization.PersianCalendar
Select Case Model
Case 1
PDate1 = x.GetYear(Now) & "/"
If (Len(Trim((x.GetMonth(Now)))) = 1) Then
PDate1 = PDate1 & "0" & x.GetMonth(Now) & "/"
Else
PDate1 = PDate1 & x.GetMonth(Now) & "/"
End If
If (Len(Trim((x.GetDayOfMonth(Now)))) = 1) Then
PDate1 = PDate1 & "0" & x.GetDayOfMonth(Now)
Else
PDate1 = PDate1 & x.GetDayOfMonth(Now)
End If
Case 2
Dim m As String = ""
Dim d As String = ""
Select Case x.GetMonth(Now)
Case 1
m = "فروردين"
Case 2
m = "ارديبهشت"
Case 3
m = "خرداد"
Case 4
m = "تير"
Case 5
m = "مرداد"
Case 6
m = "شهريور"
Case 7
m = "مهر"
Case 8
m = "آبان"
Case 9
m = "آذر"
Case 10
m = "دي"
Case 11
m = "بهمن"
Case 12
m = "اسفند"
End Select
Select Case x.GetDayOfWeek(Now)
Case 0
d = "يكشنبه"
Case 1
d = "دوشنبه"
Case 2
d = "سه‌شنبه"
Case 3
d = "چهارشنبه"
Case 4
d = "پنج‌شنبه"
Case 5
d = "جمعه"
Case 6
d = "شنبه"
End Select
PDate1 = d.ToString & " " & x.GetDayOfMonth(Now) & " " & m & " ماه " & x.GetYear(Now)
Case 3
PDate1 = x.GetYear(Now)
If (Len(Trim((x.GetMonth(Now)))) = 1) Then
PDate1 = PDate1 & "0" & x.GetMonth(Now)
Else
PDate1 = PDate1 & x.GetMonth(Now)
End If
If (Len(Trim((x.GetDayOfMonth(Now)))) = 1) Then
PDate1 = PDate1 & "0" & x.GetDayOfMonth(Now)
Else
PDate1 = PDate1 & x.GetDayOfMonth(Now)
End If
End Select
Return PDate1.ToString
End Function
End Module


اين كد رو داخل ماژول قرار بده وبه فرم هاي زير فراخواني كن

messagebox.show(PDate(1))
يا به جاي مقدار 1 مقدارهاي 2 و 3 را قرار بده و نتيجه رو ببين

bah_jaf
سه شنبه 28 آبان 1387, 15:00 عصر
دوست عزیر این تابعی که شما گذاشتین ورودیش تاریخ هست نه رشته پس باید فیلد شما هم از نوع تاریخ باشه! که میگین نیست. میشه نمونه برنامتونو بذارید تا ایرادو پیدا کنیم؟

sepehr.net
سه شنبه 28 آبان 1387, 23:10 عصر
سلام بهترین راه اینه که همیشه یک ستون از نوع DateTime باشه و یک ستون از نوع String که در یکی تاریخ میلادی و در یکی تاریخ شمسی نگهداری بشه. اگه این کار رو بکنید میتونین توی گرید هم ،تاریخ شمسی که فرمت رشته ایی داره رو نشون بدین. در ضمن با این کار دیگه توی کریستال هم مشکلی ندارین و احتیاجی به اضافه کردن DLL به اون رو ندارین

s_ahmadneya
پنج شنبه 30 آبان 1387, 10:29 صبح
برای کار باتاریخ بهترین راه اینه :
1- تاریخ میلادی در بانک ذخیره بشه
2- یک استور پوروسیجر ویا تابع در خود بانک sql server نوشته بشه که تاریخ میلادی را به شمسی تبدیل کنه
3-در هنگام select از بانک تاریخ شمسی را برگردانیم اونوقت به راحتی در هر جایی می توان از ان بهره برداری نمود .
من با این روش کار می کنم هیچ مشکلی ندارم.