PDA

View Full Version : تابع تبدیل تاریخ میلادی به شمسی



Farhad-Csharp
سه شنبه 25 مرداد 1384, 08:03 صبح
سلام.
من فرمت تاریخ فیلدهای جدولم به شکل yyyy/mm/dd است و تابعی میخوام که این تاریخهای میلادی رو به شمسی تبدیل کنه .با زبانهای vb یا vb.net یا #c.
با تشکر.

hossein.e
سه شنبه 25 مرداد 1384, 17:23 عصر
بابا این که دیگه خیلی راحته :)
اول این Dll رو به References پروژه ات اضافه می کنی
بعد System.Globalization را Import می کنی


کد:

Imports System.Globalization
در ضمن فایل dll رو هم می تونی از اینجا برداری

Caprice
سه شنبه 25 مرداد 1384, 18:27 عصر
این تابع چطوری میلادی رو به شمسی تبدیل میکنه؟

rezanew
سه شنبه 25 مرداد 1384, 19:24 عصر
قبلا بچه ها یه چند تایی گذاشته بودن حالا این یه کلاس دیگه به حالت source

Mohammad .net
سه شنبه 25 مرداد 1384, 20:05 عصر
دوست دارم بدون آیا ماکروسافت از این استفاده کرده؟

http://iranasp.net/Articles/ShowArticle.aspx?articleid=52

بابک زواری
سه شنبه 25 مرداد 1384, 23:01 عصر
اقا فرهاد شما لطف کنید من بعد سوالتون رو یا دربخش VB یا در Csharp مطرح کنید و به قوانین احترام بذارید
ممنون از همکاریتون

Farhad-Csharp
چهارشنبه 26 مرداد 1384, 10:58 صبح
اقا فرهاد شما لطف کنید من بعد سوالتون رو یا دربخش VB یا در Csharp مطرح کنید و به قوانین احترام بذارید
ممنون از همکاریتون
وقتی به سئوال آدم کسی جواب نمیده ..... ولی چشم.

kochol
جمعه 28 مرداد 1384, 19:09 عصر
قبلا بچه ها یه چند تایی گذاشته بودن حالا این یه کلاس دیگه به حالت source
با اجازه این مشکل داشت من مشکلاشو گرفتم کلاسی خیلی خوبیه
اگر خاستید تاریخی بدهید بنویسید
shamsidate.M2S(NOW)

kochol
شنبه 29 مرداد 1384, 09:21 صبح
سلام
تغییرات ایجاد شده در کلاس shamsidate.vb
1. سالهای کبیثه در ماه اسفند 30 روز دارند و در بقیه سالها ماه اسفند 29 روز هست ولی در برنامه یکی کمتر بود یعنی 28 روز و 29 روز بود
2. برای استفاده راحتتر از کلاس بدون تعریف آن به فانکشنهای M2S نوع shared را اظافه کردم تا از هر جای برنامه قابل فراخوانی باشد
3. مشکل اصلی که داشت اصلا نمی تونست مقدار سال و ماه و روز را از یکدیگر عددهاشو جدا کنه و هر تاریخی که بهش می دادی برمی گردوند -621/10/10 البته شاید از نوع خاصی از استرینگ درست برمی گردوند ولی الان فقط کافی هست در هر کجا که می خواهید بنویسید shamsidate.M2S(NOW) ولی اگر خواستید از استرینگ استفاده کنید فرمتش رو این طوری بنویسید 08,29,2005 و استفاده کنید

rezanew
شنبه 29 مرداد 1384, 09:35 صبح
ممنون از این که روش وقت گذاشتین

kochol
شنبه 29 مرداد 1384, 13:33 عصر
سلام
واقعا من خیلی از این کلاس خوشم اومد و واقعا خیلی من اینو نیاز داشتم
ممنون از شما

rezanew
شنبه 29 مرداد 1384, 13:35 عصر
ولی دوست عزیز حالا که نگاه کردم دیدم که کلاس دوم غلط عمل می کنه
در مورد ایراد اول که شما اونو 30 روز کردین این تعداد روز برای ماه میلادی (ماه دوم میلادی) است که در کبیسه 29 و در سال معمولی 28 روز است
کلاس اول در مورد M2S(Now) به خوبی عمل می کرد ولی حالا مطمئن تر شده
و بهتر بود به جای استفاده از , برای جدا کردن تاریخ از / استفاده می کردین

باز هم ممنون

Ehsan Zand
شنبه 29 مرداد 1384, 21:21 عصر
عزیزان این یکی رو هم امتحان کنید ضرر نداره. تو یه مجله خوندم در نسخه های بعدی Microsoft
از همین PersianTools.Dll برای پشتیبانی این قضیه استفاده کرده. نمونه برنامش هم هست.

