2012-11-11 8 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

私はそうと思うつもりです、@ジョン。 –

+0

@Jon Skeetはい私はそれを間違って書いた –

答えて

13

DateTime効果的に、常にグレゴリオ暦でです。別のカレンダーを指定してインスタンスを作成しても、DayMonthYearなどのプロパティによって返される値は、グレゴリオ暦になります。一例として、

、イスラム暦の開始を取る:

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

それはあなたがこのメソッドへの入力を作成しているか、またはあなたが本当には、文字列に変換する必要があるかどうかは明らかではありませんフォーマット。 (あるいは、なぜあなたは、組み込みの文字列フォーマッタを使用していない。)

それあなただけ使用できることが考えられます。

作成されてい 任意の DateTimeのために動作します
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); 
    } 
} 

あなたは自分のカレンダーシステムを追跡する日数をしたい場合は、あなたが今、ペルシャ暦をサポートしています私の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

私は持っているペルシア語の日付(またはハイジの日付または他のthig)と私はグレゴリオ暦の日付に変換したい...あなたのコードは、それを行うことはありませんか? –

+0

@ mj-y:正しく作成していればそれはありますが、そうは思わないでしょう。 「DateTime」を作成するために使用したコードを表示していないことを考えれば、言うことは難しいです。 –

+0

@ mj-y:別のカレンダーの中で 'DateTime' *を正しく作成する方法の例については、私の編集を参照してください。さて、あなたのコードは何をしていますか? GetPdate関数の –

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(17キロバイト)

Install-Package PersianDate 

2-次のサンプルでもわかるように、ライブラリ自体によって処理されるセパレータと方向について心配しないで、PersianDateクラスのToFaとtoEn静的メソッドを使用してください。任意の変更のための

//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をし、新しいフォーマットをサポート: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; 
    } 
} 

この方法は可能System.DateTimeにshamsi日付を表す文字列を変換し、このよう

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

のコードを使用します。

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

あなたはNugetを使用して、PersianDateTimeを使用することができます。

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

用: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; 
} 
関連する問題