PDA

View Full Version : چند تا سوال در رابطه با تقویم هجری شمسی



na3er-faraji
یک شنبه 30 مهر 1385, 13:38 عصر
من با استفاده از کلاس persiancalendar تاریخ فارسی رو بدست می یارم
حالا چند تا سوال واسم پیش اومده
1)چطوری میتونیم یک تاریخ هجری شمسی رو به میلادی تبدیل کنیم
2)چطوری میشه دو تا تاریخ فارسی رو با هم مقایسه کرد . یعنی اختلاف دو تاریخ رو بر حسب روز بدست آورد ( البته خودم یه تابع واسش نوشتم . ولی میخاستم ببینم این امکان تو خود دات نت هست یا نه)
3)چطوری میشه تو یک متغیر از نوع Date زمان هجری شمسی رو ذخیره کرد . چون همون طور که میدونید این متغیر برای تقویم میلادی درست شده و مثلا ماه دوم میلادی 28 روزی است و نمیشه عدد 29 رو به عنوان روز تو اون ذخیره کرد و مشکل پیش میاد و من مجبور شدم تاریخ های هجری شمسی رو به string تبدیل کنم و همین باعث تولید کلی کد اضافه میشه

linux
یک شنبه 30 مهر 1385, 15:24 عصر
من با استفاده از کلاس persiancalendar تاریخ فارسی رو بدست می یارم
حالا چند تا سوال واسم پیش اومده
1)چطوری میتونیم یک تاریخ هجری شمسی رو به میلادی تبدیل کنیم
2)چطوری میشه دو تا تاریخ فارسی رو با هم مقایسه کرد . یعنی اختلاف دو تاریخ رو بر حسب روز بدست آورد ( البته خودم یه تابع واسش نوشتم . ولی میخاستم ببینم این امکان تو خود دات نت هست یا نه)
3)چطوری میشه تو یک متغیر از نوع Date زمان هجری شمسی رو ذخیره کرد . چون همون طور که میدونید این متغیر برای تقویم میلادی درست شده و مثلا ماه دوم میلادی 28 روزی است و نمیشه عدد 29 رو به عنوان روز تو اون ذخیره کرد و مشکل پیش میاد و من مجبور شدم تاریخ های هجری شمسی رو به string تبدیل کنم و همین باعث تولید کلی کد اضافه میشه

' This example demonstrates the members of the PersianCalendar class.
Imports System
Imports System.Globalization
Class Sample
Public Shared Sub Main()
'--------------------------------------------------------------------------------
' Get today's date.
'--------------------------------------------------------------------------------
Console.WriteLine(vbCrLf & _
"................. Today ..........................." & vbCrLf)
Dim jc As New PersianCalendar()
Dim thisDate As DateTime = DateTime.Now
' Use thisDate twice to display the name of the day and the current date.
Console.WriteLine("Today is {0:dddd}, {0}", thisDate)
'--------------------------------------------------------------------------------
' Fields
'--------------------------------------------------------------------------------
Console.WriteLine(vbCrLf & _
"............... Fields ............................" & vbCrLf)
Console.WriteLine("PersianEra = {0}", PersianCalendar.PersianEra)
'--------------------------------------------------------------------------------
' Properties
'--------------------------------------------------------------------------------
Console.WriteLine(vbCrLf & _
"............... Properties ........................." & vbCrLf)
Console.Write("Eras:")
Dim era As Integer
For Each era In jc.Eras
Console.WriteLine(" era = {0}", era)
Next era
'--------------------------------------------------------------------------------
Console.WriteLine("MaxSupportedDateTime = {0:G}", jc.MaxSupportedDateTime)
'--------------------------------------------------------------------------------
Console.WriteLine("MinSupportedDateTime = {0:G}", jc.MinSupportedDateTime)
'--------------------------------------------------------------------------------
Console.WriteLine("TwoDigitYearMax = {0}", jc.TwoDigitYearMax)
'--------------------------------------------------------------------------------
' Methods
'--------------------------------------------------------------------------------
Console.WriteLine(vbCrLf & _
"................ Methods ..........................." & vbCrLf)
' Create a date six months in the future and another date six months in the past.
Dim plus6Months As DateTime = jc.AddMonths(thisDate, 6)
Dim minus6Months As DateTime = jc.AddMonths(thisDate, -6)
Console.WriteLine("AddMonths: thisDate + 6 months = {0}", plus6Months)
Console.WriteLine(" thisDate - 6 months = {0}", minus6Months)
'--------------------------------------------------------------------------------
' Create a date five years in the future and another date three years in the past.

