16

以下の関数を使用してグレゴリオ暦の日付をペルシアの日付に変換しますが、逆変換を行う関数を作成できませんでした。ペルシア語の日付( "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;
}
4

9 に答える 9

13

DateTime事実上、常にグレゴリオ暦にあります。異なるカレンダーを指定してインスタンスを作成した場合でも、、、などのプロパティによって返される値はDayグレゴリオ暦にありますMonthYear

例として、イスラム暦の開始を取り上げます。

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場合は、実際にはペルシャの日付を作成していません。

カレンダーシステムを追跡する日付が必要な場合は、ペルシャ暦をサポートするようになった私のNodaTimeプロジェクトを使用できます。

// 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);
于 2012-11-11T08:25:01.360 に答える
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;
}
于 2012-11-11T10:15:08.210 に答える
5

このコードを使用して、ペルシア語をグレゴリオ暦に、またはその逆に変換します。

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();
于 2015-08-31T22:10:04.297 に答える
4

1-最初にPersiandateNuGetパッケージ(17KB)をインストールします

Install-Package PersianDate

2-PersianDateクラスのToFaおよびtoEn静的メソッドを使用します(次のサンプルでわかるように、ライブラリ自体によって処理されるセパレーターと方向について心配する必要はありません。また、GitHub内にUsageConsoleプロジェクトを見つけてテストすることもできます簡単に自分で):

   //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 };
    }
于 2014-10-24T07:46:30.640 に答える
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
于 2012-11-11T09:43:29.840 に答える
2

このメソッドは、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;
    }
于 2016-02-08T06:43:45.280 に答える
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;
}
于 2017-08-15T09:59:15.930 に答える
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(); 

for:PersianDateTimeに関する詳細情報

于 2016-09-26T10:18:12.343 に答える
0

Persia.NET Coreを使用すると、次のことが役立ちます。

グレゴリオ暦をShamsiに変換する

Persia.SolarDate solarDate = Persia.Calendar.ConvertToPersian(DateTime.Now);
// getting the simple format of persian date
string str = solarDate.ToString();

Shamsiをグレゴリオ暦に変換する

DateTime ConvertToGregorian(SolarDate solarDate)
DateTime ConvertToGregorian(LunarDate lunarDate)
DateTime ConvertToGregorian(int year, int month, int day, DateType dateType)
DateTime ConvertToGregorian(int year, int month, int day, int hour, int minute, int
second, DateType dateType)

ここからダウンロードでき ます。アプリケーションが.NETCoreをサポートしていない場合は、NuGetから古いバージョンを見つけることができます。

于 2020-12-03T17:44:09.390 に答える