نحوه تبدیل تاریخ میلادی به شمسی با کلاس Persian Culture

نحوه تبدیل تاریخ میلادی به شمسی با کلاس Persian Culture

در این مقاله قصد داریم تا شما را با نحوه‌ی استفاده از کلاس Persian Culture برای تبدیل تاریخ میلادی به شمسی در پروژه های ASP.NET MVC آشنا کنیم.

در پروژه های برنامه نویسی اکثر برنامه نویسان تاریخ را به صورت میلادی ذخیره می کنند و دنبال توابعی هستند بتوانند تاریخ به صورت شمسی به کاربر نمایش دهند.

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

استفاده از کلاس Persian Culture برای نمایش تاریخ میلادی به صورت شمسی

اگر شما از کلاس Persian Culture استفاده کنید دیگر نیاز به تبدیل تاریخ میلادی به شمسی ندارید این کلاس خود تمامی تاریخ های میلادی موجود در صفحات را به صورت شمسی نمایش می دهد.فقط کافیه نحوه ی استفاده از این کلاس را یاد بگیرید. تا دیگر نیازی به تبدیل تاریخ میلادی به شمسی نیاز نداشته باشید

نحوه‌ی استفاده از کلاس Persian Culture

1- یک پروژه جدید ایجاد نمایید :
ابتدا در ویژوال استدیو یک پروژه‌ از نوع ASP.NET Web Application ایجاد کنید.در سپس در قسمت ASP.NET 4.5.2 Templates گزینه Empty را انتخاب کنید و در قسمت Add folders and core references for تیک MVC را بزنید و سپس بر روی دکمه OK کلیک نمایید تا پروژه برای شما ایجاد شود.

2- ایجاد کلاس PersianCulture 

حالا کافیست روی نام پروژه خود در Solution Explorer راست کلیک کنید و سپس موس خود را بر روی گزینه Add ببرید و در منوی باز شده بر روی Class کلیک نمایید و سپس نام Class را PersianCulture قرار دهید و کدهای زیر را درون این class کپی کنید .

 

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;

namespace GSD.Globalization
{

    public class PersianCulture : CultureInfo
   {
        private readonly Calendar cal;
        private readonly Calendar[] optionals;
        public PersianCulture()
            : this("fa-IR", true)
       {
        }

       public PersianCulture(string cultureName, bool useUserOverride)
            : base(cultureName, useUserOverride)
        {
            //Temporary Value for cal.
            cal = base.OptionalCalendars[0];

            //populating new list of optional calendars.
            var optionalCalendars = new List<Calendar>();
            optionalCalendars.AddRange(base.OptionalCalendars);
            optionalCalendars.Insert(0, new PersianCalendar());

            Type formatType = typeof(DateTimeFormatInfo);
            Type calendarType = typeof(Calendar);

            PropertyInfo idProperty = calendarType.GetProperty("ID", BindingFlags.Instance | BindingFlags.NonPublic);
            FieldInfo optionalCalendarfield = formatType.GetField("optionalCalendars",
                                                                  BindingFlags.Instance | BindingFlags.NonPublic);

            //populating new list of optional calendar ids
            var newOptionalCalendarIDs = new Int32[optionalCalendars.Count];
            for (int i = 0; i < newOptionalCalendarIDs.Length; i++)
                newOptionalCalendarIDs[i] = (Int32)idProperty.GetValue(optionalCalendars[i], null);

            optionalCalendarfield.SetValue(DateTimeFormat, newOptionalCalendarIDs);

            optionals = optionalCalendars.ToArray();
            cal = optionals[0];
            DateTimeFormat.Calendar = optionals[0];

            DateTimeFormat.MonthNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
            DateTimeFormat.MonthGenitiveNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
            DateTimeFormat.AbbreviatedMonthNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
            DateTimeFormat.AbbreviatedMonthGenitiveNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };

            DateTimeFormat.AbbreviatedDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
            DateTimeFormat.ShortestDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
            DateTimeFormat.DayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };

            DateTimeFormat.AMDesignator = "ق.ظ";
            DateTimeFormat.PMDesignator = "ب.ظ";

          /*
            DateTimeFormat.ShortDatePattern = "yyyy/MM/dd";
            DateTimeFormat.LongDatePattern = "yyyy/MM/dd";

            DateTimeFormat.SetAllDateTimePatterns(new[] {"yyyy/MM/dd"}, 'd');
            DateTimeFormat.SetAllDateTimePatterns(new[] {"dddd, dd MMMM yyyy"}, 'D');
            DateTimeFormat.SetAllDateTimePatterns(new[] {"yyyy MMMM"}, 'y');
            DateTimeFormat.SetAllDateTimePatterns(new[] {"yyyy MMMM"}, 'Y');
            */

       }

        public override Calendar Calendar
       {
           get { return cal; }
        }

       public override Calendar[] OptionalCalendars
        {
            get { return optionals; }
       }
   }
}

3- سپس در Model مورد نظرویژگی زیر را برای فیلد تاریخ قرار دهید. این ویژگی فرمت نمایش تاریخ را مشخص می کند.

[DisplayFormat(DataFormatString = "{0: yyyy/MM/dd}")]

در مثال زیر من برای فیلد CreateDate از ویژگی [DisplayFormat(DataFormatString = “{0: yyyy/MM/dd}”)] استفاده کرده ام.

public class PagesMetadata
   {
      public int PageID { get; set; }

        [Display(Name = "عنوان")]
        [Required(ErrorMessage = "لطفا {0} را وارد کنید")]
       public string Title { get; set; }

        [Display(Name = "متن")]
        [DataType(DataType.MultilineText)]
        [Display(Name = "تاریخ درج")]
        [DisplayFormat(DataFormatString = "{0: yyyy/MM/dd}")]
       public System.DateTime CreateDate { get; set; }

        [Display(Name = "تصویر")]
        public string ImageName { get; set; }
    }

4- حال کلاس Global.asax باز کنید سپس کد زیر در این صفحه کپی نمایید .

protected void Application_BeginRequest(object sender, EventArgs e) //PersianCulture برای استفاده از کلاس 
       {
            var persianCulture = new PersianCulture();
            Thread.CurrentThread.CurrentCulture = persianCulture;
            Thread.CurrentThread.CurrentUICulture = persianCulture;
        }

5- سپس دو namespace زیر را به Global.asax.cs اضافه کنید :

using System.Threading;
using GSD.Globalization;

6-خوب به همین سادگی موفق شدیم که تاریخ های میلادی را با استفاده از کلاس Persian Culture به شمسی تبدیل کنیم

 

امیدواریم از این مقاله بهره کافی را برده باشید.

سؤالات خود در رابطه با این مقاله و همچنین انتقادات و پیشنهادات خود را در قسمت نظرات با ما در میان بگذارید.


این مقاله فایلی برای دانلود ندارد
برای ارسال نظر نیاز است وارد سایت شوید. در صورت نداشتن حساب کاربری عضو شوید.