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

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

تاریخ شمسی

یکشنبه, 23 تیر 1398 14:40

تاریخ شمسی

با سلام خدمت همه دوستان و اساتید گرامی !

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

و میخوام دوستانی که در این زمینه توانایی دارن راهنماییم کنند . وی بی و سی شارپ رو میتونم کار کنم . اگر رفرنسی هم سراغ دارین لطفا معرفی بفرمایید که وقتتون رو زیاد تلف نکنم .

با تشکر

یکشنبه, 23 تیر 1398 21:30

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace instituteash
{
    public class HejriShamsiDate
    {

        // Fields
        protected int day;
        protected int month;
        protected int year;

        // Methods
        public int AddDays(int days)
        {
            int num = Shamsi2Miladi(this.ToInteger());
            DateTime time = new DateTime(num / 0x2710, (num / 100) % 100, num % 100);
            int num2 = Miladi2Shamsi(time.AddDays((double)days));
            if (this.year < 100)
            {
                this.Year = (num2 / 0x2710) % 100;
            }
            else
            {
                this.Year = num2 / 0x2710;
            }
            this.Month = (num2 / 100) % 100;
            this.Day = num2 % 100;
            return (((this.year * 0x2710) + (this.month * 100)) + this.day);
        }

        public static int AddDays(int date, int days)
        {
            HejriShamsiDate date2 = ExtractDate(date);
            date2.AddDays(days);
            date2.Validate();
            return date2.ToInteger();
        }

        public int AddMonths(int months)
        {
            if (!CheckShamsiDate((long)this.ToInteger()))
            {
                throw new Exception("The Date is not valid");
            }
            int nYear = this.ToInteger() / 0x2710;
            int num2 = (this.ToInteger() / 100) % 100;
            nYear = months / 12;
            num2 = months % 12;
            nYear += this.ToInteger() / 0x2710;
            if (months != 0)
            {
                if (months > 0)
                {
                    num2 += this.month;
                    if (num2 > 12)
                    {
                        nYear++;
                        num2 -= 12;
                    }
                }
                else
                {
                    num2 += this.month - 12;
                    if ((num2 * -1) >= 12)
                    {
                        nYear--;
                        num2 *= -1;
                    }
                    else
                    {
                        num2 = 12 - (num2 * -1);
                    }
                }
            }
            if ((!isKabiseh(nYear) && (num2 == 12)) && (this.day == 30))
            {
                this.Day = 0x1d;
            }
            if ((num2 > 6) && (this.day == 0x1f))
            {
                this.Day = 30;
            }
            this.Year = nYear;
            this.Month = num2;
            return this.ToInteger();
        }

        public static int AddMonths(int date, int months)
        {
            HejriShamsiDate date2 = ExtractDate(date);
            date2.AddMonths(months);
            date2.Validate();
            return date2.ToInteger();
        }

        public int AddYears(int years)
        {
            if (!CheckShamsiDate((long)this.ToInteger()))
            {
                throw new Exception("The Date is not valid");
            }
            int nYear = this.ToInteger() / 0x2710;
            nYear += years;
            this.Year = nYear;
            if ((!isKabiseh(nYear) && (this.Month == 12)) && (this.Day == 30))
            {
                this.Day = 0x1d;
            }
            return this.ToInteger();
        }

        private static bool CheckShamsiDate(long shamsiDate)
        {
            int num3 = (int)(shamsiDate % 100L);
            int num2 = (int)((shamsiDate / 100L) % 100L);
            int nYear = (int)(shamsiDate / 0x2710L);
            if ((shamsiDate < 0x65L) || (shamsiDate > 0x5f5bebeL))
            {
                return false;
            }
            if ((num2 < 7) && ((num3 > 0x1f) || (num3 < 1)))
            {
                return false;
            }
            if ((num2 > 6) && ((num3 > 30) || (num3 < 1)))
            {
                return false;
            }
            if ((!isKabiseh(nYear) && (num2 == 12)) && (num3 == 30))
            {
                return false;
            }
            return true;
        }

        public void Clear()
        {
            this.month = 0;
            this.day = 0;
            this.year = 0;
        }

        public DayOfWeek DayOfWeek()
        {
            int num = Shamsi2Miladi(this.ToInteger());
            DateTime time = new DateTime(num / 0x2710, (num / 100) % 100, num % 100);
            return time.DayOfWeek;
        }

        public int DayOfYear()
        {
            return DaysInYear((long)this.ToInteger());
        }

        private static int DaysInYear(long shamsiDate)
        {
            int num2 = (int)(shamsiDate % 100L);
            int num3 = (int)((shamsiDate / 100L) % 100L);
            if (!CheckShamsiDate(shamsiDate))
            {
                throw new Exception("The Date is not valid");
            }
            if (num3 < 7)
            {
                return (((num3 - 1) * 0x1f) + num2);
            }
            return ((((num3 - 7) * 30) + num2) + 0xba);
        }

        public static HejriShamsiDate ExtractDate(int date)
        {
            HejriShamsiDate date2 = new HejriShamsiDate();
            date2.Year = date / 0x2710;
            date2.Month = (date % 0x2710) / 100;
            date2.Day = date % 100;
            return date2;
        }

        public static HejriShamsiDate ExtractDate(string date)
        {
            return ExtractDate(Convert.ToInt32(date));
        }

        public static HejriShamsiDate ExtractDate(int date, bool checkDate)
        {
            HejriShamsiDate date2 = ExtractDate(date);
            if (checkDate)
            {
                date2.Validate();
            }
            return date2;
        }

        public static int ExtractDay(int date, bool checkDate)
        {
            HejriShamsiDate date2 = new HejriShamsiDate();
            date2.Year = date / 0x2710;
            date2.Month = (date % 0x2710) / 100;
            date2.Day = date % 100;
            if (checkDate)
            {
                date2.Validate();
            }
            return date2.Day;
        }

        public static int ExtractMonth(int date, bool checkDate)
        {
            HejriShamsiDate date2 = new HejriShamsiDate();
            date2.Year = date / 0x2710;
            date2.Month = (date % 0x2710) / 100;
            date2.Day = date % 100;
            if (checkDate)
            {
                date2.Validate();
            }
            return date2.Month;
        }

        public static int ExtractYear(int date)
        {
            HejriShamsiDate date2 = new HejriShamsiDate();
            date2.Year = date / 0x2710;
            date2.Month = (date % 0x2710) / 100;
            date2.Day = date % 100;
            return date2.Year;
        }

        public static int ExtractYear(int date, bool checkDate)
        {
            ExtractDate(date, true);
            return ExtractYear(date);
        }

        public static int ExtractYearMonth(int date)
        {
            HejriShamsiDate date2 = new HejriShamsiDate();
            date2.Year = date / 0x2710;
            date2.Month = (date % 0x2710) / 100;
            date2.Day = date % 100;
            return ((date2.Year * 100) + date2.Month);
        }

        public static int ExtractYearMonth(int date, bool checkDate)
        {
            HejriShamsiDate date2 = new HejriShamsiDate();
            date2.Year = date / 0x2710;
            date2.Month = (date % 0x2710) / 100;
            date2.Day = date % 100;
            if (checkDate)
            {
                date2.Validate();
            }
            return ExtractYearMonth(date);
        }

        private static bool isIntercalary(int nYear)
        {
            return ((((nYear % 4) == 0) && ((nYear % 100) != 0)) || ((nYear % 400) == 0));
        }

        public static bool isKabiseh(int nYear)
        {
            if (nYear < 100)
            {
                nYear = 0x514 + nYear;
            }
            int num = nYear % 0x21;
            if ((((num != 1) && (num != 5)) && ((num != 9) && (num != 13))) &&
                (((num != 0x11) && (num != 0x16)) && ((num != 0x1a) && (num != 30))))
            {
                return false;
            }
            return true;
        }

        public static int Miladi2Shamsi(DateTime miladiDate)
        {
            int num3;
            int num4;
            int index = 0;
            int[] numArray = new int[] { 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 30, 30, 30, 30, 30, 0x1d };
            int num7 = 0x16d;
            int year = miladiDate.Year;
            int dayOfYear = miladiDate.DayOfYear;
            if (isIntercalary(year - 1))
            {
                num7 = 0x16e;
                numArray[11] = 30;
            }
            if (dayOfYear > 0x4f)
            {
                num3 = year - 0x26d;
                num4 = dayOfYear - 0x4f;
            }
            else
            {
                num3 = year - 0x26e;
                num4 = (num7 - 0x4f) + dayOfYear;
            }
            int num = num4;
            while (num > numArray[index])
            {
                num -= numArray[index];
                index++;
            }
            index++;
            return (((num3 * 0x2710) + (index * 100)) + num);
        }

        public static int Miladi2Shamsi(int year, int month, int day)
        {
            DateTime miladiDate = new DateTime(year, month, day);
            return Miladi2Shamsi(miladiDate);
        }

        public string PersianDayOfWeek()
        {
            string[] strArray = new string[] { "يکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنج شنبه", "جمعه", "شنبه" };
            int num = Shamsi2Miladi(this.ToInteger());
            DateTime time = new DateTime(num / 0x2710, (num / 100) % 100, num % 100);
            int dayOfWeek = (int)time.DayOfWeek;
            return strArray[dayOfWeek].ToString();
        }

        public static int Shamsi2Miladi(int shamsiDate)
        {
            if (!CheckShamsiDate((long)shamsiDate))
            {
                throw new Exception("The Date is not valid");
            }
            int num4 = shamsiDate / 0x2710;
            if (num4 < 100)
            {
                num4 = 0x514 + num4;
            }
            int num3 = DaysInYear((long)shamsiDate);
            int year = num4 + 0x26d;
            DateTime time = new DateTime(year, 1, 1);
            int num2 = num3 + 0x4e;
            time = time.AddDays((double)num2);
            return (((time.Year * 0x2710) + (time.Month * 100)) + time.Day);
        }

        public static int Shamsi2Miladi(int year, int month, int day)
        {
            int shamsiDate = ((year * 0x2710) + (month * 100)) + day;
            return Shamsi2Miladi(shamsiDate);
        }

        public static int Today()
        {
            return Miladi2Shamsi(DateTime.Today);
        }

        public int ToInteger()
        {
            return (((this.year * 0x2710) + (this.month * 100)) + this.day);
        }

        public static int ToInteger(int year, int month, int day)
        {
            HejriShamsiDate date = new HejriShamsiDate();
            date.Year = year;
            date.month = month;
            date.day = day;
            date.Validate();
            return date.ToInteger();
        }

        public override string ToString()
        {
            return this.ToInteger().ToString();
        }

        public void Validate()
        {
            if (!CheckShamsiDate((long)(((this.year * 0x2710) + (this.month * 100)) + this.day)))
            {
                throw new Exception("Date = " + (((this.year * 0x2710) + (this.month * 100)) + this.day) + " is invalid",
                                    null);
            }
        }

        // Properties
        public int Day
        {
            get { return this.day; }
            set { this.day = value; }
        }

        public int Month
        {
            get { return this.month; }
            set { this.month = value; }
        }

        public int Year
        {
            get { return this.year; }
            set { this.year = value; }
        }
    }
}