kochol
چهارشنبه 02 شهریور 1384, 14:15 عصر
ولی دوست عزیز حالا که نگاه کردم دیدم که کلاس دوم غلط عمل می کنه
در مورد ایراد اول که شما اونو 30 روز کردین این تعداد روز برای ماه میلادی (ماه دوم میلادی) است که در کبیسه 29 و در سال معمولی 28 روز است

بله کاملا حق با شماست

mehrdotnet
پنج شنبه 03 شهریور 1384, 20:47 عصر
نظرتون در مورد کلاس PCal چیه ؟
اون هم همین مشکلات رو داره؟

مجتبی کریمی
جمعه 04 شهریور 1384, 11:52 صبح
من اینو نوشتم
ایراد داره اما به درد می خوره

انو تو یه کلاس بنویس

Private DT As New DateTimes
Private DateSeparator As DateSeparators
Private SD() As Byte = {0, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29}
Private MD() As Byte = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
Private irNow As Date = Now

Public Property Date_Separator() As DateSeparators
Get
Return Date_Separator
End Get
Set(ByVal Value As DateSeparators)
Date_Separator = Value
End Set
End Property
Public ReadOnly Property strDate() As String
Get
Return cMtoS(irNow.Day, irNow.Month, irNow.Year)
End Get
End Property
Public ReadOnly Property dteDate() As Date
Get
Try
Return CDate(cMtoS(irNow.Day, irNow.Month, irNow.Year)).ToLongDateString
Catch
Return Nothing
End Try
End Get
End Property
Public ReadOnly Property strTime() As String
Get
Refresh()
Return irNow.Hour.ToString & ":" & irNow.Minute.ToString & ":" & irNow.Second.ToString
End Get
End Property
Public ReadOnly Property dteTime() As String
Get
Refresh()
Try
Return Convert.ToDateTime(irNow.Hour.ToString & ":" & irNow.Minute.ToString & ":" & irNow.Second.ToString).ToLongTimeString
Catch
Return Nothing
End Try
End Get
End Property
Public ReadOnly Property DayOfWeek() As String
Get
Select Case irNow.DayOfWeek
Case System.DayOfWeek.Friday
Return "جمعه"
Case System.DayOfWeek.Monday
Return "دوشنبه"
Case System.DayOfWeek.Saturday
Return "شنبه"
Case System.DayOfWeek.Sunday
Return "یکشنبه"
Case System.DayOfWeek.Thursday
Return "دوشنبه"
Case System.DayOfWeek.Tuesday
Return "سه شنبه"
Case System.DayOfWeek.Wednesday
Return "چهارشنبه"
End Select
End Get
End Property
Public ReadOnly Property Day() As Integer
Get
Dim DT As DateTimes
DT = MtoS(irNow.Day, irNow.Month, irNow.Year)
Return DT.Day
End Get
End Property
Public ReadOnly Property Month() As Integer
Get
Dim DT As DateTimes
DT = MtoS(irNow.Day, irNow.Month, irNow.Year)
Return DT.Month
End Get
End Property
Public ReadOnly Property Year() As Integer
Get
Dim DT As DateTimes
DT = MtoS(irNow.Day, irNow.Month, irNow.Year)
Return DT.Year
End Get
End Property
Public ReadOnly Property Second() As Integer
Get
Return Now.Second()
End Get
End Property
Public ReadOnly Property Minute() As Integer
Get
Return Now.Minute
End Get
End Property
Public ReadOnly Property Hour() As Integer
Get
Return Now.Hour
End Get
End Property
Public Function cMtoS(ByVal D As Date) As String
Dim DT As DateTimes
DT = STRtoINT(D)
DT = MtoS(DT.Day, DT.Month, DT.Year)
Return DT.Year.ToString & "/" & DT.Month.ToString & "/" & DT.Day.ToString
End Function
Public Function cMtoS(ByVal D As String) As String
Dim DT As DateTimes
DT = STRtoINT(D)
DT = MtoS(DT.Day, DT.Month, DT.Year)
Return DT.Year.ToString & "/" & DT.Month.ToString & "/" & DT.Day.ToString
End Function
Public Function CStoM(ByVal D As String) As String
Dim DT As DateTimes
DT = STRtoINT(D)
DT = StoM(DT.Day, DT.Month, DT.Year)
Return DT.Year.ToString & "/" & DT.Month.ToString & "/" & DT.Day.ToString
End Function
Public Function CStoM(ByVal D As Date) As String
Dim DT As DateTimes
DT = STRtoINT(D)
DT = StoM(DT.Day, DT.Month, DT.Year)
Return DT.Year.ToString & "/" & DT.Month.ToString & "/" & DT.Day.ToString
End Function
Private Function MtoS(ByVal Day As Integer, ByVal Month As Integer, ByVal Year As Integer) As DateTimes
Try
DT.M_Day = Day
DT.M_Month = Month
DT.M_Year = Year
DT.S_day = 0
DT.S_Month = 0
DT.S_Year = 0
For i As Integer = 0 To DT.M_Month - 1
DT.M_Day += MD(i)
Next
If DT.M_Day > 79 Then
DT.S_day = DT.M_Day - 79
Else
DT.S_day = DT.M_Day + 286
End If
If DT.S_day > 287 Then
DT.S_Year = DT.M_Year - 622
Else
DT.S_Year = DT.M_Year - 621
End If
While DT.S_day > SD(DT.S_Month)
DT.S_day -= SD(DT.S_Month)
DT.S_Month += 1
End While
DT.Day = DT.S_day
DT.Month = DT.S_Month
DT.Year = DT.S_Year
Return DT
Catch

