PDA

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



Mr.Amateur
پنج شنبه 16 اسفند 1386, 09:47 صبح
من از این برنامه برای تبدیل تاریخ میلادی به شمسی استفاده کردم(تبدیل تاریخ جاری سیستم و استفاده از اون در برنامه)
http://barnamenevis.org/forum/attachment.php?attachmentid=11846&d=1193502997

اما یه مشکلی هست
این برنامه تاریخ میلادی رو به شمسی و به صورت "رر/م م/س س" تبدیل می کنه
چون تاریخ تبدیل شده با 13 یا 14 شروع نمی شه وقتی می خوام یک رکورد از نوع Date رو به جدول اضافه کنم ابتدای سال 19 اضافه می کنه
مثلآ به جای 1386/12/16 مقدار 1986/12/16 رو ذخیره می کنه

من نتونستم برنامه رو به این صورتی که می خواستم تغییر بدم
از دوستانی که می تونن این برنامه رو به این صورت تغییر بدن کمک می خوام
ممنون

ParsaNM
پنج شنبه 16 اسفند 1386, 10:03 صبح
من یه lib تاریخ نوشتم از اون استفاده کن خیلی خوبه حتی می تونی با استفاده از فرمت دلخواه خودت تاریخ بسازی مثلا اگر در فرمتت از MMMM استفاده کنی اسم ماه و اگر DDDD استفاده کنی اسم روز رو هم می ده کلی چیز دیگه هم داره تبدییل تاریخ میلادی به شمسی و بالعکس و اضافه یا کم کردن چند روز به یک تاریخ خاص و یا بدست آوردن سال یا ماه و یا ....

saman_itc
پنج شنبه 16 اسفند 1386, 10:33 صبح
http://barnamenevis.org/forum/showthread.php?t=94395
قبلش یه سرچ میکردی

Mr.Amateur
پنج شنبه 16 اسفند 1386, 11:07 صبح
جناب ParsaNM این lib شما برای دلفی هست من برای VB.NET می خوام!

آقای saman_itc من قبلآ سرچ کردم و اون تاپیک رو هم دیدم
از زحماتتون برای اون برنامه ممنون
البته برنامتون یه مقدار پیچیدگیش زیاده (البته از نظر من به عنوان یه تازه کار)
اما تا اونجایی که من متوجه شدم برنامه شما تاریخ رو به فرمت String در جدول ذخیره می کنه نه Date

برنامه ایی که من معرفی کردم تاریخ جاری سیستم رو به شمسی تبدیل می کنه و می تونیم اون رو به فرمت Date در Access ذخیره کنیم
و ما می تونیم در Queryها به فرمت Date باهاش رفتار کنیم نه String
تنها مشکلش اضافه نکردن 13 یا 14 به اول تاریخ هست

اگه می تونید یه نگاه به برنامه بندازید
ممنون می شم

منتظر راهنمایی دوستان هستم

bad_boy_2007
پنج شنبه 16 اسفند 1386, 11:18 صبح
من از این برنامه برای تبدیل تاریخ میلادی به شمسی استفاده کردم(تبدیل تاریخ جاری سیستم و استفاده از اون در برنامه)
http://barnamenevis.org/forum/attachment.php?attachmentid=11846&d=1193502997

اما یه مشکلی هست
این برنامه تاریخ میلادی رو به شمسی و به صورت "رر/م م/س س" تبدیل می کنه
چون تاریخ تبدیل شده با 13 یا 14 شروع نمی شه وقتی می خوام یک رکورد از نوع Date رو به جدول اضافه کنم ابتدای سال 19 اضافه می کنه
مثلآ به جای 1386/12/16 مقدار 1986/12/16 رو ذخیره می کنه

من نتونستم برنامه رو به این صورتی که می خواستم تغییر بدم
از دوستانی که می تونن این برنامه رو به این صورت تغییر بدن کمک می خوام
ممنون

عزیز دل بابا فرمهات رو که دیدم VB6 بود درسته ؟؟؟
الان کد واسه دات نت میخوای یا 6 ؟

چون دیدم تو انجمن دات نت تاپیک زدی سوال کرد.


اگر واسه دات 2 یا بالاتر (VS2005 یا بالاتر) بهترین کار اینه که از کتابخونه PersianCalendar در فضای نام System.Globalization.PersianCalendar استفاده کنی به این شکل اطمینان داری که تو نسخه های بعدی دات نت حتما برنه ات به خوبی کار میکنه ، مشکل تبدیلات سالهای کبیسه رو نداره ، از لحاظ سرعت خوبه

