PDA

View Full Version : سوال: خطا در تایع DateTime شمسی برای افزودن روز به تاریخ در برخی از تاریخ ها



nima_far
جمعه 30 اردیبهشت 1401, 23:32 عصر
با سلام و احترام

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



Dim mypersia As New System.Globalization.PersianCalendar()

my_lbl.text = mypersia.AddDays(Date2Persian_Str(DateTime.Now).To String, -180).ToString("yyyy/MM/dd")



و کد تابع Date2Persian_Str :



Public Function Date2Persian_Str(dt As System.DateTime) As String
Dim FarsiDate As New System.Globalization.PersianCalendar()
Dim Day As String = FarsiDate.GetDayOfMonth(dt).ToString()
Dim Month As String = FarsiDate.GetMonth(dt).ToString()
Dim Year As String = FarsiDate.GetYear(dt).ToString()
If Day.Length = 1 Then
Day = "0" & Day
End If
If Month.Length = 1 Then
Month = "0" & Month
End If
Return (Year & "/" & Month & "/" & Day)
End Function




تا به امروز این کد بدون مشکل اجرا شده ولی امروز متوجه شدم در برخی از تاریخ ها (مثل 1401/02/30) اگر تنظیمات Date & Time سرور برروی شمسی نباشه، اجرای این کد خطای زیر را نمایش می دهد.


Conversion from string "1401/02/29" to type 'Date' is not valid


از اونجایی که هاستینگ حاضر به تغییر تنظیمات به شمسی نیست ممنون میشم راهنمایی بفرمایید چطور میشه این مشکل رو برطرف کرد. تشکر

ROSTAM2
شنبه 31 اردیبهشت 1401, 10:57 صبح
سلام.
خطایی که ارسال شده، خطای تبدیل تاریخ از رشته به Date هستش بنظر من Date فقط مقدار میلادی رو می گیره برای همین این خطا رو ارسال کرد بجای اون تاریخ شمسی بصورت دستی یک تاریخ میلادی بصورت رشته تایپ کن ببین خطا ارسال می شه یا نه. تا مطمئن شیم

mazoolagh
شنبه 31 اردیبهشت 1401, 11:01 صبح
سلام و روز خوش

کد رو چک نکردم ولی همین که گفتین بعضی از تاریخ ها مثل 1401/02/29 مشخص هست که کد تاریخ رو میلادی در نظر گرفته،
چون ماه فوریه 28 روزه است و در سالهای کبیسه 29 روزه میشه.

در ضمن اهمیتی نداره که location کامپیوتری که کد رو اجرا میکنه چی باشه (مگر در فرمت پیشفرض تاریخ و ساعت و پول و ...) ،
شما از persiancalendar استفاده میکنین.

nima_far
شنبه 31 اردیبهشت 1401, 11:39 صبح
سلام.
خطایی که ارسال شده، خطای تبدیل تاریخ از رشته به Date هستش بنظر من Date فقط مقدار میلادی رو می گیره برای همین این خطا رو ارسال کرد بجای اون تاریخ شمسی بصورت دستی یک تاریخ میلادی بصورت رشته تایپ کن ببین خطا ارسال می شه یا نه. تا مطمئن شیم

درود بر شما، با تاریخ میلادی مشکلی نداره و خروجی هم به میلادی نمایش داده میشه. با توجه به نکته ای که فرمودین کد رو به شکل زیر تغییر دادم و مشکل حل شد.
سپاس از لطف شما



lbl_date.Text = Date2Persian_Str(mypersia.AddMonths(DateTime.Now, -6))

nima_far
شنبه 31 اردیبهشت 1401, 11:42 صبح
سلام و روز خوش

کد رو چک نکردم ولی همین که گفتین بعضی از تاریخ ها مثل 1401/02/29 مشخص هست که کد تاریخ رو میلادی در نظر گرفته،
چون ماه فوریه 28 روزه است و در سالهای کبیسه 29 روزه میشه.

در ضمن اهمیتی نداره که location کامپیوتری که کد رو اجرا میکنه چی باشه (مگر در فرمت پیشفرض تاریخ و ساعت و پول و ...) ،
شما از persiancalendar استفاده میکنین.

درود، از اونجایی که همین کد بدون مشکل و خطا تاریخ 1401/02/29 رو در لوکال کانورت میکنه، به همین علت حدس زدم بخاطر تفاوت تنظیمات تاریخ و ساعت سرور این مشکل به وجود اومده باشه.

تشکر از شما

Mahmoud.Afrad
دوشنبه 02 خرداد 1401, 13:59 عصر
مقدار بازگشتی متد adddays از نوع datetime هست که باید از متد تبدیلی که نوشتید به جای tostring استفاده کنید.