کد زیر رو هم در فرم لود بزار  فقط از masked استفاده کن  و کد بالا هم یک کلاس هست 

 maskedTextBox1.Text = HejriShamsiDate.Today().ToString();

یکشنبه, 23 تیر 1398 21:47
خیلی لطف کردید دوست گرامی ! مشکل من مربوط به نحوه نمایش در taskbar ویندوز هستش . با این کلاسها تا حدودی که بتونم باهاشون کار کنم رو آشنا هستم بیشتر با نحوه ست کردنش به عنوان تقویم پیش فرض ویندوز مشکل دارم . ممنون خیلی لطف کردین
یکشنبه, 23 تیر 1398 21:50

ولا من تازه کارم عقلم به از این بالاتر قد نمیده  معذرت میخوام 

یکشنبه, 23 تیر 1398 21:51
خیلی لطف کردین که وقت گذاشتین
دوشنبه, 24 تیر 1398 10:14

سلام و درود

ویندوز 10 خودش تقویم فارسی داره, شما چرا میخواین دوباره همچین چیزی بنویسید؟

یا خیر اگر برای ویندوز 7 ییا 8 میخواید استفاده بشه, تقویم های دسکتاپی زیبایی در اینترنت(بادصبا-شمیم یاس و ...) هستند که میشه استفاده کرد.

دوشنبه, 24 تیر 1398 10:22

سلام و درود جناب نصیری مدیر محترم بخش !

از اینکه وقت گذاشتین ممنون

ولی به عنوان یه برنامه نویس انتظار همچین جوابی رو نداشتم . واقعا شوکه شدم ! با احترام عرض میکنم که هیچ یک از مواردی که در جواب بنده ذکر کرده بودین برام تازگی نداشت . من هم میدونم اختراع دوباره چرخ کار عاقلانه ای نیست ولی اینکه میخوام اینکار رو انجام بدم دو تا دلیل خیلی خوب داره برای من !

ممنون

ارسال پاسخ برای این تاپیک

ارسال پاسخ مخصوص اعضا سایت می باشد ! میتوانید با حساب کاربری خود وارد سایت شده یا ثبت نام کنید