من تو کد برنامه ام یه کلاس نوشتم که با کمک این کتابخونه تبدیلات تاریخ رو انجام میده :




Public Class CLSCalendar

Function Shamsi2Miladi(ByVal DateParam As String) As Date
Dim DateTemp As New Date
DateParam = Trim(DateParam)
Dim Y As Short = CInt(Left(DateParam, InStr(DateParam, "/") - 1))
Dim M As Short = CInt(Mid(DateParam, InStr(DateParam, "/") + 1, InStrRev(DateParam, "/") - InStr(DateParam, "/") - 1))
Dim D As Integer = CInt(Mid(DateParam, InStrRev(DateParam, "/") + 1))

Dim pc As New System.Globalization.PersianCalendar
DateTemp = pc.ToDateTime(Y, M, D, 1, 1, 1, 1)

Return DateTemp
End Function

Public Function Miladi2Shamsi(ByVal miladi As Date) As String
Dim temp As String = ""
Dim a As New System.Globalization.PersianCalendar
temp = a.GetYear(miladi).ToString & "/"
If a.GetMonth(miladi) > 10 Then
temp &= a.GetMonth(miladi).ToString
Else
temp &= "0" & a.GetMonth(miladi).ToString
End If
temp &= "/"
If a.GetDayOfMonth(miladi) > 10 Then
temp &= a.GetDayOfMonth(miladi).ToString
Else
temp &= "0" & a.GetDayOfMonth(miladi).ToString
End If
Return temp
End Function

End Class




تغییر فورمتش به فومت دلخواهت هم که مثل آب خوردنه !!!

Mr.Amateur
پنج شنبه 16 اسفند 1386, 11:46 صبح
درسته VB6 هست ولی وقتی با VS 2005 بازش کردم خودش تبدیل به VB.NET کرد
من فقط نیاز به ماژولش داشتم واسه استفاده تو برنامم که بدون هیچ مشکلی کار می کنه

در مورد کتابخانه PersianCalendar یکم توضیح بیشتر همراه یه مثال می دید؟

ببینید هدف من اینه که تاریخ سیستم رو بگیره (یعنی ورودیش تاریخ سیستم باشه
) و تبدیل به شمسی بکنه تا من بتونم جاهای مختلف برنامه ازش استفاده کنم و با فرمت Date تو Access ذخیره کنم و... مثل همون برامه ایی که معرفی کردم

linux
پنج شنبه 16 اسفند 1386, 14:21 عصر
من از این برنامه برای تبدیل تاریخ میلادی به شمسی استفاده کردم(تبدیل تاریخ جاری سیستم و استفاده از اون در برنامه)
http://barnamenevis.org/forum/attachment.php?attachmentid=11846&d=1193502997

اما یه مشکلی هست
این برنامه تاریخ میلادی رو به شمسی و به صورت "رر/م م/س س" تبدیل می کنه
چون تاریخ تبدیل شده با 13 یا 14 شروع نمی شه وقتی می خوام یک رکورد از نوع Date رو به جدول اضافه کنم ابتدای سال 19 اضافه می کنه
مثلآ به جای 1386/12/16 مقدار 1986/12/16 رو ذخیره می کنه

من نتونستم برنامه رو به این صورتی که می خواستم تغییر بدم
از دوستانی که می تونن این برنامه رو به این صورت تغییر بدن کمک می خوام
ممنون
خیلی دوست دارم نحوه کار مغز شما را ببینم،شما چی فکر کردی پیش خودت که می خواهی یک متغیر از نوع رشته که تاریخ شمسی را نشان می دهد را تبدیل به یک متغیر از نوع دابل کنی که تقویم میلادی را نگه می دارد.
یا این تاریخ ها را در یک فیلد از نوع nvarchar بریز یا این تاریخ را تبدیل کن به میلادی و در فیلد date ذخیره کن

Mr.Amateur
پنج شنبه 16 اسفند 1386, 15:29 عصر
زیاد به خودت فشار نیار جناب مغز شناس!
شما مغز خودت رو Debugging کنی خیلی هنر کردی!

من با استفاده از همون ماژول تاریخ میلادی سیستم رو به شمسی تبدیل کردم و در یک فیلد از نوع Date/Time در یک جدول در Access ذخیره کردم
فقط مشکل من اون 13 یا 14 اول تاریخ شمسی هست