End Try
End Function


Private Function StoM(ByVal Day As Integer, ByVal Month As Integer, ByVal Year As Integer) As DateTimes
Try
DT.S_day = Day
DT.S_Month = Month
DT.S_Year = Year
DT.M_Day = 0
DT.M_Month = 0
DT.M_Year = 0
For i As Integer = 0 To DT.S_Month - 1
DT.S_day += SD(i)
Next
If DT.S_day > 79 Then
DT.M_Day = DT.S_day - 79
Else
DT.M_Day = DT.S_day + 286
End If
If DT.M_Day > 287 Then
DT.M_Year = DT.S_Year - 622
Else
DT.M_Year = DT.S_Year - 621
End If
While DT.M_Day > MD(DT.M_Month)
DT.M_Day -= MD(DT.M_Month)
DT.M_Month += 1
End While
DT.Day = DT.M_Day
DT.Month = DT.M_Month
DT.Year = DT.M_Year
Return DT
Catch

End Try
End Function
Public Function cMtoS(ByVal Day As Integer, ByVal Month As Integer, ByVal Year As Integer) As String
Dim DT As DateTimes
DT = MtoS(Day, Month, Year)
Return DT.Year.ToString & "/" & DT.Month.ToString & "/" & DT.Day.ToString
End Function
Public Function cStoM(ByVal Day As Integer, ByVal Month As Integer, ByVal Year As Integer) As String
Dim DT As DateTimes
DT = StoM(Day, Month, Year)
Return DT.Year.ToString & "/" & DT.Month.ToString & "/" & DT.Day.ToString
End Function
Public Sub Refresh()
irNow = Now
End Sub

Public Structure DateTimes
Dim M_Day As Integer
Dim M_Month As Integer
Dim M_Year As Integer
Dim S_day As Integer
Dim S_Month As Integer
Dim S_Year As Integer
Dim Day As Integer
Dim Month As Integer
Dim Year As Integer
End Structure

Private Function STRtoINT(ByVal s As String) As DateTimes
Dim DT As DateTimes
If s.Length = 0 Then
Return Nothing
Exit Function
End If
Dim A() As String
A = Split(s, "/")
Dim U_A As Integer = UBound(A)
If U_A < 2 Then
Return Nothing
Exit Function
End If
Dim B(U_A + 1) As Integer
For i As Integer = 0 To U_A
B(i) = CInt(A(i))
Next
DT.Day = B(2)
DT.Month = B(1)
DT.Year = B(0)
Return DT
End Function

End Class

linux
شنبه 05 شهریور 1384, 15:06 عصر
:)
چرا همه چیز را از اول می خواهید بنویسید قبلا انجام شده

lida
شنبه 12 شهریور 1384, 19:57 عصر
merci az lotfetoon
lotfan tozih bedin chetori eik class ra be project ezafe konim va az function ha iash be rahati estefade konim mamnonam

Mohammad .net
یک شنبه 13 شهریور 1384, 10:20 صبح
نظرتون در مورد کلاس PCal چیه ؟
اون هم همین مشکلات رو داره؟

من مدت زیادی که از این کلاس استفاده می کنم. این کلاس کاملاً استاندارد طراحی شده و من مشکلی ندیدم

حامد مصافی
یک شنبه 13 شهریور 1384, 12:30 عصر
این مشکلات تقویم ها تمومی نداره

Ehsan Zand
دوشنبه 14 شهریور 1384, 01:05 صبح
دوستان اون فایل PersianTools رو که گذاشتم اون بالا امتحان کنید.واقعا ضرر نداره.
بسیار کامله و برای من که تا حالا صددرصد جواب داده. فکر میکنم میتونه پایان بخش این مشکلات باشه.
کافیه امتحان کنید.

rezanew
دوشنبه 14 شهریور 1384, 07:31 صبح
شما از کدوم مشکل حرف میزنید این کد ها هیچ مشکلی ندارند در ضمن ممکنه بعضی ها دوست نداشته باشند از کلاس های آماده به شکل dll استفاده کنند
ممنون