PDA

View Full Version : ذخيره كردن تاريخ شمسي به صورت datetime



mojtabadj
سه شنبه 14 مهر 1388, 12:42 عصر
سلام دوستان

من بايد تاريخ شمسي رو بايد به صورت datetime ذخيره كنم چون با روز ها سروكار دارم

براي اينكار بايد چيكار كنم؟

يا اگر براي محاسبه روزها راهي ديگري هست من رو راهنمايي كنيد

با تشكر

__H2__
سه شنبه 14 مهر 1388, 14:08 عصر
سلام
کلاً برای تبدیل تاریخ شمسی و میلادی در دات نت کلاس کامل و خوبی به نام System.Globalization.PersianCalendar داریم که کافی است از آن استفاده کنید.

اگر همین سایت را روی نام مذکور جستجو کنید تاپیکهای زیادی در مورد نحوه استفاده از کلاس فوق خواهید یافت.
پیشنهاد میکنم حتماً برای تبدیل تاریخ از کلاس فوق استفاده کنید و خودتان دستی کدی ننویسید.

موفق باشید.

anooshiran
سه شنبه 14 مهر 1388, 17:45 عصر
سلام دوست عزيز

من اصرارت را براي ذخيره تاريخ شمسي به صورت datetime متوجه نمي شم. بهتر اين نيست كه تاريخ رو به صورت nvarchar ذخيره كني و به صورت شمسي . حال هرگاه بخواهي روز شماري هم كني با يك تبديل ساده مي تواني اين كار را انجام دهي.

mojtabadj
سه شنبه 14 مهر 1388, 19:33 عصر
سلام
کلاً برای تبدیل تاریخ شمسی و میلادی در دات نت کلاس کامل و خوبی به نام System.Globalization.PersianCalendar داریم که کافی است از آن استفاده کنید.

اگر همین سایت را روی نام مذکور جستجو کنید تاپیکهای زیادی در مورد نحوه استفاده از کلاس فوق خواهید یافت.
پیشنهاد میکنم حتماً برای تبدیل تاریخ از کلاس فوق استفاده کنید و خودتان دستی کدی ننویسید.

موفق باشید.

حالا اگه از اين كلاس استفاده كنم بازم بايد به صورت datetime تو بانك ذخيره كنم يا به

صورت string ؟

مشكله من فقط محاسبه روزهاست!

اگه ميشه يه مثال براي محاسبه روز با اين كلاس بزنيد

با تشكر

__H2__
سه شنبه 14 مهر 1388, 21:28 عصر
سلام


حالا اگه از اين كلاس استفاده كنم بازم بايد به صورت datetime تو بانك ذخيره كنم يا به صورت string ؟


پیشنهاد من همیشه و همواره و جدا از مشکل شما و بحث تاپیک فقط و فقط ذخیره تاریخ به صورت میلادی و در فیلد smalldatetime و datetime است.
تا حالا هم پروژه های مختلفی نوشتم و در همه موارد و همیشه از همین دو فیلد استفاده کردم و تا حالا هیچ کجا هم مشکلی نداشتم.
(یعنی تا حالا حتی یک پروژه نداشتم که فیلد تاریخ متنی بوده باشد.)

و در اصل دقیقاً برعکس جناب anooshiran اصرار بر String بودن را درک نمیکنم و نمیفهمم سایر دوستان و همکاران عزیز برنامه نویس تاریخ بیچاره را بجای تارخ، متنی قرار میدهند؟؟؟؟؟
- String حجم بیشتری در دیتابیس میگیرد.
- دستورات و توابع آماده خود SQL را بی اثر میکند.
- در فیلد String میشود هر چیزی وارد شود و خود SQLServer هیچ محدودیتی ایجاد نمیکند و فقط باید با لایه برنامه محدودیت ایجاد کرد.
- فیلد String باید ریتم مشخصی داشته باشد مثلاً 4 رقم برای سال و دو رقم برای ماه و دو رقم برای روز و نمیتوان از این چارت خارج شد و مثلاً نمایش سفارشی هر تاریخ در جاهای مختلف ... (مثل سه شنبه 14 فروردین ماه 1388)
- امکان محاسباتی درون برنامه ای روی فیلد به شدت کاهش می یابد و مثلاً به سادگی فیلد میلادی نمیتوان طول عمر یک نفر و ...
و...
و...