حالا جناب مغز شناس من نمی دونم چطوری این مقدار رشته ایی تاریخ شمسی در فیلدی از نوع Date/Time از نوع دابل ذخیره شده!

راستی جناب مغز شناس ظاهرآ نوع nvarchar در Access موجود نیست!

linux
پنج شنبه 16 اسفند 1386, 17:06 عصر
زیاد به خودت فشار نیار جناب مغز شناس!
شما مغز خودت رو Debugging کنی خیلی هنر کردی!

من با استفاده از همون ماژول تاریخ میلادی سیستم رو به شمسی تبدیل کردم و در یک فیلد از نوع Date/Time در یک جدول در Access ذخیره کردم
فقط مشکل من اون 13 یا 14 اول تاریخ شمسی هست

حالا جناب مغز شناس من نمی دونم چطوری این مقدار رشته ایی تاریخ شمسی در فیلدی از نوع Date/Time از نوع دابل ذخیره شده!

راستی جناب مغز شناس ظاهرآ نوع nvarchar در Access موجود نیست!
اکسس را با توجه مشکلاتی که داره بگذار کنار از sql server استفاده کن حالا یا اکسپرس ادیشن یا کامپکت ادیشن، کامپکت ادیشن در حدود 3 مگابایت هست. که احتمالا تمام نیازهای شما را برآورده خواهد کرد.
نوع date/time یا datetime دراصل یک عدد دابل هست که از 8 بایت تشکیل شده که 4 بایت اول نماینده روزهای گذشته از مبدا تاریخ که در اکسس احتمالا 1/1/1900 یا یک روز قبلش هست، 4 بایت بعدی هم نماینده زمان گذشته از نیمه شب هست که بصورت میلی ثانیه های گذشته از نیمه شب ذخیره میشه.
حالا وقتی شما می خواهید تاریخ 86/12/13 را در این مقدار قراردهید این مقدار به عنوان تاریخ میلادی فرض می شود و سیستم موقع تبدیل 19 را به آن اضافه می گردد.
یعنی سال 1386 تبدیل میشه به سال 1986 میلادی،تازه بعضی از روزها را حتما از شما ایراد خواهد گرفت یعنی شما نمی توانید تاریخ 86/04/31 را در این متغیر ذخیره کنید چرا که ماه 4 از تقویم میلادی بیشتر 30 روز ندارد.

اگر تونستی مطالب بالا را بفهمی شاید یک روزی خوب شدی.

saman_itc
پنج شنبه 16 اسفند 1386, 17:23 عصر
جناب ParsaNM این lib شما برای دلفی هست من برای VB.NET می خوام!

آقای saman_itc من قبلآ سرچ کردم و اون تاپیک رو هم دیدم
از زحماتتون برای اون برنامه ممنون
البته برنامتون یه مقدار پیچیدگیش زیاده (البته از نظر من به عنوان یه تازه کار)
اما تا اونجایی که من متوجه شدم برنامه شما تاریخ رو به فرمت String در جدول ذخیره می کنه نه Date

برنامه ایی که من معرفی کردم تاریخ جاری سیستم رو به شمسی تبدیل می کنه و می تونیم اون رو به فرمت Date در Access ذخیره کنیم
و ما می تونیم در Queryها به فرمت Date باهاش رفتار کنیم نه String
تنها مشکلش اضافه نکردن 13 یا 14 به اول تاریخ هست

اگه می تونید یه نگاه به برنامه بندازید
ممنون می شم

منتظر راهنمایی دوستان هستم
هر وقت خواستیم می تونیم به Date تبدیلش کنی و هر نوع استفاده ازش بکنی عزیزم

linux
پنج شنبه 16 اسفند 1386, 17:46 عصر
هر وقت خواستیم می تونیم به Date تبدیلش کنی و هر نوع استفاده ازش بکنی عزیزم
:) من در عجبم که شما ها از رو چه حساب کتابی رشته ای که توش تاریخ شمسی نمایش داده شده بصورت یک متغیر date تبدیل می کنید و ازش استفاده می کنید؟

