Подтвердить что ты не робот

Как преобразовать персидскую дату в григорианскую дату?

Я использую функцию ниже, чтобы преобразовать григорианские даты в персидские даты, но мне не удалось написать функцию для обратного преобразования. Я хочу функцию, которая преобразует персидскую дату (строка типа "1390/07/18 12:00:00" ) в грузинскую дату.

public static string GetPdate(DateTime _EnDate)
{
    PersianCalendar pcalendar = new PersianCalendar();
    string Pdate = pcalendar.GetYear(_EnDate).ToString("0000") + "/" +
       pcalendar.GetMonth(_EnDate).ToString("00") + "/" +
       pcalendar.GetDayOfMonth(_EnDate).ToString("00") + " " +
           pcalendar.GetHour(_EnDate).ToString("00") + ":" +
           pcalendar.GetMinute(_EnDate).ToString("00") + ":" +
           pcalendar.GetSecond(_EnDate).ToString("00");

    return Pdate;
}
4b9b3361

Ответ 1

DateTime всегда находится в григорианском календаре. Даже если вы создаете экземпляр, указывающий dfferent calendar, значения, возвращаемые свойствами Day, Month, Year и т.д., Находятся в григорианском календаре.

В качестве примера возьмем начало исламского календаря:

using System;
using System.Globalization;

class Test
{
    static void Main()
    {
        DateTime epoch = new DateTime(1, 1, 1, new HijriCalendar());
        Console.WriteLine(epoch.Year);  // 622
        Console.WriteLine(epoch.Month); // 7
        Console.WriteLine(epoch.Day);   // 18
    }
}

Непонятно, как вы создаете вход для этого метода или хотите ли вы его преобразовать в строковый формат. (Или почему вы не используете встроенные форматированные строки.)

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

public static string FormatDateTimeAsGregorian(DateTime input)
{
    return input.ToString("yyyy'/'MM'/'dd' 'HH':'mm':'ss",
                          CultureInfo.InvariantCulture);
}

Это будет работать для любого DateTime, который был создан соответствующим образом, но мы не знаем, что вы сделали до этого.

Пример:

using System;
using System.Globalization;

class Test
{
    static void Main()
    {
        DateTime epoch = new DateTime(1, 1, 1, new PersianCalendar());
        // Prints 0622/03/21 00:00:00
        Console.WriteLine(FormatDateTimeAsGregorian(epoch));
    }

    public static string FormatDateTimeAsGregorian(DateTime input)
    {
        return input.ToString("yyyy'/'MM'/'dd' 'HH':'mm':'ss",
                              CultureInfo.InvariantCulture);
    }
}

Теперь, если вы не укажете календарь при создании DateTime, вы вообще не создаете персидскую дату.

Если вы хотите, чтобы даты отслеживали их систему календаря, вы можете использовать мой проект Noda Time, который теперь поддерживает персидский календарь:

// In Noda Time 2.0 you'd just use CalendarSystem.Persian
var persianDate = new LocalDate(1390, 7, 18, CalendarSystem.GetPersianCalendar());
var gregorianDate = persianDate.WithCalendar(CalendarSystem.Iso);

Ответ 2

Спасибо, ребята, я использовал ниже код и моя проблема решена:

public static DateTime GetEdate(string _Fdate)
{
    DateTime fdate = Convert.ToDateTime(_Fdate);
    GregorianCalendar gcalendar = new GregorianCalendar();
    DateTime eDate = pcalendar.ToDateTime(
           gcalendar.GetYear(fdate),
           gcalendar.GetMonth(fdate),
           gcalendar.GetDayOfMonth(fdate),
           gcalendar.GetHour(fdate),
           gcalendar.GetMinute(fdate),
           gcalendar.GetSecond(fdate), 0);
    return eDate;
}

Ответ 3

1- сначала установите Персидский пакет NuGet (17KB)

Install-Package PersianDate

2- используйте ToFa и toEn статические методы класса PersianDate (не беспокойтесь о seperators и направлениях, которые будут обрабатываться самой библиотекой, как вы можете видеть в следующих примерах. Также вы можете найти проект Usage Console внутри GitHub, чтобы проверить его самостоятельно):

   //default format 
    string dts=ConvertDate.ToFa(DateTime.Now);//1393/08/01
    //date only (short and D for Long)
    dts=ConvertDate.ToFa(DateTime.Now, "d");//93/08/01 
    dts=ConvertDate.ToFa(DateTime.Now, "D");//پنج شنبه, 01 آبان 1393
    //time only 
    dts=ConvertDate.ToFa(DateTime.Now, "t");//21:53 
    dts=ConvertDate.ToFa(DateTime.Now, "T");//21:53:26
    //general short date + time
    dts=ConvertDate.ToFa(DateTime.Now, "g");//93/08/01 21:53 
    dts=ConvertDate.ToFa(DateTime.Now, "G");//93/08/01 21:53:26
    //general full date + time
    dts=ConvertDate.ToFa(DateTime.Now, "f");//پنج شنبه, 01 آبان 1393 21:53 
    dts=ConvertDate.ToFa(DateTime.Now, "F");//پنج شنبه, 01 آبان 1393 21:53:26
    //only month and year
    dts=ConvertDate.ToFa(DateTime.Now, "m");//آبان 1 
    dts=ConvertDate.ToFa(DateTime.Now, "y");//1393 آبان

    dts=ConvertDate.ToFa(DateTime.Now);//1393/08/01
    // converting back to Gregorian date 
    Datetime dt= ConvertDate.ToEn(dts);//2014/10/23 00:00:00

