PDA

View Full Version : نحوه عوض کردن تاریخ میلادی به شمسی بعد از گرفتن از دیتابیس؟



saeed_sho
یک شنبه 15 آبان 1390, 18:59 عصر
سلام
احتیاج به راهنمایی فوری دارم اگه میتونید لطفا راهنمایی کنید
یه دیتابیس دارم که اطلاعات بصورت فارسی ذخیره میشه
collation
اون از نوع
persian_100_ci_as
اطلاعات بصورت فارسی ذخیره میشه بجز تاریخ که باید میلادی باشه و شمسی قبول نمیکنه
اطلاعات توی دیتاگرید ویو نمایش داده میشه میخوام تاریخ رو فارسی نمایش بدم بهترین راه چیه ؟
تاریخ رو میلادی از دیتابیس میگیرم کجا و چطوری اونو تبدیل کنم به شمسی چطریشو بلدم با چند تا تابع اما کجا شو نمیدونم در ضمن از اس کیو ال کامند استفاده میکنم
فکر کنم باید توی خوده دیتاگریدویو و قسمت فرمت بندی این کارو بکنم
عین این مشکل توی گزارش گیری هم هست با استیمال سافت ریپورت میشه تاریخی که از دیتابیس میگیرمو شمسی کنم؟
معادل هر خط از این کدا توی سی شارپ چی میشه
AnswerTextBox.Text = Convert.ToString(dataGridView1.CurrentRow.Cells(5) .Value)
برای
cells
ارور میده
If conn.State = ConnectionState.Closed Then conn.Open()
اینم ماله وی بی هستش و باز بودن کانکشنو چک میکنه
ممنون میشم اگه زود راهنماییم کنید

saeedhushmand
یک شنبه 15 آبان 1390, 23:33 عصر
77516 دانلود کن امیدوارم بدردت بخوره

موفق باشی..

saeed_sho
دوشنبه 16 آبان 1390, 09:51 صبح
ممنونم ولی تبدیل کدارو پیدا کردم مشکلم گرفتن تاریخ میلادی از دیتابیس و نحوهی تبدیل اون به شمسی .کجا میتونم به تاریخ دسترسی داشته باشم و اونو تبدیل کنم؟

sobaisobai
دوشنبه 16 آبان 1390, 11:15 صبح
سلام
یعنی چی مشکلم گرفتن تاریخ از دیتابیس؟
واضح تر بگو

saeed_sho
دوشنبه 16 آبان 1390, 19:39 عصر
نوع داده ی من datetime توی جدول میخوام تاریخ میلادی رو از دیتاگرید ویو بگیرم و بجاش شمسی نشون بدم چطوری توی دیتاگرید ویو مقدارو جایگزین کنم

sobaisobai
دوشنبه 16 آبان 1390, 19:48 عصر
خب پس شما با خودن تاریخ از دیتابیس مشکل نداری با نمایش اون تو دیتاگرید مشکل داری
درسته؟

saeed_sho
دوشنبه 16 آبان 1390, 19:55 عصر
بله مقداردهی به دیتاگرید ویو

sobaisobai
دوشنبه 16 آبان 1390, 21:05 عصر
شما همون مقداری رو که از فیلد تاریخ جدولت میخونی بریز تودیتاگرید
اگه کدت رو بذاری بهتر میشه کمک کرد

saeed_sho
دوشنبه 16 آبان 1390, 22:08 عصر
دارم اینجوری تبدیل میکنم اما ارور میده که استرینگ رو نمیتونم به دیت تایم تبدیل کنم
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
for (int i = 0; i <= dataGridView1.Rows.Count; i++)
{
string d = Convert.ToString(dataGridView1.Rows[idValue].Cells[5].Value);
string sh = Shamsi(d);
dataGridView1.Rows[i].Cells[5].Value = sh;
}
}
string Shamsi(string miladi)
{
DateTime dt = DateTime.Parse (miladi);
PersianCalendar p = new PersianCalendar();
return p.GetYear(dt) + "/" + p.GetMonth(dt) + "/" + p.GetDayOfMonth(dt);
}

sobaisobai
دوشنبه 16 آبان 1390, 22:16 عصر
ارورش چیه؟

saeed_sho
دوشنبه 16 آبان 1390, 22:30 عصر
توی تابع shamsiبه خط اولش ارور میده و میگه نوع استرینگ miladiنمی تونه به datetime تبدیل بشه

sobaisobai
دوشنبه 16 آبان 1390, 22:55 عصر
دوست عزیز کدت مورد داره حتما
دوستمون که فایل رو ضمیمه کرده بود من تست کردم سالمه

Z_Bagheri
سه شنبه 17 آبان 1390, 09:06 صبح
من از اینتابع استفاده می کنم و جواب هم میده ، امتحانش کنید


string ConvertToPersian(object o)
{
System.Globalization.PersianCalendar pc = new System.Globalization.PersianCalendar();
int year = pc.GetYear(Convert.ToDateTime(o));
int month = pc.GetMonth(Convert.ToDateTime(o));
int day = pc.GetDayOfMonth(Convert.ToDateTime(o));
return String.Format("{0}/{1}/{2}", year, month, day);
}

faravaghi
سه شنبه 17 آبان 1390, 10:38 صبح
سلام،
کامپوننت FarsiLibrary رو دانلود کن به پروژه اضافه کن و این جوری ازش استفاده کن:

if (DataGridView1.Rows.Count > 0)
for (int i = 0; i < DataGridView1.Rows.Count; i++)
{
DataGridView1.Rows[i].Cells["Dg_Shamsi_Date"].Value = ((PersianDate)Convert.ToDateTime(DataGridView1.Row s[i].Cells["Dg_Miladi_Date"].Value)).ToString("g");
}

saeed_sho
سه شنبه 17 آبان 1390, 11:40 صبح
از همتون ممنونم تا دیشب از این کد استفاده میکردم ولی
اول درست کار میکنه و شمسی میکنه اما حلقه for بینهایت میشه و هی با مقدار خالی قبلیارم جایگزین میکنه و ادامه پیدا میکنه و قطع نمیشه
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
for (int i = 0; i < dataGridView1.Rows.Count-1; i++)
{
string d = Convert.ToString(dataGridView1.Rows[i].Cells[5].Value);
string sh = PersionDate(d);
dataGridView1.Rows[i].Cells[5].Value = sh;
}
}
public string PersionDate(string miladi)
{
try
{

PersianCalendar jc = new PersianCalendar();
DateTime thisDate = DateTime.Parse(miladi);
string day;
string month;
string year;
string newdate = "";
day = jc.GetDayOfMonth(thisDate).ToString();
month = jc.GetMonth(thisDate).ToString();
year = jc.GetYear(thisDate).ToString();
if (int.Parse(day) < 10)
{
day = "0" + day;
}
if (int.Parse(month) < 10)
{
month = "0" + month;
}
newdate = year + "/" + month + "/" + day;

return newdate;
}
catch (Exception)
{

}
return "";
}

saeed_sho
سه شنبه 17 آبان 1390, 21:56 عصر
این حلقه for کجا استفاده کنم من توی cellformatting_datagridview استفاده میکنم جواب نمیده شما توی کدوم تابع استفاده میکنید؟

faravaghi
چهارشنبه 18 آبان 1390, 00:06 صبح
سلام دوست عزیز،
وقتی اطلاعات رو داخل DataGridView ریختی اون رو هم بنویس.
میتونید همین رو توی یک تابع بنویسی و هر جا که لازم شد فقط صدا بزنی.
مثلا وقتی داری اطلاعات رو فیلتر میکنی ویا ...

rohullah
چهارشنبه 18 آبان 1390, 11:41 صبح
ارورش که مشخصه داری یه مقدار string رو میریزی تو یه cell که دیتا تایپ datetime هست
یا باید تایپ cell رو عوض کنی یا sh رو تبدیل کنی

saeed_sho
پنج شنبه 19 آبان 1390, 10:49 صبح
مشکلم حل شد ممنونم

shahab_ss
پنج شنبه 01 دی 1390, 10:46 صبح
CellFormatting Event به تنهایی سربار زیادی برای فرم ایجاد میکنه،با قرار دادن کد زیر در واقع شما تیر خلاص به برنامه خودت زدی!!!


for (int i = 0; i < dataGridView1.Rows.Count-1; i++) {
string d = Convert.ToString(dataGridView1.Rows[i].Cells[5].Value);
string sh = PersionDate(d);
dataGridView1.Rows[i].Cells[5].Value = sh;
}


بجای کد بالا از این کد استفاده کن
if (YourGridName.Columns[e.ColumnIndex].Name.Equals(col_Date.Name) )
{
if (e.Value != null)
{
DateTime dt;
if (DateTime.TryParse(e.Value.ToString(), out dt))
{
e.Value = //Do Your Conversion here! "dt" is Miladi Date to be converted
return;
}
}
}

ozzy_mra
پنج شنبه 01 دی 1390, 21:12 عصر
سلام
به نظر من بهترین کار اینه که شما یه تابع در sqlServer برلی این کار بنویسی و هرجا که کوئری داشتی مثلاً اگر اسم فیلد تاریخت dt باشه تابع تبدیلشو صدا بزنی مثلاً Civil2Persian(dt)
من چند تا اسکریپت برات میزارم تو sqlServer اجراشون کن تا به توابعت اضافه بشه و بعد از اون استفاده کن من کدشو تو همین سایت پیدا کردم


