PDA

View Full Version : مبتدی: خطا در persia.dll بخاطر سال کبیسه



nassim0
سه شنبه 11 مهر 1396, 13:09 عصر
با سلام و خسته نباشید . دوستان من از کامپوننت
persia.dll برای تبدیل تاریخ هام استفاده کردم ولی از عید به بعد از تبدیل تاریخ های سی و سی و یک هر ماه خطا میده . آیا ورژن جدیدی از persia.dll وجود داره که این مشکل رو حل کرده باشه.

vahidwss
چهارشنبه 12 مهر 1396, 01:08 صبح
تو خود c# امکانات تبدیل تاریخ هست:

PersianCalendar pc = new PersianCalendar();
DateTime thisDate = DateTime.Now;
string pdate=pc.GetYear(thisDate)+"/"+pc.GetMonth(thisDate)+"/"+pc.GetDayOfMonth(thisDate);
MessageBox.Show(pdate);

nassim0
چهارشنبه 12 مهر 1396, 13:08 عصر
ممنونم از تابع بالا استفاده کردم اما موقع تبدیل وقتی خروجی رو توی ماسک تکس باکس قرار میدم ، ماه یا روز رو با دو رقم نشون نمیده
146588

danialafshari
چهارشنبه 12 مهر 1396, 13:39 عصر
ممنونم از تابع بالا استفاده کردم اما موقع تبدیل وقتی خروجی رو توی ماسک تکس باکس قرار میدم ، ماه یا روز رو با دو رقم نشون نمیده
146588

بدلیل این هست که ماه ها و روزهای 1 تا 9 که تک رفمی هستن رو بدون قالب نشون میده
کد رو به شکل زیر تغییر بدید:

PersianCalendar pc = new PersianCalendar();
DateTime thisDate = DateTime.Now;
string pdate =pc.GetYear(thisDate).ToString("0000") + "/" + pc.GetMonth(thisDate).ToString("00") + "/" + pc.GetDayOfMonth(thisDate).ToString("00");
MessageBox.Show(pdate);

موفق باشید

nassim0
جمعه 14 مهر 1396, 09:54 صبح
سلام . من از کد زیر برای تبدیل به میلادی استفاده کردم ولی بازم خطا داد

146614
خظا :

146615

ممنون میشم راهنماییم کنید

nassim0
شنبه 15 مهر 1396, 11:11 صبح
با سلام
می تونید از dll من استفاده کنید
کافیه به Toolbox اضافش کنید
اگر هم میخواهید مشکل کد خودتون رو حل کنید بگید تا خطاش رو رفع کنم
موفق باشید

ممنون میشم برای یادگیریم راهنماییم کنید مشکل کدم کجاست

محمد آشتیانی
شنبه 15 مهر 1396, 11:45 صبح
سلام
شما تاریخ شمسی رو در قالب DateTime به متودتون پاس میدید؟ این اشتباهه (اگر اینکه در ویندوز 10 تنظیم تقویم رو روی تقویم شمسی ست کرده باشید که اون هم فعلا عمومیت نداره)

به نظر بنده یک کلاس استاتیک ایجاد کنید در پروژتون و برای تبدیل دوتا Extention Method بنویسید ، استفاده کردن ازش هم خیلی راحت تر میشه
به این کلاس دقت کنید


public static class Extentions
{
public static int? ToInt(this string inputString)
{
int? output;


try
{
output = int.Parse(inputString);
}
catch (Exception)
{
output = null;
}


return output;
}


/// <summary>
/// Gets a Gregorian DateTime and Converts to Persian Date in YYYY/MM/DD format
/// </summary>
/// <param name="inputDateTime">The input date time.</param>
/// <returns>System.String.</returns>
public static string ToPersianDate(this DateTime inputDateTime)
{
string result;


try
{
var pc = new PersianCalendar();
result = pc.GetYear(inputDateTime) + "/" + pc.GetMonth(inputDateTime).ToString("D2") + "/" + pc.GetDayOfMonth(inputDateTime).ToString("D2");
}
catch (Exception)
{
result = null;
}


return result;
}


/// <summary>
/// Gets a Persian Date in YYYY/MM/DD format and converts to Gregorian DateTime
/// </summary>
/// <param name="inputDate">The shamsi date.</param>
/// <returns>DateTime.</returns>
public static DateTime ToGregorianDate(this string inputDate)
{
DateTime result;


try
{
var persianCalendar = new PersianCalendar();


var year = inputDate.Substring(0, 4).ToInt();
var month = inputDate.Substring(5, 2).ToInt();
var day = inputDate.Substring(8, 2).ToInt();


result = persianCalendar.ToDateTime(year.Value, month.Value, day.Value, 0, 0, 0, 0);
}
catch (Exception)
{
throw new FormatException();
}


return result;
}
}



