آموزش طراحی سایتنکات و ترفندهای Asp.Net MVC

نمایش تاریخ میلادی به صورت شمسی با کلاس Persian Culture در 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 مطرح کنید.

 

برچسب ها

آرزو ابراهیمی

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

نوشته های مشابه

‫20 نظرها

  1. باسلام. وقت بخیر. درهنگام پاس دادن تاریخ شمسی به سمت سرور، تاریخ شمسی به صورت نادرست تبدیل می شود.
    به طور مثال تاریخ 1397/11/14 به تاریخ 0776/08/24 12:00:00 ق.ظ تبدیل می شود. چرا با این مشکل مواجه می شود؟
    باتشکر

    1. سلام وقت شما هم بخیر … شاید علتش اینه که تاریخ سیستم شما به صورت شمسی هست … پیشنهاد میکنم از پکیج PersianDataTime برای تبدیل تاریخ ها استفاده کنید. می تونید از طریق nuget این پکیج رو نصب کنید.

  2. سلام و خسته نباشید
    ببخشید من این مثال رو تو web application اجرا کردم مشکلی نداشت ولی تو asp.net core در
    این کد خط newOptionalCalendarIDs[i] = (Int32)idProperty.GetValue(optionalCalendars[i], null); با مشکل زیر
    System.InvalidCastException: ‘Unable to cast object of type ‘System.Globalization.CalendarId’ to type ‘System.Int32′.’
    مواجه میشد ،
    نمیدونم توی دات نت کر تنظیمات خاصی لازمه انجام شه ؟
    تنظیمات global رو هم توی کانستراکتور startup نوشتم

       public class Startup
        {
            public Startup(IHostingEnvironment env)
            {
                var persianCulture = new PersianCulture();
                Thread.CurrentThread.CurrentCulture = persianCulture;
                Thread.CurrentThread.CurrentUICulture = persianCulture;
    }
    }

    اگه بتونین راهنمایی کنین ممنون میشم

    1. سلام پیشنهاد میکنم برای تبدیل تاریخ میلادی و شمسی از پکیج PersianDateTime استفاده کنید. با دستور زیر می تونید نصبش کنید
      Install-Package MD.PersianDateTime.Core

  3. سلام خسته نباشید،میشه راهنمایی کنید که اگر بخوام تاریخ میلادی رو به صورت شمسی در داخل GridView نمایش بدم باید چیکار کنم؟ممنون

    1. سلام ممنون … می تونید از پکیج PersianDateTime استفاده کنید و از طریق Nuget نصبش کنید …. موفق باشید.

  4. سلام
    فرض کنید از این روش در برنامه استفاده کرده ایم
    اما میخواهم در یک view تاریخ مورد نظر بصورت میلادی (مثلا 2017/01/01)نمایش داده شود نه شمسی باید چکار کرد

    1. با سلام …. استفاده از این روش باعث میشه به محض اجرای پروژه تمام تاریخ های میلادی شمسی نمایش داده شوند پیشنهاد میکنم از PersianDateTime برای تبدیل تاریخ میلادی به شمسی وبالعکس استفاده کنید.

  5. سلام… من از visual 2017 استفاده کردم … نیاز هست کد به شکل زیر تغییر کنه:
    در DefaultController
    public ActionResult Index()
    {
    string s = DateTime.Now.ToShortDateString();
    DateTime date = Convert.ToDateTime(s);
    PersianCulture p = new PersianCulture();
    string dp = (p.Calendar.GetYear(date) + “/” + p.Calendar.GetMonth(date) + “/” + p.Calendar.GetDayOfMonth(date)+p.Calendar.GetDayOfWeek(date));
    ViewBag.s = dp;
    return View();
    }
    نمایش در view:
    @ViewBag.s

  6. با سلام
    من استفاده کردم از این کلاسا و در بالای فیلد در متا دیتا به عنوان validation تعریف کردم ولی جواب نمیده چرا؟؟

    1. [Display(Name = “تاریخ”)]
      [DisplayFormat(DataFormatString = “{0:dddd,dd MMMM yyyy}”)]

      public Nullable date { get; set; }

      1. کدی که شما نوشتید برای فرمت تاریخ هست اگه این کد براتون کار نمیکنه می تونید داخل ویو از متد ToString(“yyyy/MM/dd”) برای فرمت تاریخ استفاده کنید. به صورت زیر :

        Model.Date.ToString("yyyy/MM/dd")@

    2. با سلام … این کلاس برای نمایش تاریخ میلادی به صورت شمسی به کار میره نمیشه ازش برای اعتبارسنجی تاریخ استفاده کرد … شما برای Validation از کدهای کلاس PersianCulture استفاده کردید؟

  7. با سلام و احترام
    من از روش استفاده کرده ام ولی در View مربوط به EDIT هنگام استفاده از کد زیر با خطا مواجه می شود. لطفا راهنمایی نمایید.
    @Html.EditorFor(model => model.StoreOut.OutDate, new { htmlAttributes = new { @class = “form-control” } })
    Specified time is not supported in this calendar. It should be between 03/22/0622 00:00:00 (Gregorian date) and 12/31/9999 23:59:59 (Gregorian date), inclusive.
    Parameter name: time
    با تشکر

    1. با سلام … این خطا در View اتفاق میوفته یا در اکشن متد ؟ تابعی که استفاده شده در بعضی مواقع ممکنه تاریخ میلادی رو هنگام اجرای متد اکشن به شمسی تبدیل کنه و من خودم چندین بار به این مشکل برخوردم … برای تبدیل تاریخ میلادی به شمسی و بالعکس می تونید از پکیج PersianDateTime استفاده کنید. از طریق nuget هم می تونید به برنامه اضافش کنید.

    1. با سلام در ASP.NET Core کدهای بخش Global.asax رو در فایل Startup.cs قرار بدید . موفق باشید.

  8. سلام هنگام ذخیره در دیتابیس برعکس تاریخ دخیره میشود چکار کنم؟

    1. سلام … با کلاس Persian Culture شما فقط می تونید تاریخی که به صورت میلادی در دیتابیس ذخیره شده است را به صورت شمسی نمایش بدهید اگر از این کلاس استفاده کردید و تاریخ را به صورت برعکس نشان می دهد می توانید با (“yyyy/MM/dd”)ToString تاریخ را اصلاح کنید.
      نحوه استفاده در کنترلر
      Date.ToString("yyyy/MM/dd")
      و نحوه استفاده در View
      item.Date.Value.ToString("yyyy/MM/dd")@

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا
سایت خود را در گوگل مدیریت کنید + ۱۵ ساعت فیلم آموزشیجزئیات بیشتر اینجا کلیک کنید
بستن
با موفقیت ثبت شد، میزفا از شما برای عضویت در خبرنامه هفتگی تشکر میکند.

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

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