saman_itc
پنج شنبه 16 اسفند 1386, 22:09 عصر
:) من در عجبم که شما ها از رو چه حساب کتابی رشته ای که توش تاریخ شمسی نمایش داده شده بصورت یک متغیر date تبدیل می کنید و ازش استفاده می کنید؟
این کارو به سختی انجام میدیم
بدون تبدیل هم میشه با یه خورده فکرکردن کارای خودمون با رشته هم انجام بدیم.میتونید برید کد هاشو نگاه کنید.

linux
پنج شنبه 16 اسفند 1386, 23:30 عصر
این کارو به سختی انجام میدیم
بدون تبدیل هم میشه با یه خورده فکرکردن کارای خودمون با رشته هم انجام بدیم.میتونید برید کد هاشو نگاه کنید.
این کار شما کاملا اشتباه هست اگر تقویم میلادی را نگاه کنید متوجه می شوید.کار کردن با رشته هم برای عملیات بر روی تقویم شمسی هم از دیگر اشتباهات بزرگ هست.
میشه برای من مشخص کنید که چطوری یک تاریخ شمسی مثل 86/04/31 را در یک متغیر از نوع datetime قرار می دهید؟ راه حل این ماجرا به این صورت است که یک دیتاتایپ جدید تعریف کنید یا یک کلاس بنویسید که تاریخ ها را به صورت datetime در دیتابیس ذخیره کند و بصورت شمسی نمایش دهد. با این کار می توانید از تمام امکانات نوع datetime هم استفاده کنید.

علیرضا مداح
جمعه 17 اسفند 1386, 15:24 عصر
سلام ،
کتابخانه های ارائه شده در دات نت فریم ورک 2.0 برای انجام محاسبات بر روی تاریخ شمسی ، دارای مشکل بوده و عملا" قابل اطمینان نیست و نمیتوان در برنامه های تجازی از آنها استفاده نمود، استفاده از کتابخانه کلاس اصلاح شده زیر که همراه با امکانات دیگری نیز میباشد را به شما توضیه میکنم :
http://www.codeproject.com/KB/selection/FarsiLibrary.aspx

linux
جمعه 17 اسفند 1386, 19:11 عصر
سلام ،
کتابخانه های ارائه شده در دات نت فریم ورک 2.0 برای انجام محاسبات بر روی تاریخ شمسی ، دارای مشکل بوده و عملا" قابل اطمینان نیست و نمیتوان در برنامه های تجازی از آنها استفاده نمود، استفاده از کتابخانه کلاس اصلاح شده زیر که همراه با امکانات دیگری نیز میباشد را به شما توضیه میکنم :
http://www.codeproject.com/KB/selection/FarsiLibrary.aspx
رو چه حسابی این حرف را میزنی و چرا؟!
این کتابخانه تمام روزهای پنجشنبه را سه شنبه بر می گرداند و در تبدیل 20/03/2025و 20/03/2058 و احتمالا چند تا از این سالهای دیگه،
به مشکل بر می خورد. به جز این دو اشکال در سایر موارد از سال 1925 تا سال 2025 هیچ فرقی بین این دو نیست.
لطفا با دادن اطلاعات نادرست بقیه را گمراه نکنید.


Imports FarsiLibrary.Utils
Module Module1
Sub Main()
Dim d As DateTime = "1925-1-1"
For i AsDouble = 1 To 40000
Dim s AsString = ""
s = String.Format("{0}::{1}--->{2}", d.ToLongDateString, toPD(d), toPD_farsiLib(d))
If toPD(d) <> toPD_farsiLib(d) Then
s = s & " ***Error Detected"
Console.WriteLine(s)
EndIf
d = d.AddDays(1)
Next
Console.ReadKey()
EndSub
PublicFunction toPD(ByVal d As DateTime) AsString''microsoft persiancalendar class
Dim s AsString = ""
Dim dc AsNew Globalization.PersianCalendar
s = String.Format("{0}/{1:00}/{2:00}:{3}", dc.GetYear(d), dc.GetMonth(d), dc.GetDayOfMonth(d), dc.GetDayOfWeek(d))
Return s
EndFunction
PublicFunction toPD_farsiLib(ByVal d As DateTime) AsString'farsiLib class
Dim s AsString = ""
s = String.Format("{0}/{1:00}/{2:00}:{3}", _
PersianDateConverter.ToPersianDate(d).Year, _
PersianDateConverter.ToPersianDate(d).Month, _
PersianDateConverter.ToPersianDate(d).Day, _
PersianDateConverter.ToPersianDate(d).DayOfWeek)
Return s
EndFunction
EndModule