PDA

View Full Version : تبدیل ناصحیح شمسی به میلادی توسط PersianCalendar



resident
سه شنبه 03 اسفند 1395, 22:20 عصر
سلام. من از تابع زیر برای تبدیل تاریخ شمسی به میلادی استفاده می کنم و 2 سال هست که بدون مشکل داره کار می کنه.


private static System.Globalization.PersianCalendar pc = new System.Globalization.PersianCalendar();
.
.
.
DateTime ConvertedDateTime = pc.ToDateTime(int.Parse(y), int.Parse(m), int.Parse(d), int.Parse(hh), int.Parse(mm), int.Parse(ss), 0);


روی یه سیستم بعد از اینکه ویندوز به 10 تغییر یافت ، نتیحه این فانکشن درست نیست.

اگه من تاریخ 1395/12/03 رو بهش بدم ، تاریخ 12/03/1395 رو به عنوان تاریخ میلادی برمی گردونه.

به نظرتون مشکل چیه؟

Mani_rf
سه شنبه 03 اسفند 1395, 23:12 عصر
سلام. من از تابع زیر برای تبدیل تاریخ شمسی به میلادی استفاده می کنم و 2 سال هست که بدون مشکل داره کار می کنه.


private static System.Globalization.PersianCalendar pc = new System.Globalization.PersianCalendar();
.
.
.
DateTime ConvertedDateTime = pc.ToDateTime(int.Parse(y), int.Parse(m), int.Parse(d), int.Parse(hh), int.Parse(mm), int.Parse(ss), 0);


روی یه سیستم بعد از اینکه ویندوز به 10 تغییر یافت ، نتیحه این فانکشن درست نیست.

اگه من تاریخ 1395/12/03 رو بهش بدم ، تاریخ 12/03/1395 رو به عنوان تاریخ میلادی برمی گردونه.

به نظرتون مشکل چیه؟

مشکل از اونجایی شروع شده که ویندوز 10 تقویم فارسی رو به رسمیت شناخته. وقتی کاربر تقویم ویندوز رو شمسی انتخاب کرده باشه و شما مقدار DateTime.Now رو بخونید بجای این که میلادی به شما بده شمسی برمیگردونه. و این یعنی که کلاس DateTime به صورت پیش فرض داره بر اساس تقویم منطقه ای که ویندوز روش تنظیم شده مقدار ها رو برمیگردونه. اگر میخوای ازش خروجی میلادی بگیری باید بهش منطقه تقویمی رو معرفی کنی و به این صورت استفاده کنی :

ConvertedDateTime.ToString(System.Globalization.Cu ltureInfo.InvariantCulture);

resident
چهارشنبه 04 اسفند 1395, 17:36 عصر
مشکل از اونجایی شروع شده که ویندوز 10 تقویم فارسی رو به رسمیت شناخته. وقتی کاربر تقویم ویندوز رو شمسی انتخاب کرده باشه و شما مقدار DateTime.Now رو بخونید بجای این که میلادی به شما بده شمسی برمیگردونه. و این یعنی که کلاس DateTime به صورت پیش فرض داره بر اساس تقویم منطقه ای که ویندوز روش تنظیم شده مقدار ها رو برمیگردونه. اگر میخوای ازش خروجی میلادی بگیری باید بهش منطقه تقویمی رو معرفی کنی و به این صورت استفاده کنی :

ConvertedDateTime.ToString(System.Globalization.Cu ltureInfo.InvariantCulture);

ممنون. این کد کمک کرد.
یه سوال دیگه:

string xxx = (ConvertedDateTime.ToString(CultureInfo.InvariantC ulture);
dtformatted = String.Format("{0:MM/dd/yyyy}", xxx).Substring(0, 10);


من میخواستم تاریخم با فرمت MM/dd/yyyy باشه. با این دستور فرمت مدنظرمو بهش دادم. حالا میخووام این تاریخ رو (xxx) که به صورت string هست رو به datetime تبدیل کنم که در بانک ذخیرش کنم.
چند تا تابع استفاده کردم اما خطا میداد که فرمت ورودی صحیح نیست. چطور دوباره string رو به datetime تبدیل کنم؟

negar442
چهارشنبه 04 اسفند 1395, 21:12 عصر
چه لزومی داره که تاریخ رو به شکل datetime ذخیره کنید؟

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

Mahmoud.Afrad
پنج شنبه 05 اسفند 1395, 00:00 صبح
ممنون. این کد کمک کرد.
یه سوال دیگه:

string xxx = (ConvertedDateTime.ToString(CultureInfo.InvariantC ulture);
dtformatted = String.Format("{0:MM/dd/yyyy}", xxx).Substring(0, 10);


من میخواستم تاریخم با فرمت MM/dd/yyyy باشه. با این دستور فرمت مدنظرمو بهش دادم. حالا میخووام این تاریخ رو (xxx) که به صورت string هست رو به datetime تبدیل کنم که در بانک ذخیرش کنم.
چند تا تابع استفاده کردم اما خطا میداد که فرمت ورودی صحیح نیست. چطور دوباره string رو به datetime تبدیل کنم؟

طبق پست اول ، شما از طریق PersianCalendar تاریخ شمسی رو به DateTime تبدیل میکنید که همین DateTime رو میتونید در دیتابیس ذخیره کنید. در ویندوز 10 وقتی تنظیمات روی persian ست شده باشه، به طور پیشفرض از Culture فارسی برای نمایش استفاده میشه، ولی برای اینکه تاریخ در یک Culture خاص نمایش داده شود بایست طبق کد Mani_rf (http://barnamenevis.org/member.php?81144-Mani_rf) عمل کنید. پس فقط در جایی که تاریخ رو نمایش میدید باید متد ToString را اصلاح کنید.

resident
پنج شنبه 05 اسفند 1395, 07:57 صبح
چه لزومی داره که تاریخ رو به شکل datetime ذخیره کنید؟

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

خیر. میبایست حتما به صورت datetimeدر دیتابیس ذخیره کنم

Mani_rf
پنج شنبه 05 اسفند 1395, 09:56 صبح
چه لزومی داره که تاریخ رو به شکل datetime ذخیره کنید؟

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

درسته که بعضی از شرکت ها از این روش استفاده میکنند اما این روش لزوما روش خوبی نیست.
1- با استفاده از این روش شما UTC به عبارتی Time Zone رو ذخیره نمیکنید، در نتیجه گر بخواید برنامه ای مثل تلگرام بنویسید عملا همچین روش با شکست رو برو میشه.
2- حجم ذخیره سازی داده ای که دارید برای ذخیره تاریخ و ساعت همزمان حدود 2 برابر بیشتره تا نگهداری DateTime
و...