برای نمایش تاریخ میلادی به صورت شمسی و گرفتن شمسی و تبدیل هم برای فرمهای باز از کنترلر زیر استفاده میکنم:
http://support.h02.ir/fwlink/?LinkId=1002976157

و برای جداول و DataGridView هم از کامپونت زیر:
http://support.h02.ir/fwlink/?LinkId=1002435777

یعنی فقط در کنترلر و نمایه دیداری از کنترلرهای فوق استفاده میکنم و بعد دیگر در کل داخل برنامه کار بر اساس تاریخ میلادی انجام میشود...
(در همین سایت دوستان دیگر هم کنترلرهای مفیدی برای کار با تاریخ ارائه کرده اند و میتواند تسریع کننده باشد.)

ساختاری به نام IrDate هم دارم که اجازه فرمت تاریخ شمسی با قالب دلخواه را میدهد مثلاً:


Dim dt = Date.Now

Dim str As String = (New GHNet.IrDate(dt)).ToString("d MMMM yyyy ساعت hh:mm")



یا


Dim str2 As String = GHNet.IrDate.Now.ToString("d MMMM yyyy ساعت hh:mm")


که مثلاً حاصل عبارت فوق میشود "14 مهر 1388 ساعت 09:41" ...
با تغییر رشته فرمت میتوانم هر خروجی دلخواهی ایجاد کنم، حتی میتوانم گزینه ای در پنجره تنظیمات برنامه مستقر کنم تا خود کاربر فرمت نمایشی تاریخ در جاهای مختلف برنامه را مشخص کند.

اینها را دارم میگویم و زیاده گویی میکنم که فقط نماد و شمایی باشد از اینکه بدانید چرا میگویم اصرار بر String را درک نمیکنم... فقط میخواهم سادگی کاربا فیلدهای تاریخی را درک کنید، انشاا.... (!)


مشكله من فقط محاسبه روزهاست!
لطفاً دقیق تر بفرمئید مشکلتان چیست و چی محاسبه ای میخواهید انجام دهید.
"محاسبه روزها" عبارت چندان کاملی نیست.
آیا میخواهید دو تاریخ را کم کنید و اختلاف را به روز به دست آورید؟
آیا میخواهید یک تاریخ را به تعداد روزی مشخص افزایش دهید؟
آیا ... ؟
؟

بحرحال اگر فیلد شما میلادی باشد با احتصاب وجود کلاس System.Globalization.PersianCalendar مشکل و محدودیتی محاسبه تاریخی نخواهید داشت.

موفق باشید.

mojtabadj
سه شنبه 14 مهر 1388, 22:08 عصر
سلام عزيز

درست گفتيد ميخوا م 2 تاريخ رو كم كنم و اختلاف بين روز ها رو بدست بيارم!

حالا بايد چيكار كنم ؟

__H2__
چهارشنبه 15 مهر 1388, 00:51 صبح
سلام

درست گفتيد ميخوا م 2 تاريخ رو كم كنم و اختلاف بين روز ها رو بدست بيارم!
تفریق دو تاریخ میلادی برای استخراج روز با تفریق شمسی تفاوتی ندارد و حاصل هموراه و قطعی برابر خواهد بود. (با تمام کبیسه و بدون کبیسه و مخلفات !)

نتیجتاً کافی است پس از تبدیل تاریخ دو تاریخ را خیلی ساده تفریق کنید و حاصل را با TotalDays به تعداد روز تبدیل کنید...

یعنی سرجمع و کلاً چیزی شبیه این:


Dim pc As New System.Globalization.PersianCalendar()

Dim dt1 As Date = pc.ToDateTime(1385, 2, 3, 0, 0, 0, 0)
Dim dt2 As Date = pc.ToDateTime(1350, 4, 5, 0, 0, 0, 0)

