2012-11-11 77 views
14

我使用下面的函数将公历日期转换为波斯日期,但是我一直无法编写一个函数来进行反向转换。我想要一个将波斯日期(像“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

你的意思是格里高利? –

+0

我会假设,@Jon。 –

+0

@Jon Skeet是的,我写错了对不起 –

回答

13

DateTime总是公历,有效。即使您创建指定不同日历的实例,DayMonth,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); 
+0

我有一个波斯日期(或回教日期或其他任何其他),我想将其转换为公历日期...您的代码不这样做,它的剂量? –

+0

@ mj-y:它的确如果你已经正确创建了它 - 但我怀疑你没有。鉴于您没有向我们展示您用来创建'DateTime'的任何代码,这很难说。 –

+0

@ mj-y:查看我的编辑,了解如何在其他日历中正确创建'DateTime' *的示例。现在,你的代码做了什么? –

2
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 
8

谢谢你们,我用下面的代码,我的问题解决:

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; 
} 
4

1-第一安装Persiandate NuGet package(17KB)

Install-Package PersianDate 

2-使用ToFa和toEn静态方法的PersianDate类像(不必担心将由库本身处理的分隔符和方向,您可以在下面的示例中看到。也可以在其中找到使用控制台项目在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- Source code available in 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(); 
1

此方法转换它代表了沙姆西日期为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; 
    } 
0

您可以使用PersianDateTime,使用的NuGet:

PM> Install-Package PersianDateTime 

和你如何c一个用途:

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

和:

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

为:more info about PersianDateTime

1

这种方法检查闰年。

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; 
} 
相关问题