الان در هرجای پروژتون بخواهید یک تاریخ میلادی رو به شمسی تبدیل کنید به اینصورت و به سادگی قابل انجام هست
var persianDate = DateTime.Now.ToPersianDate();

یا برای تبدیل تاریخ شمسی به میلادی کافیه اینطوری عمل کنید (دقت کنید فرمت تاریخ شمسی YYYY/MM/DD باید باشه و String البته)
var gregorianDate = "1396/07/15".ToGregorianDate();




موفق باشید.

danialafshari
شنبه 15 مهر 1396, 11:53 صبح
سلام . من از کد زیر برای تبدیل به میلادی استفاده کردم ولی بازم خطا داد

146614
خظا :

146615

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

public string DateToday(DateTime _date)
{
PersianCalendar pc = new PersianCalendar();
StringBuilder sb = new StringBuilder();
sb.Append(pc.GetYear(_date).ToString("0000"));
sb.Append("/");
sb.Append(pc.GetMonth(_date).ToString("00"));
sb.Append("/");
sb.Append(pc.GetDayOfMonth(_date).ToString("00"));
return sb.ToString();
}


استفاده :

string strtoday = DateToday(Convert.ToDateTime("1993/09/26"));
MessageBox.Show(strtoday);

موفق باشید

nassim0
شنبه 15 مهر 1396, 12:29 عصر
به این شکل میتونید استفاده کنید:

public string DateToday(DateTime _date)
{
PersianCalendar pc = new PersianCalendar();
StringBuilder sb = new StringBuilder();
sb.Append(pc.GetYear(_date).ToString("0000"));
sb.Append("/");
sb.Append(pc.GetMonth(_date).ToString("00"));
sb.Append("/");
sb.Append(pc.GetDayOfMonth(_date).ToString("00"));
return sb.ToString();
}


استفاده :

string strtoday = DateToday(Convert.ToDateTime("1993/09/26"));
MessageBox.Show(strtoday);

موفق باشید


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

danialafshari
شنبه 15 مهر 1396, 13:23 عصر
میلادی:

private string Miladi(int year,Int16 month,Int16 day)
{
PersianCalendar pc = new PersianCalendar();
var Miladi = pc.ToDateTime(year, month, day, 0, 0, 0, 0);
var result = String.Format("{0}/{1}/{2}", Miladi.Year.ToString("0000"), Miladi.Month.ToString("00"), Miladi.Day.ToString("00"));
return result;
}

استفاده :

MessageBox.Show(Miladi(1396,7,15));

موفق باشید

nassim0
دوشنبه 17 مهر 1396, 14:33 عصر
با سلام و خسته نباشید . مشکل سال کبیسه برای ذخیره و بازیابی از بانک به لطف راهنمایی دوستان برطرف شد . مشکل جدیدی که الان برام پیش اومده اینه که وقتی میخوام تاریخ گرید ویو رو تبدیل به تاریخ شمسی کنم خطا میده ولی نه روی هر تاریخی (مثل خطای سال کبیسه 30 یا 31 ماه ها) . ممنون میشم راهنماییم کنید .
146655

کد تابع تبدیل


public static string DateToday(DateTime _date) {
PersianCalendar pc = new PersianCalendar();
StringBuilder sb = new StringBuilder();
sb.Append(pc.GetYear(_date).ToString("0000"));
sb.Append("/");
sb.Append(pc.GetMonth(_date).ToString("00"));
sb.Append("/");
sb.Append(pc.GetDayOfMonth(_date).ToString("00"));
return sb.ToString();


}