Dim days As Integer = CInt((dt1 - dt2).TotalDays)

البته PersianCalendar را میتوانید یکبار در یکجای مشترک New کنید و بارها از ان استفاده کنید.

anooshiran
چهارشنبه 15 مهر 1388, 01:06 صبح
سلام عزيز

درست گفتيد ميخوا م 2 تاريخ رو كم كنم و اختلاف بين روز ها رو بدست بيارم!

حالا بايد چيكار كنم ؟

سلام دوست عزيز

اگر كمي جستحو مي كردي جواب اين سئوال را در سايت پيدا مي كردي. به لينك زير سري بزن و پست 3 را ببين

http://barnamenevis.org/forum/showthread.php?t=180884

mojtabadj
چهارشنبه 15 مهر 1388, 21:14 عصر
سلام

تفریق دو تاریخ میلادی برای استخراج روز با تفریق شمسی تفاوتی ندارد و حاصل هموراه و قطعی برابر خواهد بود. (با تمام کبیسه و بدون کبیسه و مخلفات !)

نتیجتاً کافی است پس از تبدیل تاریخ دو تاریخ را خیلی ساده تفریق کنید و حاصل را با TotalDays به تعداد روز تبدیل کنید...

یعنی سرجمع و کلاً چیزی شبیه این:


Dim pc As New System.Globalization.PersianCalendar()

Dim dt1 As Date = pc.ToDateTime(1385, 2, 3, 0, 0, 0, 0)
Dim dt2 As Date = pc.ToDateTime(1350, 4, 5, 0, 0, 0, 0)

Dim days As Integer = CInt((dt1 - dt2).TotalDays)

البته PersianCalendar را میتوانید یکبار در یکجای مشترک New کنید و بارها از ان استفاده کنید.

سلام

PersianCalendar من اين تابع ToDateTime رو نداره فايلشو براي دانلود نداري بذاري؟:ناراحت:

__H2__
پنج شنبه 16 مهر 1388, 02:15 صبح
سلام

PersianCalendar من اين تابع ToDateTime رو نداره فايلشو براي دانلود نداري بذاري؟
خیلی میبخشید ولی مطلب شما بیشتر به جوک شبیه است!!!
کلاس Globalization.PersianCalendar درون اصلی ترین dll دات نت با نام mscorlib.dll قرار دارد.

در نسخه اولیه 2003 این کلاس وجود نداشت ولی در نسخه 2005 به بعد اضافه شد و شما بحرحال یا VS2003 نصب کردید و کلاس مذکور را ندارید و یا VS2005/2008/2010 را نصب کرده اید و باید کلاس فوق با کل توابعش را داشته باشید.

بدون شک و تردید در نوشتار و تایپ دستورات دقت کافی را نداشته اید و احتمالاً در تعریف متغییر pc مثل فوق دقت نکرده اید و یا شی را New نکرده اید و یا نام متغییر را بین تعریف و New و محل استفاده غلط وارد میکنید.
باصبر و حوصله و دقت بیشتری کدنویسی کنید.

Mohsen6558
پنج شنبه 16 مهر 1388, 10:32 صبح
من پیشنهاد می کنم تاریخ رو بصورت میلادی در همون Date Time ذخیره کنین هر موقع نیاز شد فراخوانی کنین نیاز شد اضافه و کمش کنین و به شمسی تبدیل کنین و نشون بدین
این که شما بخوایین بصورت شمسی ذخیره کنین مشکلی که پیش می آد اینه که روز 31 در هر ماه تعریف نشده است و به مشکل بر می خورین
اینم یه نمونه کد ساده برای تبدیل تاریخ میلادی به شمسی

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a1 As New System.Globalization.PersianCalendar
Dim nowdate As Date = Now
Dim m As String
m = a1.GetYear(Now) & "\"
If Len(a1.GetMonth(Now).ToString) = 1 Then m = m & "0" & a1.GetMonth(Now) Else m = m & a1.GetMonth(Now)
m = m & "\" & "" & a1.GetDayOfMonth(Now)
MsgBox(m)
End Sub
End Class