PDA

View Full Version : جایگزین کردن تاریخ خورشیدی به جای تاریخ میلادی



csharp2008
چهارشنبه 06 مرداد 1389, 11:21 صبح
سلام دوستان
من یک وب فرم دارم و تو اون از کنترل های داده ای مثل Datagridview یا detailsview و ... استفاده می کنم. این کنترل ها داده های خودشون رو از جداولی که تو SQL تعریف کردم می گیرن. مشکل اینجاست که تاریخ توی جداول به فرمت پیش فرض خود SQL که میلادی هست ذخیره میشه، ولی من می خوام وقتی این تاریخ ها روی کنترل ها میاد، به خورشیدی تبدیل شن.

از کد زیر هم توی web.config استفاده کردم، اما نشد

<globalization culture="ir-fa" cultrueui="ir-fa">

eyes_shut_number1
چهارشنبه 06 مرداد 1389, 11:44 صبح
باید از یه کامپوننت استفاده کنی (مثل تاریخ Pesiantools) و در هنگام نمایش به کاربر با این کامپوننت تاریخ رو از میلادی به شمسی کامورت کنی

csharp2008
چهارشنبه 06 مرداد 1389, 11:46 صبح
باید از یه کامپوننت استفاده کنی (مثل تاریخ Pesiantools) و در هنگام نمایش به کاربر با این کامپوننت تاریخ رو از میلادی به شمسی کامورت کنی

میشه بیشتر توضیح بدی ؟

Peyman.Gh
چهارشنبه 06 مرداد 1389, 11:59 صبح
System.Globalization.PersianCalendar

csharp2008
چهارشنبه 06 مرداد 1389, 12:02 عصر
من با این کلاس آشنایی کامل دارم، اما می خوام ببینم وفتی دیتا داره به کنترل Bind میشه، چطوری تاریخ خورشیدی رو با استفاده از همین کلاس جاگیزین تاریخ میلادی کنیم.

Peyman.Gh
چهارشنبه 06 مرداد 1389, 12:06 عصر
رشته تاریخ شمسی را در پایگاه داده ذخیره کنید.

csharp2008
چهارشنبه 06 مرداد 1389, 12:15 عصر
علت این که از روش ذخیره کردن تاریخ خورشیدی به صورت رشته در پایگاه داده استفاده نکردم، این بود که دستم رو می بست. حالا این کار رو می تونم برای جداول خودم انجام بدم، اما برای جدوال مربوط به UserMemership خود ASP.NET چطور ؟

Peyman.Gh
چهارشنبه 06 مرداد 1389, 13:41 عصر
خوب موقع نیاز تاریخ شمسی را به تاریخ میلادی تبدیل کنید.

Mostafa_Dindar
چهارشنبه 06 مرداد 1389, 13:53 عصر
سلام دوستان
من یک وب فرم دارم و تو اون از کنترل های داده ای مثل Datagridview یا detailsview و ... استفاده می کنم. این کنترل ها داده های خودشون رو از جداولی که تو SQL تعریف کردم می گیرن. مشکل اینجاست که تاریخ توی جداول به فرمت پیش فرض خود SQL که میلادی هست ذخیره میشه، ولی من می خوام وقتی این تاریخ ها روی کنترل ها میاد، به خورشیدی تبدیل شن.

از کد زیر هم توی web.config استفاده کردم، اما نشد

<globalization culture="ir-fa" cultrueui="ir-fa">


برای مشکل تاریخ شمسی و میلادی چندین راه حل وجود دارد . یکی از راه حلهای خوب این است که تاریخ را به صورت میلادی در دیتابیس ذخیره کنید , و هر جا که نیاز بود هنگام ارائه به کاربر در UI به شمسی تبدیل و نمایش دهید و در بقیه جاها (لایه دیتا و لایه تجاری و خود دیتابیس ) به صورت میلادی باشد , چون کار با آن بسیار راحت تر و سریعتر است .

در این حالت شما نیاز به یک متد کمکی استاتیک که تاریخ میلادی را به تاریخ شمسی به صورت رشته ای تبدیل میکند , نیاز دارید .
در صورتی که از Object ها استفاده کرده باشید , کافیه که یک پراپرتی فقط خواندنی که تاریخ میلادی رو به رشته شمسی تبدیل میکند استفاده کنید .
در صورتی که از Object ها استفاده نمیکنید , مثلا از SqlDataSource استفاده میکنید , از رویداد RowDataBound کنترلهای داده ای میتوانید استفاده کنید و تغیر تاریخ را انجام بدید .

موفق باشید

csharp2008
چهارشنبه 06 مرداد 1389, 14:50 عصر
من از object ها استفاده می کنم، بدین ترتیبی که شما می گید باید یه خاصیت جدید توی کلاس های Business تعریف کنم، تا تاریخ گرفته شده از SQL رو برای اون موجودیت تبدیل به فارسی کنه، و بدین ترتیب از اون فیلد برای نمایش تاریخ ها توی کنترل هام استفاده کنم.

از راه حلی که ارائه کردید ممنونم Mostafa_Dindar گرامی

ASP.NET2
جمعه 26 شهریور 1389, 02:43 صبح
برای مشکل تاریخ شمسی و میلادی چندین راه حل وجود دارد . یکی از راه حلهای خوب این است که تاریخ را به صورت میلادی در دیتابیس ذخیره کنید , و هر جا که نیاز بود هنگام ارائه به کاربر در UI به شمسی تبدیل و نمایش دهید و در بقیه جاها (لایه دیتا و لایه تجاری و خود دیتابیس ) به صورت میلادی باشد , چون کار با آن بسیار راحت تر و سریعتر است .

در این حالت شما نیاز به یک متد کمکی استاتیک که تاریخ میلادی را به تاریخ شمسی به صورت رشته ای تبدیل میکند , نیاز دارید .
در صورتی که از Object ها استفاده کرده باشید , کافیه که یک پراپرتی فقط خواندنی که تاریخ میلادی رو به رشته شمسی تبدیل میکند استفاده کنید .
در صورتی که از Object ها استفاده نمیکنید , مثلا از SqlDataSource استفاده میکنید , از رویداد RowDataBound کنترلهای داده ای میتوانید استفاده کنید و تغیر تاریخ را انجام بدید .

موفق باشید
میشه در این مورد یک مثال تو C# بذاری؟ خیلی ممنون.

amordad
جمعه 26 شهریور 1389, 04:56 صبح
با سلام
دوست من شما میتوانید با استفاده از کلاس persianutils که توسط آقای خندان در سال های پیش تولید شده تمام تاریخ ها را بصورت میلادی ذخیره ولی بصورت شمسی نمایش دهید، حتی این کار را با کلندر هم میتوانی انجام دهی فقط کافیست این کلاس را به پرو|ه خود add کرده و متد آن را در pageload صدا بزنی، یک نمونه آماده کردم دانلود کن.
موفق باشی

ASP.NET2
جمعه 26 شهریور 1389, 15:29 عصر
مرسی .مفید بود.
حالا اگه بخواییم تاریخ رو به جای اینکه مثلاً شنبه 16 شهریور 1389 نشون بده اینجوری 89/1/1 نشون بده چکار باید کرد.یعنی حروفی هاشو نشون نده.

ASP.NET2
جمعه 26 شهریور 1389, 16:09 عصر
خودم حلش کردم.
برا این کار باد تو این کلاس این مقدار ها رو
info.ShortDatePattern = "yyyy/MMMM/dddddd";
info.LongDatePattern = "yyyy/MMMM/dddddd";به اینا تغییر بدی

info.ShortDatePattern = "yyyy/MM/dd";
info.LongDatePattern = "yyyy/MM/dd";تموم شد.

ASP.NET2
یک شنبه 28 شهریور 1389, 02:22 صبح
ولی متاسفانه این کلاس تو Framework 4 کار نمی کنه.
دوباره برگشتیم سر جای اولمون :افسرده:
حالا چاره چیه ؟

maxpayn2
یک شنبه 28 شهریور 1389, 09:06 صبح
این صفحه رو ببینید ، در ASP.NET 4 هم کار میکنه

http://persianculture.codeplex.com

وقتی فایل مربوطه روی سرور نصب شد در Global.asax اینجوری مینویسیم :