danialafshari
دوشنبه 17 مهر 1396, 20:36 عصر
با سلام
لطفاً بجای استفاده از عکس کد رو قرار بدید که بشه تست و ویرایش کرد و در عکس، ارور رو قرار بدید.
خطا میگه datetime رو نمیتونیم تبدیل به string کنم
شما در طرف چپ مساوی اومدید datetime گذاشتید و طرف راست مساوی string خب بایدم ارور بده
قبل از calender.DateToday یک تبدیل بهگذارید به شکل زیر

Convert.toString(Calender.DateToday(Convert.ToDate Time(grdkarshenasi.rows[i].cell[8].value)));

چه لزومی به تبدیل هست؟ مگر به میلادی و DateTime درون بانک قرار دادید؟
تبدیل راه اصولی نیست تصور کنید حجم اطلاعات بره بالا و تبدیل هم حلقه نیاز داره و موجب هنگ و کند شدن برنامه میشه
پیشنهاد می کنم از nvarchar 10 استفاده کنید و به صورت شمسی ذخیره کنید
موفق باشید

nassim0
سه شنبه 18 مهر 1396, 08:30 صبح
با سلام
لطفاً بجای استفاده از عکس کد رو قرار بدید که بشه تست و ویرایش کرد و در عکس، ارور رو قرار بدید.
خطا میگه datetime رو نمیتونیم تبدیل به string کنم
شما در طرف چپ مساوی اومدید datetime گذاشتید و طرف راست مساوی string خب بایدم ارور بده
قبل از calender.DateToday یک تبدیل بهگذارید به شکل زیر

Convert.toString(Calender.DateToday(Convert.ToDate Time(grdkarshenasi.rows[i].cell[8].value)));

چه لزومی به تبدیل هست؟ مگر به میلادی و DateTime درون بانک قرار دادید؟
تبدیل راه اصولی نیست تصور کنید حجم اطلاعات بره بالا و تبدیل هم حلقه نیاز داره و موجب هنگ و کند شدن برنامه میشه
پیشنهاد می کنم از nvarchar 10 استفاده کنید و به صورت شمسی ذخیره کنید
موفق باشید

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

grdkarshenasi.Rows[i].Cells[8].Value = Convert.ToString(calender.DateToday(Convert.ToDate Time("2016/05/10")));
grdkarshenasi.Rows[i].Cells[12].Value =Convert.ToString(calender.DateToday(Convert.ToDat eTime("2016/05/20")));
توی خط اول کد های بالا که تاریخ شمسی 1395/02/21 مقدار رو به گرید ویو لحاظ میکنه اما دومین خط که مقدار شمسیش معادل 1395/02/31 و دقیقا همون تابع تبدیل رو استفاده کردم باز خطا میده . انواع تبدیل tostring رو هم امتحان کردم اما نتونستم خطا رو رفع کنم .
تبدیل تاریخ :


public static string DateToday(DateTime _date) {
PersianCalendar pc = new PersianCalendar();
StringBuilder sb = new StringBuilder();
sb.Append(pc.GetYear(_date).ToString("0000"));
sb.Append("/");
sb.Append(pc.GetMonth(_date).ToString("00"));
sb.Append("/");
sb.Append(pc.GetDayOfMonth(_date).ToString("00"));
return sb.ToString();


}

خطا : String was not recognized as a valid DateTime.

رامین مرادی
سه شنبه 18 مهر 1396, 09:25 صبح
منم با تاریخ 2/31 مشکل داشتم .:لبخند: نهایتا مجبور شدم داده ها رو به صورت شمسی و رشته ذخیره کنم. و در صورت نیاز تبدیلات رو یا توی خود اس کیو ال انجام بدم یا اینکه توی برنامه انجام بدم.

محمد آشتیانی
سه شنبه 18 مهر 1396, 09:49 صبح
سلام
به پستی که بالاتر گذاشتم و کدی که نوشتم دقت کردین؟ هیچ مشکلی نداره ، شما اگر ورودی May 21 2017 بهش بدید تبدیلش میکنه به 1396/02/31 ، نمیدونم مشکل چیه دیگه ، برای سال قبل هم (1395/02/31) معادلش میشه 20 May و این درسته

