PDA

View Full Version : تبدیل تاریخ میلادی به شمسی



mahdivita
دوشنبه 07 اردیبهشت 1394, 14:32 عصر
سلام
من موقع ثبت نام کاربر در سایت میخوام تو جدول کاربران یک فیلد دارم با عنوان تاریخ ثبت نام که اتوماتیک تاریخ سیستم رو میگیره و توی جدول ذخیره میکنه
مشکلی که الان من دارم اینه که این تاریخ میلادی هست و من میخوام شمسی باشه
کدی هم که استفاده میکنم کد زیر هست :
DateTime.Now.ToShortDateString();
چی کار باید بکنم؟

salibsatan
دوشنبه 07 اردیبهشت 1394, 15:08 عصر
خوب یه تایع برای تغییر تاریخ قرار بدین
مثل این
public static string shamsidate(string dt) {
try
{
PersianCalendar pdate = new PersianCalendar();
DateTime nT = Convert.ToDateTime(dt);
return (String.Format("{0:0000}/{1:00}/{2:00}", pdate.GetYear(nT), pdate.GetMonth(nT), pdate.GetDayOfMonth(nT)));
}
catch { return ("0"); }
}
بعد مقدار بازگشتی تابع رو تو بانک اینسرت کنید

mahdivita
سه شنبه 08 اردیبهشت 1394, 01:21 صبح
مقدار بازگشتیش چیه؟

salibsatan
سه شنبه 08 اردیبهشت 1394, 09:08 صبح
هرجور دوست داری می تونی تعریف کنی.ولی اینی که من گذاشتم رشته بر می گردونه با این فرمت : 0000/00/00
با یه تغییر کوچولو می تونه ساعت رو هم برگردونه که اگه خواستی بگو اونو هم بزارم

mahdivita
سه شنبه 08 اردیبهشت 1394, 13:08 عصر
نه منظورم این بود که چه کدی باید بنویسم تا تاریخ شمسی رو توی بانک اینسرت کنه :متفکر:
من برای میلادی کد زیر رو نوشته بودم :
DateTime.Now.ToShortDateString();

salibsatan
سه شنبه 08 اردیبهشت 1394, 13:46 عصر
shamsidate(DateTime.Now.ToString())

mahdivita
سه شنبه 08 اردیبهشت 1394, 19:55 عصر
سلامی مجدد
من کدی که دادین رو که میزنم به کد زیر گیر میده
PersianCalendar pdate = new PersianCalendar();
مشکل از چیه؟

Fotofan
سه شنبه 08 اردیبهشت 1394, 21:28 عصر
خب namespace رو حتما براش نزاشتی

به این صورت بالای بالای صفحه بنویس

using System.Globalization;

mahdivita
چهارشنبه 09 اردیبهشت 1394, 01:44 صبح
ممنون
یه سئوال دیگه :
من اون کدها رو توی یه کلاس گذاشتم حالا چجوری میتونم توی پروژم ازش استفاده کنم؟

Fotofan
چهارشنبه 09 اردیبهشت 1394, 02:01 صبح
خب دوحالت داره یا به صورت extention method ازش استفاده می کنی یا به عنوان تابع....

اگه اکستنشن متد می خوایی پیشنهاد می کنم براش namespace تعریف نکنی تا بتونی توی کل پروژه ازش استفاده بکنی....
منظورم از اکتنشن متد اینه


DateTime a=DateTime.Now;
DateTime b= a.ToShamsi();


همیین Toshamsi میاد و تاریخی که در a وجود داره رو به شمسی تبدیل می کنه بعد داخل b قرار میده.

ولی تابع به این صورته:

DateTime a=ToShamsi(DateTime.Now);


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


حالا جواب سوالت:

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

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


کل کار و کد به این صورت میشه:



public class ConvertDate
{
public string shamsidate(string dt)
{
try
{
PersianCalendar pdate = new PersianCalendar();
DateTime nT = Convert.ToDateTime(dt);
return (String.Format("{0:0000}/{1:00}/{2:00}", pdate.GetYear(nT), pdate.GetMonth(nT), pdate.GetDayOfMonth(nT)));
}
catch
{
return ("0");
}
}
}





حالا به این صورت ازش استفاده بکن





ConvertDate cd= new ConvertDate();

string Shamsi= cd.shamsidate("1996/2/2");






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


با تشکر (محمدرضا احمدی)

mahdivita
پنج شنبه 10 اردیبهشت 1394, 00:47 صبح
سلامراستش
اینی که گفتین رو که اصلا متوجه نشدم
ولی یه سئوال دیگه اونم اینکه از وقتی از این تابع برای تبدیل تاریخ به شمسی استفاده کردم فیلد id جدول کاربران به شکل زیر زیاد میشه
قبلا اینجوری بود :
1
2
3
4
اما حالا :
1011
1012
1013
1014


چرا؟؟

hamid_0341
پنج شنبه 10 اردیبهشت 1394, 07:37 صبح
از این کلاس استفاده کن

public void ShamsiDate()
{
System.Globalization.CultureInfo calture = new System.Globalization.CultureInfo("fa-IR");
System.Globalization.DateTimeFormatInfo info = calture.DateTimeFormat;
info.AbbreviatedDayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };
info.DayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };
info.AbbreviatedMonthNames = new string[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
info.MonthNames = new string[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
info.AMDesignator = "ق.ظ";
info.PMDesignator = "ب.ظ";
info.ShortDatePattern = "yyyy/MM/dd";
info.FirstDayOfWeek = DayOfWeek.Saturday;
System.Globalization.PersianCalendar cal = new System.Globalization.PersianCalendar();
typeof(System.Globalization.DateTimeFormatInfo).Ge tField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue (info, cal);
//object obj = typeof(System.Globalization.DateTimeFormatInfo).Ge tField("m_cultureTableRecord", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue (info);
//obj.GetType().GetMethod("UseCurrentCalendar", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(ob j, new object[] { cal.GetType().GetProperty("ID", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue (cal, null) });
typeof(System.Globalization.CultureInfo).GetField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue (calture, cal);
System.Threading.Thread.CurrentThread.CurrentCultu re = calture;
System.Threading.Thread.CurrentThread.CurrentUICul ture = calture;
System.Globalization.CultureInfo.CurrentCulture.Da teTimeFormat = info;
System.Globalization.CultureInfo.CurrentUICulture. DateTimeFormat = info;
}

Fotofan
پنج شنبه 10 اردیبهشت 1394, 10:53 صبح
سلامراستش
اینی که گفتین رو که اصلا متوجه نشدم
ولی یه سئوال دیگه اونم اینکه از وقتی از این تابع برای تبدیل تاریخ به شمسی استفاده کردم فیلد id جدول کاربران به شکل زیر زیاد میشه
قبلا اینجوری بود :
1
2
3
4
اما حالا :
1011
1012
1013
1014


چرا؟؟

این متدی که ما نوشتیم هیچ ربطی به id نداره. مگه فیلد id کلید اصلی نیست و identity برابر true نیست.(خودش دونه دونه اضافه می شه). اگه اینشکلی نباشه پس ببین کجای برنامه ات اینو تبدیل به 100.... می کنی.

اگرم که identity داخل sql server برابر true است. (identity در قسمت مشخصه های هر فیلد قرار داره) باید speed ان را برابر 1 و identity increment را نیز برابر 1 بکنی. شاید دستت خورده اینجوری شده.

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