protected void Application_BeginRequest(object sender, EventArgs e)
{
// http://persianculture.codeplex.com
// Install above patch first! or following lines will not work fine.

CultureInfo culture_info = new CultureInfo("fa-IR");
culture_info.DateTimeFormat.Calendar = new PersianCalendar();

System.Globalization.DateTimeFormatInfo dt_info = culture_info.DateTimeFormat;

dt_info.AbbreviatedDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
dt_info.ShortestDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
dt_info.DayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };
dt_info.AbbreviatedMonthNames = new string[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
dt_info.MonthNames = new string[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
dt_info.AMDesignator = "ق.ظ";
dt_info.PMDesignator = "ب.ظ";
dt_info.ShortDatePattern = "yyyy/MM/dd";
dt_info.LongDatePattern = "yyyy/MM/dd";
dt_info.FirstDayOfWeek = DayOfWeek.Saturday;

Thread.CurrentThread.CurrentCulture = culture_info;
}



اینجوری کافیه تاریخ میلادی توی دیتابیس ذخیره بشه و هر جا خواستید بدون هیچ تغییر یا کانورتی نمایش بدید ، خودش اتوماتیک شمسی میشه ، حتی Date Picker ها هم شمسی میشن

ASP.NET2
دوشنبه 29 شهریور 1389, 00:23 صبح
سلام
من این Patch رو نصب کردم و این کدی که شما داده بودی به همون صورت تو Global.aspx قرار دادم .ولی خوب Erorr داره. برا درست شدنش دیگه باید چکار کنم؟ من که این صفحه http://persianculture.codeplex.com/رو کامل خوندم اونم گفته Pach رو نصب کن و چیزه دیگه ای نگفته.اگه می تونید یه مثال برام اینجا بگذارید ممنون میشم.

mohsen507
دوشنبه 29 شهریور 1389, 00:32 صبح
سلام
من این Patch رو نصب کردم و این کدی که شما داده بودی به همون صورت تو Global.aspx قرار دادم .ولی خوب Erorr داره. برا درست شدنش دیگه باید چکار کنم؟ من که این صفحه http://persianculture.codeplex.com/رو (http://persianculture.codeplex.com/%D8%B1%D9%88) کامل خوندم اونم گفته Pach رو نصب کن و چیزه دیگه ای نگفته.اگه می تونید یه مثال برام اینجا بگذارید ممنون میشم.

سلام اگه داريد با پروژه رو لوكال كار مي كنيد كه هيچ با نصب اون پچ مشكل حل ميشه

ولي زماني كه بره روي هاست چي؟ اونجا اصلا اين نصب رو انجام ميدهند( كه اين كار رو انجام نميدهند احتمال نصب اين پچ توسط مدير اون سرور 3% !!!!!)

ASP.NET2
دوشنبه 29 شهریور 1389, 00:37 صبح
سلام اگه داريد با پروژه رو لوكال كار مي كنيد كه هيچ با نصب اون پچ مشكل حل ميشه

ولي زماني كه بره روي هاست چي؟ اونجا اصلا اين نصب رو انجام ميدهند( كه اين كار رو انجام نميدهند احتمال نصب اين پچ توسط مدير اون سرور 3% !!!!!)
تا اونجایی که من از بچه ها شنیدم رو IranHost نصب هستش.خوب شما اگه از هاست خودتون درخواست کنید و اون ها هم ببینن که مشکلی نداره و یه چیزه تایید شده هستش !چرا نصبش نکنن بالاخره اونا هم می خوان مشتری جذب کنن دیگه.
جالب اینجاست که برا من او Local هم کار نمی کنه.

ASP.NET2
دوشنبه 29 شهریور 1389, 00:47 صبح
برا من اصلاً این فایل Setup چه Exe و چه MSI چیزی رو نصب نمی کنه. یعنی نه فولدری درست می کنه و نه چیزی .نمی دونم چکار کنم .

mohsen507
دوشنبه 29 شهریور 1389, 00:53 صبح
نصب اين پچ روي IranHost تا اونجايي كه من اطلاع دارم با پيگيري هاي آقاي كرامتي انجام شده و بعد از جند ماه .

كلاس خوبي هست و من تو پروژه هام زياد ازش استفاده كردم

اين پست ها هم صرفا جهت اطلاع رساني بود تا دوستان بتونند بهتر تصميم بگيرند :لبخندساده:

aftab_mahtab
دوشنبه 29 شهریور 1389, 10:22 صبح
با سلام خدمت اساتيد عزيز
به نظر من بهترين راه اينه كه ميخوام بگم . من سالهاست با اين روش كار ميكنم ، براي بايند اطلاعات هم هيچ اشكالي پيش نمياد .
اول اينكه شما تمامي تاريخها رو بصورت ميلادي در ديتابيس ذخيره كنيد و سپس براي خوندن اونها و بايند به هر كنترلي در ASP.NET يا هر چيز ديگه ميتونيد از يك فانكشن كه در ديتابيس نوشتيد استفاده كنيد ، به اين صورت كه در رشته سلكت خود تاريخ فيلد ميلادي رو بخونه و خروجي شمسي بهتون بده : مثال :

چون من با بانك اراكل كار ميكنم : يه فانكشن دارم كه پارامتر ميلادي ميگيره و خروجي شمسي ميده . كد داخل فانكشن اينه :



SELECTto_char(SYSDATE,'yyyy/mm/dd','nls_calendar=persian')FROM DUAL;

كه SYSDATE تاريخ جاري سيستم هست ولي شما ميتونيد بجاي اون ورودي فانكشن رو بديد و خروجي شمسي بگيريد .
مثال :


SELECT id1,id2,id3,ToShamsi(id4) as shamsidate from tbl1 ;

كه تو شمسي همون فانكشني كه بالا گفتم .حالا خروجي اين سلكت همراه با تاريخ فارسي هست . كه به راحتي ميشه به هر كنترلي بايندش كرد .
والسلام . خوش باشيد .