Как напечатать DateTime в персидском формате на C #

Вот хороший способ подумать о различии между типами значений, передачей по значению, ссылочными типами и передачей по ссылке:

Переменная - это контейнер.

Переменная value-type содержит экземпляр. Переменная ссылочного типа содержит указатель на экземпляр, хранящийся в другом месте.

Изменение переменной типа значения мутирует экземпляр, который он содержит. Изменение переменной ссылочного типа мутирует экземпляр, на который он указывает.

Отдельные ссылочные типы переменных могут указывать на один и тот же экземпляр. Поэтому один и тот же экземпляр может быть мутирован через любую переменную, которая указывает на него.

Аргумент pass-by-value представляет собой новый контейнер с новой копией содержимого. Аргумент pass-by-reference является исходным контейнером с его исходным содержимым.

Когда аргумент value-type передается по-значению: переопределение содержимого аргумента не имеет эффекта за пределами области видимости, поскольку контейнер уникальный. Модификация аргумента не влияет на внешний вид, потому что экземпляр является независимой копией.

Когда аргумент ссылочного типа передается по значению: переназначение содержимого аргумента не имеет эффекта за пределами области видимости, поскольку контейнер является уникальным. Изменение содержимого аргумента влияет на внешнюю область видимости, поскольку скопированный указатель указывает на общий экземпляр.

Когда любой аргумент передается по ссылке: переназначение содержимого аргумента влияет на внешнюю область видимости, поскольку контейнер является общим , Изменение содержимого аргумента влияет на внешнюю область видимости, поскольку содержимое является общим.

В заключение:

Строковая переменная является переменной ссылочного типа. Поэтому он содержит указатель на экземпляр, хранящийся в другом месте. Когда он передается по значению, его указатель копируется, поэтому изменение аргумента строки должно влиять на общий экземпляр. Тем не менее, экземпляр строки не имеет изменяемых свойств, поэтому аргумент строки не может быть изменен в любом случае. Когда передано по ссылке, контейнер указателя является общим, поэтому переназначение все равно будет влиять на внешнюю область.

23
задан shA.t 1 August 2015 в 10:30
поделиться

2 ответа

Вы можете использовать это:

static public string PersianDateString(DateTime d)
{
    var pc = new PersianCalendar();
    return string.Format("{0:0000}/{1:00}/{2:00}",
        pc.GetYear(d), pc.GetMonth(d), pc.GetDayOfMonth(d));
}
2
ответ дан Kamyar Infinity 1 August 2015 в 10:30
поделиться

Сначала вы должны заметить, что вы не можете поместить Jalali Date в объект DateTime, вы получите исключение в таких датах, как «1392/02/31».

Таким образом, вы должны обрабатывать свои даты Джалали в виде строки или пользовательского типа DateTime.

Я предлагаю, чтобы вы всегда сохраняли свою дату как григорианскую и конвертировали ее, когда вам нужно ее показать.

Это метод расширения для получения персидской даты из объекта DateTime.

    public static string GetPersianDate(this DateTime date)
    {
        PersianCalendar jc = new PersianCalendar();
        return string.Format("{0:0000}/{1:00}/{2:00}", jc.GetYear(date), jc.GetMonth(date), jc.GetDayOfMonth(date));
    }
    //How to use it:
    DateTime d = new DateTime(2014, 05, 21);
    string s = d.GetPersianDate(); //1393/02/31

А затем, когда у вас есть дата Джалали в строковом формате, вот метод расширения, чтобы получить григорианскую дату:

    public static DateTime GetDateTimeFromJalaliString(this string jalaliDate)
    {
        PersianCalendar jc = new PersianCalendar();

        try
        {
            string[] date = jalaliDate.Split('/');
            int year = Convert.ToInt32(date[0]);
            int month = Convert.ToInt32(date[1]);
            int day = Convert.ToInt32(date[2]);

            DateTime d = jc.ToDateTime(year, month, day, 0, 0, 0, 0, PersianCalendar.PersianEra);

            return d;
        }
        catch
        {
            throw new FormatException("The input string must be in 0000/00/00 format.");
        }
    }
    //How to use it:
    string pdate = "1392/02/31";
    DateTime dateFromJalali = pdate.GetDateTimeFromJalaliString(); //{5/21/2014 12:00:00 AM}

А теперь для обработки дополнительных функций:

Название недели:

    public static string GetDayOfWeekName(this DateTime date)
    {
        switch (date.DayOfWeek)
        {
            case DayOfWeek.Saturday: return "شنبه";
            case DayOfWeek.Sunday: return "يکشنبه";
            case DayOfWeek.Monday: return "دوشنبه";
            case DayOfWeek.Tuesday: return "سه‏ شنبه";
            case DayOfWeek.Wednesday: return "چهارشنبه";
            case DayOfWeek.Thursday: return "پنجشنبه";
            case DayOfWeek.Friday: return "جمعه";
            default: return "";
        }
    }
    //How to use it:
    DateTime date = DateTime.Now;
    string wname = date.GetDayOfWeekName();

Название месяца:

    public static string GetMonthName(this DateTime date)
    {
            PersianCalendar jc = new PersianCalendar();
            string pdate = string.Format("{0:0000}/{1:00}/{2:00}", jc.GetYear(date), jc.GetMonth(date), jc.GetDayOfMonth(date));

            string[] dates = pdate.Split('/');
            int month = Convert.ToInt32(dates[1]);

            switch (month)
            {
                case 1: return "فررودين";
                case 2: return "ارديبهشت";
                case 3: return "خرداد";
                case 4: return "تير‏";
                case 5: return "مرداد";
                case 6: return "شهريور";
                case 7: return "مهر";
                case 8: return "آبان";
                case 9: return "آذر";
                case 10: return "دي";
                case 11: return "بهمن";
                case 12: return "اسفند";
                default: return "";
            }

    }
    //How to use it:
    DateTime date = DateTime.Now;
    string mname = date.GetMonthName();
32
ответ дан Ashkan Ghodrat 1 August 2015 в 10:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: