2012-11-11 20 views
14

Uso la funzione seguente per convertire le date gregoriane in date persiane, ma non sono riuscito a scrivere una funzione per eseguire la conversione inversa. Voglio una funzione che converta una data persiana (una stringa come "1390/07/18 12:00:00") in una data georgiana.Come convertire una data persiana in una data gregoriana?

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

Intendi dire gregoriano? –

+0

Ho intenzione di assumere quindi, @ Jon. –

+0

@Jon Skeet sì l'ho scritto male scusa –

risposta

13

DateTime è sempre nel calendario gregoriano, in modo efficace. Anche se si crea un'istanza che specifica un calendario diverso, i valori restituiti dalle proprietà Day, Month, Year ecc. Sono nel calendario gregoriano.

A titolo di esempio, prendere l'inizio del calendario islamico:

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

Non è chiaro in che modo si sta creando l'ingresso a questo metodo, o se si deve davvero essere convertirlo in una stringa formato. (O perché non si sta usando il built-in formattatori stringa.)

E potrebbe essere che si può semplicemente utilizzare:

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

che funziona per qualsiasi DateTime che è stata creata in modo appropriato - ma non sappiamo cosa hai fatto prima.

Esempio:

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

Ora, se siete non specificando il calendario quando si crea il DateTime, allora non sei davvero la creazione di una data persiano a tutti.

Se volete date che tenere traccia del loro sistema di calendario, è possibile utilizzare il mio progetto Noda Time, che sostiene ora il calendario persiano:

// 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

Ho una data persiana (o data hijri o qualcun altro) e voglio convertirla in data gregoriana ... il tuo codice non lo fa, dosalo? –

+0

@ mj-y: lo fa se lo hai creato correttamente, ma ho il sospetto che tu non l'abbia fatto. Dato che non ci hai mostrato nulla del codice che hai usato per creare il 'DateTime', è difficile dirlo. –

+0

@ mj-y: vedere la mia modifica per un esempio di come creare un 'DateTime' * correttamente * in un calendario diverso. Ora, cosa fa il tuo codice? –

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

Grazie ragazzi, ho usato al di sotto del codice e il mio problema risolto:

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- installare prima Persiandate NuGet package (17KB)

0.123.767,518 mila

2- utilizzare ToFa e toEn metodi statici di classe PersianDate come (non preoccuparti dei separatori e delle indicazioni che verranno gestite dalla libreria stessa come puoi vedere nei seguenti esempi .anche puoi trovare il progetto della console di utilizzo all'interno in GitHub provarlo te facilmente):

//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 di eventuali modifiche e supportare i nuovi formati.

look per il seguente codice sorgente di funzioni per vedere come è generalmente lavorando

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

Usa questo codice per convertire Persico per data Gregoriana e viceversa.

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

Utilizzare il codice in questo modo

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

Questo metodo converte una stringa che rappresenta una data shamsi a 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

È possibile utilizzare PersianDateTime, utilizzando Nuget:

PM> Install-Package PersianDateTime 

e come si c un utilizzo:

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

e:

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

per: more info about PersianDateTime

1

Questo metodo di controllo anni bisestili.

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; 
} 
Problemi correlati