Dim plus5Years As DateTime = jc.AddYears(thisDate, 5)
Dim minus3Years As DateTime = jc.AddYears(thisDate, -3)
Console.WriteLine("AddYears: thisDate + 5 years = {0}", plus5Years)
Console.WriteLine(" thisDate - 3 years = {0}", minus3Years)
'--------------------------------------------------------------------------------
Console.WriteLine("GetDayOfMonth: month = {0}", jc.GetDayOfMonth(thisDate))
'--------------------------------------------------------------------------------
Console.WriteLine("GetDayOfWeek: day = {0}", jc.GetDayOfWeek(thisDate))
'--------------------------------------------------------------------------------
Console.WriteLine("GetDayOfYear: day = {0}", jc.GetDayOfYear(thisDate))
'--------------------------------------------------------------------------------
Console.WriteLine("GetDaysInMonth: days = {0}", _
jc.GetDaysInMonth(thisDate.Year, _
thisDate.Month, _
PersianCalendar.PersianEra))
'--------------------------------------------------------------------------------
Console.WriteLine("GetDaysInYear: days = {0}", _
jc.GetDaysInYear(thisDate.Year, PersianCalendar.PersianEra))
'--------------------------------------------------------------------------------
Console.WriteLine("GetEra: era = {0}", jc.GetEra(thisDate))
'--------------------------------------------------------------------------------
Console.WriteLine("GetLeapMonth: leap month (if any) = {0}", _
jc.GetLeapMonth(thisDate.Year, PersianCalendar.PersianEra))
'--------------------------------------------------------------------------------
Console.WriteLine("GetMonth: month = {0}", jc.GetMonth(thisDate))
'--------------------------------------------------------------------------------
Console.WriteLine("GetMonthsInYear: months in a year = {0}", _
jc.GetMonthsInYear(thisDate.Year, PersianCalendar.PersianEra))
'--------------------------------------------------------------------------------
Console.WriteLine("GetYear: year = {0}", jc.GetYear(thisDate))
'--------------------------------------------------------------------------------
Console.WriteLine("IsLeapDay: This is a leap day = {0}", _
jc.IsLeapDay(thisDate.Year, _
thisDate.Month, thisDate.Day, _
PersianCalendar.PersianEra))
'--------------------------------------------------------------------------------
Console.WriteLine("IsLeapMonth: This is a leap month = {0}", _
jc.IsLeapMonth(thisDate.Year, _
thisDate.Month, _
PersianCalendar.PersianEra))
'--------------------------------------------------------------------------------
Console.WriteLine("IsLeapYear: 1370 is a leap year = {0}", _
jc.IsLeapYear(1370, PersianCalendar.PersianEra))
'--------------------------------------------------------------------------------
' Create a date in the Gregorian calendar and the Persian calendar. The date is
' the current date and an arbitrary time of 20 hours, 30 minutes, and 15.5
' seconds.
Dim dt1 As New DateTime(thisDate.Year, thisDate.Month, thisDate.Day, _
20, 30, 15, 500)
Dim dt2 As DateTime = jc.ToDateTime(thisDate.Year, thisDate.Month, _
thisDate.Day, _
20, 30, 15, 500, _
PersianCalendar.PersianEra)
Console.WriteLine("ToDateTime:")
Console.WriteLine(" Gregorian calendar: {0}", dt1)
Console.WriteLine(" Persian calendar: {0}", dt2)
'--------------------------------------------------------------------------------
' Get the 4-digit year for a year whose last two digits are 99. The 4-digit year
' depends on the current value of the TwoDigitYearMax property.
Console.WriteLine("ToFourDigitYear:")
Console.WriteLine(" If TwoDigitYearMax = {0}, ToFourDigitYear(99) = {1}", _
jc.TwoDigitYearMax, jc.ToFourDigitYear(99))
jc.TwoDigitYearMax = thisDate.Year
Console.WriteLine(" If TwoDigitYearMax = {0}, ToFourDigitYear(99) = {1}", _
jc.TwoDigitYearMax, jc.ToFourDigitYear(99))
End Sub 'Main
End Class 'Sample
'
'This code example produces the following results:
'
'................. Today ...........................
'
'Today is Friday, 8/20/2004 1:08:37 PM
'
'............... Fields .............................
'
'PersianEra = 1
'
'............... Properties .........................
'
'Eras: era = 1
'MaxSupportedDateTime = 12/31/9999 11:59:59 PM
'MinSupportedDateTime = 3/21/0622 12:00:00 AM
'TwoDigitYearMax = 1410
'
'................ Methods ...........................
'
'AddMonths: thisDate + 6 months = 2/18/2005 1:08:37 PM
' thisDate - 6 months = 2/19/2004 1:08:37 PM
'AddYears: thisDate + 5 years = 8/21/2009 1:08:37 PM
' thisDate - 3 years = 8/21/2001 1:08:37 PM
'GetDayOfMonth: month = 30
'GetDayOfWeek: day = Friday
'GetDayOfYear: day = 154
'GetDaysInMonth: days = 30
'GetDaysInYear: days = 365
'GetEra: era = 1
'GetLeapMonth: leap month (if any) = 0
'GetMonth: month = 5
'GetMonthsInYear: months in a year = 12
'GetYear: year = 1383
'IsLeapDay: This is a leap day = False
'IsLeapMonth: This is a leap month = False
'IsLeapYear: 1370 is a leap year = True
'ToDateTime:
' Gregorian calendar: 8/20/2004 8:30:15 PM
' Persian calendar: 11/11/2625 8:30:15 PM
'ToFourDigitYear:
' If TwoDigitYearMax = 1410, ToFourDigitYear(99) = 1399
' If TwoDigitYearMax = 2004, ToFourDigitYear(99) = 1999
'
مثال خود msdn

na3er-faraji
یک شنبه 30 مهر 1385, 17:21 عصر
ببخشید مثل اینکه شما اصلا سوال منو نخونید . این کدی رو که شما دادید میاد به یک تاریخ میلادی روز یا ماه اضافه میکنه و اگه ورودی هجری شمسی بدی خروجی اشتباهه . جواب سوال یک و سه رو کسی بلد نیست؟

linux
دوشنبه 01 آبان 1385, 00:11 صبح
چرا تو msdn را نگاه نمی کنی؟


Dim pc As New System.Globalization.PersianCalendar
Dim d As DateTime
d = pc.ToDateTime(1385, 8, 1, 0, 0, 0, 0, 0)
MsgBox(d.ToString)


در .نت2 متغیر datetime یک متغیر از نوع عدد صحیح 64 بایتی هست که تیکهای گذشته از مبدا تاریخ که 01/01/0001 باشه را در خودش ذخیره میکنه


Dim d2 As DateTime
d2 = DateTime.MinValue.AddDays(1)
MsgBox(Format(d2.ToBinary, "#,#"))
MsgBox(d2.ToString)

هر یک ثانیه هم ده میلیون تیک هست. یعنی بر خلاف چیزی که فکر می کنی تکست بصورت
مثلا 2006/10/22 ذخیره نمیشه بلکه تبدیل می شه به یک عدد 64 بیتی و آن ذخیره میشود

na3er-faraji
دوشنبه 01 آبان 1385, 09:14 صبح
واسه اینکه به msdn دسترسی ندارم . در مورد تبدیل تاریخ هجری شمسی به میلادی هم اگه راهنمایی کنید ممنون میشم

linux
دوشنبه 01 آبان 1385, 14:07 عصر
msdn یک دی وی دی هست که می تونی براحتی تهیه کنی یا اصلا بری سایت ماکروسافت آنجا ببینی!
اگر مثال قبل را با دقت می خواندی نحوه تبدیل شمسی به میلادی را گفته ام.

na3er-faraji
سه شنبه 02 آبان 1385, 15:15 عصر
دوست عزیز ممنون . شمسی به میلادی رو یاد گرفتم . حالا میشه بگید چطوری میشه دو تا تاریخ شمسی رو با هم مقایسه کرد

taheri-ali
شنبه 06 آبان 1385, 01:24 صبح
من یه dll دارم اگه به دردتون می خوره دانلود کنید

na3er-faraji
شنبه 06 آبان 1385, 06:00 صبح
ممنون دوست عزیز مشکل من حل شد . اینو واسه اونایی مینویسم که شاید بعدا بیان اینجا . برای مقایسه دو تا تاریخ کافیه اونا رو به میلادی تبدیل کنید و بعد با تابع DateDiff اونا رو با هم مقایسه کنید

i_naderpour
یک شنبه 14 آبان 1385, 01:50 صبح
نیازی به این کار هم نیست دوست عزیز این dll که دوستمون گذاشته این کار رو انجام میده

na3er-faraji
دوشنبه 15 آبان 1385, 21:52 عصر
خوب نباید همیشه هم مشکل رو با dll حل کرد