CREATEFUNCTION [dbo].[Persian2Civil](@year int, @month int, @day int)
RETURNSchar(10)AS
BEGIN
--RETURN dbo.jdn_civil(dbo.persian_jdn(@year, @month, @day))
RETURNcast(dbo.persian_jdn(@year, @month, @day)- 2415021 as
datetime)
END




CREATEFUNCTION [dbo].[persian_jdn](@iYear bigint, @iMonth int, @iDay int)
RETURNSbigintAS
BEGIN
DECLARE @PERSIAN_EPOCH bigint
SET @PERSIAN_EPOCH = 1948321 -- The JDN of 1 Farvardin 1
DECLARE @epbase bigint
DECLARE @epyear bigint
DECLARE @mdays bigint
DECLARE @temp bigint
IF @iYear >= 0
SET @epbase = @iYear - 474
ELSE
SET @epbase = @iYear - 473

SET @epyear = 474 + dbo.MMod(@epbase, 2820)
IF @iMonth <= 7
SET @mdays =(@iMonth - 1)* 31
ELSE
SET @mdays =(@iMonth - 1)* 30 + 6

SET @temp = @iDay + @mdays +CAST(((@epbase / 2820)* 1029983 +
(@PERSIAN_EPOCH - 1))ASbigint)
RETURN @temp +CAST(((((@epyear * 682)- 110)/ 2816)+(@epyear - 1)*
365)ASbigint)
END

ozzy_mra
پنج شنبه 01 دی 1390, 21:14 عصر
اینم بقیش


CREATEFUNCTION [dbo].[MMod](@numerator bigint, @denominator bigint)
RETURNSbigintAS
BEGIN
RETURN ((@numerator % @denominator)+ @denominator)%
@denominator
END




CREATEFUNCTION [dbo].[jdn_persian](@jdn bigint)
RETURNSchar(10)AS
BEGIN
DECLARE @depoch bigint
DECLARE @cycle int
DECLARE @cyear bigint
DECLARE @ycycle int
DECLARE @aux1 int, @aux2 int
DECLARE @yday int
DECLARE @iYear bigint, @iMonth int, @iDay int
DECLARE @tmpMonth char(2),@tmpDay char(2)
SET @depoch = @jdn - dbo.persian_jdn(475, 1, 1)
SET @cycle =CAST((@depoch / 1029983)ASint)
SET @cyear = dbo.MMod(@depoch, 1029983)
IF @cyear = 1029982
SET @ycycle = 2820
ELSE
BEGIN
SET @aux1 =CAST((@cyear / 366)ASint)
SET @aux2 = dbo.MMod(@cyear, 366)
SET @ycycle =CAST(((((2134 * @aux1)+(2816 * @aux2)+
2815)/ 1028522))ASint)+ @aux1 + 1
END
SET @iYear = @ycycle +(2820 * @cycle)+ 474
IF @iYear <= 0
SET @iYear = @iYear - 1
SET @yday =(@jdn - dbo.persian_jdn(@iYear, 1, 1))+ 1
IF @yday <= 186
SET @iMonth = dbo.Ceil(CAST(@yday ASfloat)/ 31)
ELSE
SET @iMonth = dbo.Ceil(CAST((@yday - 6)ASfloat)/ 30)
SET @iDay =(@jdn - dbo.persian_jdn(@iYear, @iMonth, 1))+ 1
IF @iMonth < 10
SET @tmpMonth=N'0'+CAST( @iMonth aschar(2))
ELSE
SET @tmpMonth =CAST( @iMonth aschar(2))
IF @iDay < 10
SET @tmpDay=N'0'+CAST( @iDay aschar(2))
ELSE
SET @tmpDay =CAST( @iDay aschar(2))
RETURNCAST(@iYear ASchar(4))+N'/'+ @tmpMonth +N'/'+ @tmpDay
END




CREATEFUNCTION [dbo].[IsPersianLeapYear](@iYear bigint)
RETURNSbigintAS
BEGIN
DECLARE @temp bigint
DECLARE @lp bit
IF @iYear > 0
SET @temp =((((dbo.MMod((@iYear -(474)), 2820)+ 474)+ 38)*
682)% 2816)
ELSE
SET @temp =((((dbo.MMod((@iYear -(473)), 2820)+ 474)+ 38)
* 682)% 2816)
IF @temp < 682
SET @lp = 1
ELSE
SET @lp = 0
RETURN @lp
END

ozzy_mra
پنج شنبه 01 دی 1390, 21:14 عصر
ادامه


CREATEFUNCTION [dbo].[Civil2Persian](@CivilDate smalldatetime)
RETURNSchar(10)AS
BEGIN
RETURN dbo.jdn_persian(CAST(@CivilDate asbigint)+2415021)
--RETURN dbo.jdn_persian(dbo.civil_jdn(@year, @month, @day))
END




CREATEFUNCTION [dbo].[Ceil](@number float)
RETURNSbigintAS
BEGIN
RETURNCASESIGN(@number)WHEN-1 THENCEILING(@number)- 1
ELSECEILING(@number)END
END


تابع Civil2persian میلادی رو به شمسی بر می گردونه و تابع Persian2Civil عکس اینه
باز هم با فرض اینکه اسم فیلد تاریخت dt باشه تو کوئری که برای پر کردن گربدت استفاده می کنی به جای SELECT dt از SELECT Civil2Persian(dt) استفاده کن

linux
پنج شنبه 01 دی 1390, 22:27 عصر
ادامه


CREATEFUNCTION [dbo].[Civil2Persian](@CivilDate smalldatetime)
RETURNSchar(10)AS
BEGIN
RETURN dbo.jdn_persian(CAST(@CivilDate asbigint)+2415021)
--RETURN dbo.jdn_persian(dbo.civil_jdn(@year, @month, @day))
END




CREATEFUNCTION [dbo].[Ceil](@number float)
RETURNSbigintAS
BEGIN
RETURNCASESIGN(@number)WHEN-1 THENCEILING(@number)- 1
ELSECEILING(@number)END
END


تابع Civil2persian میلادی رو به شمسی بر می گردونه و تابع Persian2Civil عکس اینه
باز هم با فرض اینکه اسم فیلد تاریخت dt باشه تو کوئری که برای پر کردن گربدت استفاده می کنی به جای SELECT dt از SELECT Civil2Persian(dt) استفاده کن

این کد را من از روی یک کد دیگری که به زبان vb بود تبدیل کردم به sql زمان خدابیامرز sqlserver2000 نحوه محاسبه این کد با چیزی که ماکروسافت دارده فرق می کند و امکانش هست که خروجی که از .net میگیری با این یکی نباشد، از این کد استفاده نکنید بهتر هست می توانی از توابع clr استفاده کنید.

linux
پنج شنبه 01 دی 1390, 22:29 عصر
دارم اینجوری تبدیل میکنم اما ارور میده که استرینگ رو نمیتونم به دیت تایم تبدیل کنم
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
for (int i = 0; i <= dataGridView1.Rows.Count; i++)
{
string d = Convert.ToString(dataGridView1.Rows[idValue].Cells[5].Value);
string sh = Shamsi(d);
dataGridView1.Rows[i].Cells[5].Value = sh;
}
}
string Shamsi(string miladi)
{
DateTime dt = DateTime.Parse (miladi);
PersianCalendar p = new PersianCalendar();
return p.GetYear(dt) + "/" + p.GetMonth(dt) + "/" + p.GetDayOfMonth(dt);
}
کلا کارت اشتباه هست، اینجا که نباید تبدیل را انجام بدهی،در دیتاسورسی که به گرید وصل می کنید باید تغییرات اعمال شده باشد.

مهدی هادیان2
شنبه 10 تیر 1391, 17:37 عصر
بسم الله الرحمن الرحیم
با سلام
دوستان بنده هم دقیقا همین مشکل رو دارم
می دونید چه جوری بدون کامپوننت می شه این کار رو انجام داد در ضمن نمی خوام در سطح بانک این کار روکنم
با سپاس

sobijoon
شنبه 10 تیر 1391, 19:40 عصر
http://http://barnamenevis.org/showthread.php?347662-B-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%A7%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%85%D8%AD%D8%A7%D8%B3%D8%A8%D9%87-%D8%A7%D8%AE%D8%AA%D9%84%D8%A7%D9%81-%D8%A8%DB%8C%D9%86-%D8%AF%D9%88-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D8%A8%D8%A7-%D8%A7%D8%AD%D8%AA%D8%B3%D8%A7%D8%A8-%D9%85%D8%A7%D9%87%D8%A7%DB%8C-29%D9%8830%D9%8831-%D8%B1%D9%88%D8%B2%D9%87-B
این تایپیک کمکتون میکنه

مهدی هادیان2
یک شنبه 11 تیر 1391, 08:17 صبح
با سلام
دوستان به نظرتون کامپوننت هایی که تاریخ میلادی رو به تاریخ شمسی نه رشته شمسی تبدیل می کنند از چه تابع های دات نت استفاده می کنند.
با تشکر