3- Исходный код, доступный в GitHub для любых изменений и поддержки новых форматов.

найдите исходный код следующих функций, чтобы увидеть, как он работает в целом.

    public static DateTime ToEn(string fadate)
    {
        if (fadate.Trim() == "") return DateTime.MinValue;
        int[] farsiPartArray = SplitRoozMahSalNew(fadate);

        return new PersianCalendar().ToDateTime(farsiPartArray[0], farsiPartArray[1], farsiPartArray[2], 0, 0, 0, 0);

    }

    private static int[] SplitRoozMahSalNew(string farsiDate)
    {
        int pYear = 0;
        int pMonth = 0;
        int pDay = 0;


        //normalize with one character
        farsiDate = farsiDate.Trim().Replace(@"\", "/").Replace(@"-", "/").Replace(@"_", "/").
            Replace(@",", "/").Replace(@".", "/").Replace(@" ", "/");


        string[] rawValues = farsiDate.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);


        if (!farsiDate.Contains("/"))
        {
            if (rawValues.Length != 2)
                throw new Exception("usually there should be 2 seperator for a complete date");
        }
        else //mostly given in all numeric format like 13930316
        {
            // detect year side and add slashes in right places and continue
        }
        //new simple method which emcompass below methods too
        try
        {
            pYear = int.Parse(rawValues[0].TrimStart(new[] { '0' }).Trim());
            pMonth = int.Parse(rawValues[1].TrimStart(new[] { '0' }).Trim());
            pDay = int.Parse(rawValues[2].TrimStart(new[] { '0' }).Trim());

            // the year usually must be larger than 90
            //or for historic values rarely lower than 33 if 2 digit is given
            if (pYear < 33 && pYear > 0)
            {
                //swap year and day
                pYear = pDay;
                pDay = int.Parse(rawValues[0]); //convert again
            }
            //fix 2 digits of persian strings
            if (pYear.ToString(CultureInfo.InvariantCulture).Length == 2)
                pYear = pYear + 1300;
            //
            if (pMonth <= 0 || pMonth >= 13)
                throw new Exception("mahe shamsi must be under 12 ");
        }
        catch (Exception ex)
        {
            throw new Exception(
                "invalid Persian date format: maybe all 3 numric Sal, Mah,rooz parts are not present. \r\n" + ex);
        }

        return new[] { pYear, pMonth, pDay };
    }

Ответ 4

Используйте этот код для преобразования персидской в ​​григорианскую дату и наоборот.

public static class PersainDate
{
    public static DateTime ConvertToGregorian(this DateTime obj)
    {
        DateTime dt = new DateTime(obj.Year, obj.Month, obj.Day, new PersianCalendar());
        return dt;
    }
    public static DateTime ConvertToPersian(this DateTime obj)
    {
        var persian = new PersianCalendar();
        var year = persian.GetYear(obj);
        var month = persian.GetMonth(obj);
        var day = persian.GetDayOfMonth(obj);
        DateTime persiandate = new DateTime(year, month, day);
        return persianDate;
    }
}

Используйте код таким образом

        var time = DateTime.Now;
        var persianDate = time.ConverToPersian();
        var gregorianDate = persianDate.ConverToGregorian();

Ответ 5

You may try with this: 

using System.Globalization // namespace
GregorianCalendar greg = new GregorianCalendar();
DateTime DayYearMonth = new DateTime(1433, 10, 11, greg );

Console.WriteLine(greg .GetDayOfMonth(DayYearMonth )); // 11
Console.WriteLine(greg .GetYear(DayYearMonth )); // 1433
Console.WriteLine(greg .GetMonth(DayYearMonth )); // 10

Ответ 6

Этот метод преобразует строку, которая представляет дату shamsi для System.DateTime:

    public DateTime milady(string shamsiDate)
    {
        DateTime dt = new DateTime();
        PersianCalendar pc = new PersianCalendar();

        int pYear = Convert.ToInt32(shamsiDate.Substring(0, 4));
        int pMonth =Convert.ToInt32(shamsiDate.Substring(5, 2));
        int pDay =  Convert.ToInt32( shamsiDate.Substring(8));


        dt = pc.ToDateTime(pYear, pMonth, pDay,0,0,0,0);
        return dt;
    }

Ответ 7

Этот метод проверяет високосные годы.

private static DateTime JalaliToGregorianDate(string jalaliDate)
{
    string[] JalaliDateArray = jalaliDate.Split(new Char[] { '/' });
    int Year, Mounth, Day;
    DateTime GregorianDate;
    PersianCalendar persianCalendar = new PersianCalendar();
    //
    Year = int.Parse(JalaliDateArray[2]);
    if (Year < 100)
    {
        Year = 1300 + Year;
    }
    Mounth = int.Parse(JalaliDateArray[1]);
    Day = int.Parse(JalaliDateArray[0]);
    if (Day > 29 && Mounth == 12)
    {
        if (!persianCalendar.IsLeapYear(Year))
        {
            throw (new Exception(string.Format("IsNotLeapYear&{0}", Year)));
        }
    }
    GregorianDate = persianCalendar.ToDateTime(Year, Mounth, Day, 0, 0, 0, 0);
    //
    return GregorianDate;
}

Ответ 8

Вы можете использовать PersianDateTime, используя Nuget:

PM> Install-Package PersianDateTime

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

DateTime miladiDate = new DateTime(2013, 5, 31);
PersianDateTime persianDate = new PersianDateTime(miladiDate);

и:

PersianDateTime persianDate = PersianDateTime.Parse("1392/03/02");
DateTime miladiDate = persianDate.ToDateTime(); 

для: больше информации о PersianDateTime