نمایش تاریخ میلادی به صورت شمسی با کلاس Persian Culture در Asp.Net MVC

آموزش استفاده از کلاس PersianCulture در Asp.Net MVC
آموزش استفاده از کلاس PersianCulture در Asp.Net MVC

تبدیل تاریخ میلادی به شمسی در ASP.NET MVC

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

به طور معمول اکثر برنامه نویسان تاریخ را به صورت میلادی در دیتابیس ذخیره می‌کنند و زمانی که می‌خواهند این تاریخ را به کاربر نمایش دهند به دنبال توابعی می‌گردند تا با استفاده از آن تاریخ میلادی ذخیره شده در دیتابیس را به شمسی تبدیل کنند.
حال شما تصور کنید که در یک پروژه بزرگ نیاز دارید که به تعداد دفعات متعدد تاریخ ها رابه شمسی تبدیل کرده و در صفحه وب نمایش دهید در این صورت ناچارید که تابع تبدیل تاریخ میلادی به تاریخ شمسی را برای تک تک تاریخ ها فراخوانی کنید و این کار شاید کمی دردسرساز به نظر برسد.

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

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

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

1- یک پروژه جدید ایجاد نمایید :
ابتدا در ویژوال استدیو  2017 یا 2015 یک پروژه‌ی جدید از نوع 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 و یا ViewModel خود ویژگی زیر را برای فیلد تاریخ قرار دهید. این ویژگی فرمت نمایش تاریخ را مشخص می کند.

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

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

آموزش استفاده از کلاس PersianCulture
آموزش استفاده از کلاس PersianCulture

4- حال در Solution Explorer بر روی Global.asax کلیک کرده تا صفحه Global.asax.cs برای شما باز شود سپس کد زیر در این صفحه کپی نمایید .

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 به صورت شمسی به در صفحات وب نشان دهید.

خب به پایان این مقاله آموزشی Asp.Net MVC رسیدیم . درصورتی که سوالی داشتید حتما در قسمت نظرات این مقاله آموزشی ASP.NET MVC مطرح کنید.

 

فیلم آموزشی asp.net core 2

آرزو ابراهیمی
بیش از 6 سال است که زمینه طراحی و توسعه سایت فعالیت می‌کنم، طراح و برنامه نویس انواع سامانه‌های تخصصی پزشکی، مناقصات، فروشگاهی و … بودم و هستم و هدفم در سایت میزفا ارائه اطلاعات بروز و ناب در زمینه طراحی سایت است. تا از این طریق بتونم تجربیات و دانسته های خودم را با تمامی علاقمندان به مباحث طراحی سایت به اشتراک بزارم .

فیلم آموزشی asp.net core 2

31 نظر

با موفقیت ثبت شد، میزفا از شما برای عضویت در خبرنامه هفتگی تشکر میکند.

عضویت در خبرنامه هفتگی برای دریافت:

  • فیلم و مقاله رایگان سئو
  • آموزش‌های UX ، GA و GTM
  • مقاله های تخصصی ASP.NET Core
  • اطلاع رسانی از محصولات
فیلم آموزشی asp.net core 2
ترک میزفا خوب نیست!
دوره سئو، رایگان شد.
فرصتی رایگان برای یادگیری
کاراکتر اشاره گر
دوره سئو، رایگان شد.
فرصتی رایگان برای یادگیری
کاراکتر اشاره گر