PDA

View Full Version : سوال: تبدیل رشته تاریخ به نوع datetime



saeid6366
یک شنبه 17 اردیبهشت 1396, 15:04 عصر
سلام دوستان مهندس.
من می خوام یک رشته تاریخ شمسی رو به نوع datetime تبدیل کنم . مثل کد زیر


System.Globalization.CultureInfo pr = new System.Globalization.CultureInfo("fa-ir");
DateTime dt = DateTime.ParseExact("1396/04/31", "yyyy/MM/dd", pr);

ولی dt به جای اینکه 1396/04/31 باشه، تاریخ میلادی (2017/7/22) هست.
به جای (CultureInfo("fa-ir از invariantCulture استفاده کردم ولی با تاریخ های 31 روزه شمسی مشکل داره و خطا میده
چطور این مشکل رو برطرف کنم. یعنی یک رشته تاریخ شمسی رو به نوع datetime تبدیل کنم?

Mag-Mag
یک شنبه 17 اردیبهشت 1396, 17:08 عصر
سلام
از PersianCalendar Class استفاده کن
لینک (https://msdn.microsoft.com/en-us/library/system.globalization.persiancalendar(v=vs.110).asp x)

saeid6366
یک شنبه 17 اردیبهشت 1396, 17:37 عصر
سلام
از PersianCalendar Class استفاده کن
لینک (https://msdn.microsoft.com/en-us/library/system.globalization.persiancalendar(v=vs.110).asp x)
بازم نشد

PersianCalendar persianDate = new PersianCalendar();
DateTime st = persianDate.ToDateTime(1396, 04, 23, 0, 0, 0, 0);
با کمال تعجب بازم به من تاریخ میلادی برمیگردونه!!!!!
چراااااا؟؟؟

اینکه window 10 دارم نمیتونه باعث این مشکل بشه؟ چ(ون یه جایی همچین چیزی خوندم)

Mag-Mag
دوشنبه 18 اردیبهشت 1396, 09:29 صبح
ببخشید من شاید متوجه منظورتون نشدم
شما توی نوع datetime نمیتونی تاریخ فارسی ذخیره کنی

البته منم فکر میکنم توی ویندوز 10 ، اگر فرمت ویندوز رو فارسی بزنی (توی تنظیمات Region) ، مشکل پیش میاد
من خودم برای تبدیل تاریخ های فارسی به میلادی و برعکس از این کد استفاده می کنم


System.Globalization.PersianCalendar persiandate = new System.Globalization.PersianCalendar();
DateTime GregorianDate = new DateTime(DateTime.Now.Ticks);
GregorianDate = persiandate.ToDateTime(1396, 2, 18, 0, 0, 0, 0);
Response.Write(string.Format("Gregorian Calendar: {0}/{1}/{2} ", GregorianDate.Year, GregorianDate.Month.ToString("D2"), GregorianDate.Day.ToString("D2")));
Response.Write(string.Format("<br/>Persian Calendar : {0}/{1}/{2}", persiandate.GetYear(GregorianDate), persiandate.GetMonth(GregorianDate).ToString("D2"),persiandate.GetDayOfMonth(GregorianDate).ToStrin g("D2")));

saeid6366
دوشنبه 18 اردیبهشت 1396, 10:18 صبح
ببخشید من شاید متوجه منظورتون نشدم
شما توی نوع datetime نمیتونی تاریخ فارسی ذخیره کنی

البته منم فکر میکنم توی ویندوز 10 ، اگر فرمت ویندوز رو فارسی بزنی (توی تنظیمات Region) ، مشکل پیش میاد
من خودم برای تبدیل تاریخ های فارسی به میلادی و برعکس از این کد استفاده می کنم


System.Globalization.PersianCalendar persiandate = new System.Globalization.PersianCalendar();
DateTime GregorianDate = new DateTime(DateTime.Now.Ticks);
GregorianDate = persiandate.ToDateTime(1396, 2, 18, 0, 0, 0, 0);
Response.Write(string.Format("Gregorian Calendar: {0}/{1}/{2} ", GregorianDate.Year, GregorianDate.Month.ToString("D2"), GregorianDate.Day.ToString("D2")));
Response.Write(string.Format("<br/>Persian Calendar : {0}/{1}/{2}", persiandate.GetYear(GregorianDate), persiandate.GetMonth(GregorianDate).ToString("D2"),persiandate.GetDayOfMonth(GregorianDate).ToStrin g("D2")));

خیلی ممنون از پاسخ گوییتون.
فقط یه سوال: اگر ما تو نوع datetime نمیتونیم تاریخ فارسی ذخیره کنیم پس یک تاریخ فارسی رو چطور در پایگاه داده به صورت datetime2 ذخیره کنیم یعنی میشه پارامترمون رشته باشه و در پایگاه داده از نوع datetime2 ذخیره بشه؟

Mag-Mag
دوشنبه 18 اردیبهشت 1396, 10:46 صبح
فیلد تاریخ فارسی تو توی دیتا بیس از نوع char(10) بگیر
فقط دقت کن که موقع ذخیره سازی ، حتما تاریخ هات 10 کاراکتر باشه
مثلا بجای 1396/2/2 باید 1396/02/02 ذخیره کنی
که بعدا برای سرچ و مرتب سازی مشکل نخوری

یک راه دیگش اینه که فیلد تاریخت رو از نوع bigint بگیری و Datetime().Ticks رو توش ذخیره کنی
و هر موقع خواستی با همین PersianCalendar تبدیل کنی و نمایش بدی یا موقع جستوجو اول تاریخت رو به Ticks تبدیل کنی و بعد پاس بدی به SQL

این راه دومی بدلیل نوع داده ، سرعت بهنری توی سرچ ها بهت میده
بسته به تعداد رکوردی که میخوای داشته باشی

من خودم برای جداولی که خیلی روی فیلد تاریخ سرچ ندارن و از راه اول استفاده میکنم

Mahmoud.Afrad
دوشنبه 18 اردیبهشت 1396, 15:45 عصر
سلام دوستان مهندس.
من می خوام یک رشته تاریخ شمسی رو به نوع datetime تبدیل کنم . مثل کد زیر


System.Globalization.CultureInfo pr = new System.Globalization.CultureInfo("fa-ir");
DateTime dt = DateTime.ParseExact("1396/04/31", "yyyy/MM/dd", pr);

ولی dt به جای اینکه 1396/04/31 باشه، تاریخ میلادی (2017/7/22) هست.
به جای (CultureInfo("fa-ir از invariantCulture استفاده کردم ولی با تاریخ های 31 روزه شمسی مشکل داره و خطا میده
چطور این مشکل رو برطرف کنم. یعنی یک رشته تاریخ شمسی رو به نوع datetime تبدیل کنم?




کلا datetime ماهیت میلادی داره. پس با این کدی که نوشتید تبدیل شمسی به میلادی درست انجام میشه. اگر میخواهید نمایش بدید که نیاز به تبدیل نیست. اگر هم میخواهید ذخیره کنید باید همین dt را ذخیره کنید.
اینکه در ویندوز10 تاریخ میلادی به صورت شمسی نمایش داده بشه مربوط به تنظیمات ویندوز هست که میتونید در موردش در اینترنت جستجو کنید ولی توصیه میکنم همه تبدیلات رو خودتون انجام بدید تا در ویندوزهای دیگر هم جواب بگیرید.

elhamblue
یک شنبه 31 اردیبهشت 1396, 11:41 صبح
سلام. من هم مشکلی تقریبا مشابه مشکل دوستمون دارم. من فیلدهای تاریخم رو nvarchar در نظر گرفتم و مقدار شمسی رو توشون ذخیره میکنم. حالا میخوام این دو تاریخ رو با هم مقایسه کنم باید اول تبدیل به تاریخ میلادی کنم اما تو تبدیل تاریخ ماه های 31 روزه به مشکل میخورم. میشه بگید چه طور میتونم تاریخ شمسی رو بدون مشکل به نوع datetime تبدیل کنم؟؟؟؟ و یا اینکه حداقل راهی برای مقایسه دو رشته باشه که توشون تاریخ ذخیره شده.ممنون

mostafapro
یک شنبه 31 اردیبهشت 1396, 14:18 عصر
دوستا سلام من تو كد زير با خطا مواجه ميشم :
string temp = exampleInput3.Text;

PersianDateTime persianDate = PersianDateTime.Parse("1396/03/02");
DateTime miladiDate = persianDate.ToDateTime();

RadScheduler1.SelectedDate = miladiDate;
}



البته در global.asax هم اين كد رو نوشتم:
var persianCulture = new PersianCulture();

persianCulture.DateTimeFormat.ShortDatePattern = "yyyy/MM/dd";
persianCulture.DateTimeFormat.LongDatePattern = "dddd d MMMM yyyy";

persianCulture.DateTimeFormat.AMDesignator = "صبح";
persianCulture.DateTimeFormat.PMDesignator = "عصر";

Thread.CurrentThread.CurrentCulture = persianCulture;
Thread.CurrentThread.CurrentUICulture = persianCulture;

وقتي تو اين خط PersianDateTime persianDate = PersianDateTime.Parse("1396/03/02"); بجاي مقدار رشته ثابت مقدار رو از يك تكست باكس ست ميكنم به فرمت رشته گير ميده و لي اگر رشته رو به صورت ثابت وارد كنم مشكلي نداره

Mag-Mag
یک شنبه 31 اردیبهشت 1396, 18:26 عصر
سلام
اگه با مقدار ثابت درسته و با مقدار textbox درست نیست
خوب احتمالا فرمت رشته textbox به صورت تاریخ نیست
یا مثلا موقع فراخوانی مقدارش خالی هست
میتونید یک breakpoint بزارید
و ببنید دقیقا مقدار textbox تون چی هست

اگه نشد ، متن خطاتون رو قرار بدید

mostafapro
یک شنبه 31 اردیبهشت 1396, 23:13 عصر
والا هم مقدار ثابت هم مقداری که تو تکست باکس هست مشابه همه.145275145276

Mag-Mag
دوشنبه 01 خرداد 1396, 15:09 عصر
تاریخ فارسی رو که نمی تونی مستقیم بدی به datetime
یک تابع برات نوشتم
ازش استفاده کن
تاریخ فارسی رو پاس بده به این تابع
خروجیش تاریخ میلادی هست



public static DateTime GetGregorianDateFromPersian(string pdate)
{
try
{
DateTime dt = new DateTime(int.Parse(pdate.Substring(0, 4)), int.Parse(pdate.Substring(5, 2)), int.Parse(pdate.Substring(8, 2)), new System.Globalization.PersianCalendar());
return dt;
}
catch (Exception)
{
return DateTime.Now;
}
}