Как преобразовать персидскую дату в григорианскую дату?
Я использую функцию ниже, чтобы преобразовать григорианские даты в персидские даты, но мне не удалось написать функцию для обратного преобразования. Я хочу функцию, которая преобразует персидскую дату (строка типа "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;
}
Ответы
Ответ 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