این به درستی کار میکنه ، با همون کدی که بالاتر دادم
Convert.ToDateTime("2016/05/20").ToPersianDate()



البته این رو هم بگم ، با کد خودتون هم تست کردم مشکلی نداشت و نتیجه درست برمیگردونه ، ضمن اینکه ToString نیاز نیست ، چون نوع خروجی متد شما String هست

nassim0
چهارشنبه 19 مهر 1396, 08:09 صبح
سلام
به پستی که بالاتر گذاشتم و کدی که نوشتم دقت کردین؟ هیچ مشکلی نداره ، شما اگر ورودی May 21 2017 بهش بدید تبدیلش میکنه به 1396/02/31 ، نمیدونم مشکل چیه دیگه ، برای سال قبل هم (1395/02/31) معادلش میشه 20 May و این درسته

این به درستی کار میکنه ، با همون کدی که بالاتر دادم
Convert.ToDateTime("2016/05/20").ToPersianDate()



البته این رو هم بگم ، با کد خودتون هم تست کردم مشکلی نداشت و نتیجه درست برمیگردونه ، ضمن اینکه ToString نیاز نیست ، چون نوع خروجی متد شما String هست


با سلام و خسته نباشید . از لطفتون ممنونم . جناب آقای آشتیانی برای ذخیره و لود از بانک مشکلی ندارم مواردی که شما و آقای افشاری زحمتشو کشیدید باعث شد مشکل من حل بشه . مشکل الانم اینه که وقتی گرید ویو رو بایند می کنم چون تاریخهای بانکم میلادیه نیاز هست که تاریخ ها توی گرید ویو شمسی نمایش داده بشه و از کد زیر استفاده می کنم.

grdkarshenasi.Rows[i].Cells[8].Value = Convert.ToDateTime(grdkarshenasi.Rows[i].Cells[8].Value.ToString()).ToPersianDate();

در حال حاضر مشکلم تبدیل تاریخ به شمسی توی گرید ویو (البته از radgreid view چون از تلریک استفاده می کنم) هستش . با روزای پایین تر یا بالاتر مشکلی نداره خطا نمیده اما تا 30 یا بیشتر 31 ماه رو استفاده می کنم خطامیده . برام مقدور نیست تاریخ ها رو بخوام از اول استرینگ کنم خیلی وقت گیره و البته تعداد تاریخ های استفاده شده توی کل پروژه بالای صد تا فیلد هستش .
توی هر دوروش همون خطا رو میده

grdkarshenasi.Rows[i].Cells[8].Value = Convert.ToDateTime("2016/05/20").ToPersianDate();
grdkarshenasi.Rows[i].Cells[8].Value = Convert.ToDateTime(grdkarshenasi.Rows[i].Cells[8].Value.ToString()).ToPersianDate();
ممنون میشم راهنماییم کنید .

محمد آشتیانی
چهارشنبه 19 مهر 1396, 11:51 صبح
سلام
متوجه مشکل نمیشم ، اگر براتون مقدوره ، پروژتون رو جایی آپلود کنید تا نگاهی بندازم بهش و یا همین مشکل رو روی یک پروژه تستی پیش بیارید و اون رو بذارید تا رفع اشکال بشه (به همراه دیتابیس و هر موردی که لازم هست)

nassim0
چهارشنبه 19 مهر 1396, 15:39 عصر
سلام
متوجه مشکل نمیشم ، اگر براتون مقدوره ، پروژتون رو جایی آپلود کنید تا نگاهی بندازم بهش و یا همین مشکل رو روی یک پروژه تستی پیش بیارید و اون رو بذارید تا رفع اشکال بشه (به همراه دیتابیس و هر موردی که لازم هست)

با سلام و خسته نباشید . جناب آقای آشتیانی توی پروژه که خدمتتون ارسال کردم یک گرید ویو هست که به بانکم از طریق linq بایند میشه بعد توی یک حلقه شروع به تبدیل تاریخ های میلادی به شمسی می کنه . لینک دانلود پروژه :

