50٪ تخفیف روی تمام دوره‌ها!
پایان تخفیف تا:
مشاهده دوره‌ها
0

درست کار نکردن تبدیل تاریخ شمسی به میلادی در c#

سلام دوستان من تاریخ خورشیدی را به صورت رشته وارد برنامه میکنم مثلا تاریخ 13960816

زمانی که من این تاریخ را به میلادی تبدیل میکنم در تبدیل دچار مشکل میشوم

از دو راه برای تبدیل رفتم

روش اول:

if (DateTime.TryParseExact(searchWord, "yyyy/MM/dd", CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces, out DateTime date))

روش دوم

                            var dates = Convert.ToDateTime(searchWord, new CultureInfo("en-US"));

ولی تاریخی که بر میگردان Date = {07750526 12:00:00}

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

سلام دوستان من تاریخ خورشیدی را به صورت رشته وارد برنامه میکنم مثلا تاریخ 1396/08/16
زمانی که من این تاریخ را به میلادی تبدیل میکنم در تبدیل دچار مشکل میشوم
از دو راه برای تبدیل رفتم 
روش اول:
<c#>
if (DateTime.TryParseExact(searchWord, yyyy/MM/dd, CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces, out DateTime date))
<c#>
روش دوم
<c#>
                            var dates = Convert.ToDateTime(searchWord, new CultureInfo(en-US));

<c#>

ولی تاریخی که بر میگردان /Date = {0775/05/26 12:00:00}/

من در فایل Global هم نمایش تاریخ رو به صورت فارسی قرار دادم اما در دیتابیس به صورت میلادی ذخیره میشود
||https://tosinso.com/files/get/a99990e9-7a4c-459c-b297-47594a7dfd9e||
من کلا گیج شدم من الان کاری به نمایش فارسی تاریخ ندارم الان دارم رشته  1396/08/16 میدهم باید به میلادی تبدیل کند ، تبدیل هم انجام میدهد با توجه به TryParseExact اما سال 0775 از کجا میارود چطوری 1396 را به 0775 میلادی تبدیل کرده است؟ (حتما ماه و روز هم اشتباه است)

من کلا گیج شدم من الان کاری به نمایش فارسی تاریخ ندارم الان دارم رشته 13960816 میدهم باید به میلادی تبدیل کند ، تبدیل هم انجام میدهد با توجه به TryParseExact اما سال 0775 از کجا میارود چطوری 1396 را به 0775 میلادی تبدیل کرده است؟ (حتما ماه و روز هم اشتباه است)

پرسیده شده در 1396/08/22 توسط

3 پاسخ

1

با سلام

در خصوص تبدیل تاریخ به نظرم زیبا ترین روش استفاده از کالچرهاست با این روش شما تاریخ را در فیلد استاندارد DateTime و به صورت میلادی ذخیره می کنید و در هنگام نمایش یا محاسبات با تغییراتی که در Global سایت انجام می دهید برنامه را مجبور می کنید که از کالچر شما استفاده کند.

1- ابتدا دستورات زیر را به Global اضافه کنید.


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

2- بعد یک کلاس با محتوای زیر به پروژه اضافه کنید.

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;

        /// <param name="cultureName">fa-IR</param>
        /// <param name="useUserOverride">true</param>
        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; }
        }
    }
}
پاسخ در 1396/08/23 توسط
2
using System;
using System.Globalization;
namespace _100
{
    class Program
    {
        static void Main(string[] args)
        {
            var datetime = "13960822";
            var c = new PersianCalendar();
            var date = c.ToDateTime(Convert.ToInt32(datetime.Substring(0,4)), Convert.ToInt32(datetime.Substring(4,2)), Convert.ToInt32(datetime.Substring(6,2)), 0, 0, 0, 0);
            var date1 = date.ToString("yyyy-MM-dd");
            Console.WriteLine(date1);
            Console.ReadKey();

        }
    }
}

پاسخ در 1396/08/22 توسط
0

برای نمایش فارسی تاریخ از همین روش رفتم و درست هم نمایش میدهد اما نکتی که وجود دارد این هست که روی ویژوال استادیو 2017 تاریخ ها رو به صورت خورشیدی ثبت میکند ! در صورتی که با هیمن روش روی ویژوال 2015 تاریخ ها به میلادی ثبت میشوند !

برای نمایش فارسی تاریخ از همین روش رفتم و درست هم نمایش میدهد اما نکتی که وجود دارد این هست که روی ویژوال استادیو 2017 تاریخ ها رو به صورت خورشیدی ثبت میکند ! در صورتی که با هیمن روش روی ویژوال 2015 تاریخ ها به میلادی ثبت میشوند !
||https://web.tosinso.com/files/get/b814fa1a-525e-4f28-8722-99eac421a226||

خیلی جالب شد
نمیدونم مشکل از ویندوز من هست که تاریخ را فارسی نمایش میدهد یا از خود ویژوال 
در پایگاه داده به صورت دستی 2017/08/11 را اضافه کردم و به همین صورت (میلادی) نمایش داده میشود

خیلی جالب شد

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

در پایگاه داده به صورت دستی 20170811 را اضافه کردم و به همین صورت (میلادی) نمایش داده میشود

پاسخ در 1396/08/23 توسط

پاسخ شما