مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

ehsani2013

عضویت از 1394/12/06

ذخيره تاريخ در ديتابيس به صورت ميلادي و فراخواني و نمايش به صورت شمسي

  • پنجشنبه 12 اسفند 1395
  • 23:22
تشکر میکنم

با سلام 

ذخيره تاريخ در ديتابيس به صورت ميلادي و فراخواني و نمايش به صورت شمسي

ميخواستم بدونم چطوري ميشه اين مورد رو پياده سازي كرد . يعني به صورت اتوماتيك تاريخي شمسي كه كاربر انتخاب كرده زمان ذخيره توي ديتابيس به صورت ميلادي ذخيره بشه و برعكس موقع خوندن وقتي كه ميلادي ذخيره شده شمسي فراخواني و نمايش داده بشه . 

يعني كلان رو نوع DateTime حساس باشه . 

پاسخ های این پرسش

تعداد پاسخ ها : 5 پاسخ
کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • جمعه 13 اسفند 1395
  • 07:44

میتونید از کلاس زیر استفاده کنید

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;

        /// <summary>
        /// كد رو بخوان تا بفهمي
        /// </summary>
        /// <param name="cultureName">fa-IR</param>
        /// <param name="useUserOverride">true</param>
        /// <remarks>لطفا در هنگام استفاده به سايت سايان اشاره كنيد.</remarks>
        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; }
        }
    }
}

بعد رویداد زیر رو به Global اضافه کنید

       protected void Application_BeginRequest(object sender, EventArgs e)
        {
            var persianCulture = new PersianCulture();
            Thread.CurrentThread.CurrentCulture = persianCulture;
            Thread.CurrentThread.CurrentUICulture = persianCulture;
        }

کاربر سایت

ehsani2013

عضویت از 1394/12/06

  • جمعه 13 اسفند 1395
  • 10:47

ممنونم آقاي مدائني عزيز 

پيشنهاد شما براي استفاده انواع DateTime چيه ؟ 

DateTime يا datetime2(7) يا datetimeoffset(7)

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • جمعه 13 اسفند 1395
  • 11:44

من از DateTime استفاده میکنم

کاربر سایت

ehsani2013

عضویت از 1394/12/06

  • یکشنبه 26 آذر 1396
  • 20:48

سلام آقاي مدائني عزيز 

اين كلاس با كامپوننت FADatePicker تداخل دارن . البته تويه Winform . تداخلشون هم به اين صورته كه وقتي تاريخ رو توي picker انتخاب ميكني و ميري روي آبجكت ديگه اي توي صفحه تاريخ توي picker ميلادي ميشه ! وقتي كه Culture رو به fa-IR تغيير ميدي مشكل برطرف ميشه اما اين راه حل مشكلاتي رو ايجاد ميكنه تو كدهام .

شما راه حلي براي اين مشكل دارين ؟ 

جايگزين مناسبتري براي FADatePicker دارين ؟

ممنونم .

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • دوشنبه 27 آذر 1396
  • 09:41
کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)