http://shatelland.com/upload/files/a1f4e447-eab9-47ac-82d0-021e6823b405

محمد آشتیانی
چهارشنبه 19 مهر 1396, 18:18 عصر
سلام
قضیه به این ترتیب هست که ، وقتی شما دارید مقدار یک ردیف از یک ستون بایند شده رو به تاریخ شمسی تغییر می دید و نتیجه رو درون همون فیلد میریزید ، تاریخ تبدیل شده از دید برنامه فرمتش میلادی هست ، برای همینه که به شما خطا میده

حالا راه حل هایی هم وجود داره
1- اینکه کل ستون های مورد نیاز رو با کد نویسی بسازید و مقادیر رو با یک حلقه foreach درون دیتاگرید بریزید (یعنی دیتاگریدتون به دیتاسورس بایند نباشه)
2- روش فعلی رو انجام بدید ، اما بعد از بایند شدن ، ستون تاریخ میلادی رو مخفی کنید و یک ستون بصورت دستی بسازید و مقادیر تبدیل شده رو داخلش بریزید.
3- یک Business Object بسازید و نتیجه کوئریتون رو در یک لیست از اون آبجکت بریزید و اون لیست رو به دیتا گرید بایند کنید.

منظورم از گزینه سوم همچین چیزیه (این میشه بیزینس آبجکت شما)
public class Sample
{
public int Id { get; set; }
public string Name { get; set; }
public string PersianDate { get; set; }
}

طبق کدتون استفاده ازش همچین چیزی میشه
private void button1_Click(object sender, EventArgs e)
{
var dataList = new List<Sample>();
var bindForsh = new DataClasses1DataContext();


var q77 = from p77 in bindForsh.Tables
orderby p77.Id descending
select p77;

foreach (var item in q77)
{
dataList.Add(new Sample() { Id = item.Id, Name = item.name, PersianDate = calender.ConvertToP(item.datekarshenasi) });
}


dataGridView1.DataSource = dataList;
}

nassim0
چهارشنبه 19 مهر 1396, 21:21 عصر
سلام
قضیه به این ترتیب هست که ، وقتی شما دارید مقدار یک ردیف از یک ستون بایند شده رو به تاریخ شمسی تغییر می دید و نتیجه رو درون همون فیلد میریزید ، تاریخ تبدیل شده از دید برنامه فرمتش میلادی هست ، برای همینه که به شما خطا میده

حالا راه حل هایی هم وجود داره
1- اینکه کل ستون های مورد نیاز رو با کد نویسی بسازید و مقادیر رو با یک حلقه foreach درون دیتاگرید بریزید (یعنی دیتاگریدتون به دیتاسورس بایند نباشه)
2- روش فعلی رو انجام بدید ، اما بعد از بایند شدن ، ستون تاریخ میلادی رو مخفی کنید و یک ستون بصورت دستی بسازید و مقادیر تبدیل شده رو داخلش بریزید.
3- یک Business Object بسازید و نتیجه کوئریتون رو در یک لیست از اون آبجکت بریزید و اون لیست رو به دیتا گرید بایند کنید.

منظورم از گزینه سوم همچین چیزیه (این میشه بیزینس آبجکت شما)
public class Sample
{
public int Id { get; set; }
public string Name { get; set; }
public string PersianDate { get; set; }
}

طبق کدتون استفاده ازش همچین چیزی میشه
private void button1_Click(object sender, EventArgs e)
{
var dataList = new List<Sample>();
var bindForsh = new DataClasses1DataContext();


var q77 = from p77 in bindForsh.Tables
orderby p77.Id descending
select p77;

foreach (var item in q77)
{
dataList.Add(new Sample() { Id = item.Id, Name = item.name, PersianDate = calender.ConvertToP(item.datekarshenasi) });
}


dataGridView1.DataSource = dataList;
}

جناب آقای آشتیانی از لطفتون و وقتی که برام گذاشتین ممنونم . با روش شما مشکلم برطرف شد . زنده باشید .