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

32 نظر

32 پاسخ

  1. این روشی که استفاده کردن فقط نام روزها و ماه ها رو فارسی می کنه، این امکان با تغییر Culture تقویم هم قابل انجام هست

  2. سلام من با این مشکل مواجه شدن میشه راهنمایی بفرمائید از .NetCore 2.1 هم استفاده کردن

    1. سلام وقتتون بخیر
      لطفا پیغام خطا رو ارسال کنید عکس واضح نیست.

  3. سلام
    من از این کد استفاده کردم ولی وقتی dayofweek میگیرم همون روزهای Sunday , … نشون میده درحالی که DateTimeFormat.DayNames = new string[] { “یکشنبه”, “دوشنبه”, “ﺳﻪ شنبه”, “چهارشنبه”, “پنج شنبه”, “جمعه”, “شنبه” }; رو دارم

    1. سلام وقتتون بخیر
      از پکیج PersianDateTime استفاده نمایید.

  4. سلام، چطور میتوان پنج شنبه و جمعه ها رو در persian calendar غیر فعال کنیم؟ ( از bootstrap-datepicker.fa و ajax برای تقویم فارسی استفاده میکنم)

    1. سلام وقتتون بخیر
      شما باید داکیومنت های bootstrap-datepicker.fa را بررسی کنید و ببینید آیا همچین قابلیتی را داراست در غیر این صورت باید کدهای این پلاگین را سفارشی سازی کنید.
      من متاسفانه تجربه ای در این زمینه ندارم.

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

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

  6. سلام و خسته نباشید
    ببخشید من این مثال رو تو 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

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

    2. سلام.مشکلتون حل شد؟من هم همین مشکلو دارم و پکیج persianDateTime رو نصب کردم ولی نمیتونم چجوری باهاش کار کنم

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

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

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

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

    2. سلام خانم ابراهیمی.این کلاس روی لوکال بخوبی کار میکنه،ولی وقتی روی هاست ویندوز سرور پابلیش میشه
      تمام تاریخ ها به صورت میلادی نشون داده میشه.
      میشه لطفا راهنمایی کنین

      1. سلام وقتتون بخیر
        تاریخ سرور شاید میلادی باشه و این مشکل رو ایجاد کرده باشه.

  9. سلام… من از 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

  10. با سلام
    من استفاده کردم از این کلاسا و در بالای فیلد در متا دیتا به عنوان 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 استفاده کردید؟

  11. با سلام و احترام
    من از روش استفاده کرده ام ولی در 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 قرار بدید . موفق باشید.

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

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.

حداکثر حجم فایل برای آپلود: 1 مگابایت. فایل‌های مجاز برای آپلود: عکس, ویس, ویدیو, ورد یا پی دی اف, فایل متنی, زیپ. شما می‌تونید برای بهتر پرسیدن سوالتون، عکس یا ویس یا حتی فیلم در بخش نظرات میزفا آپلود کنید. برای ضبط ویس می‌تونید از خود واتس آپ استفاده کنید و بعد اینجا آپلود کنید و برای ارسال عکس هم کافی هست اسکرین شات بگیرید. Drop file here

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

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

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