イスラム暦の日付からグレゴリオ暦の日付への正しい変換プログラムはありますか


10

私は日付変換を伴う多くのプロジェクトに取り組んでいます。たとえば、私は太陽暦とそれらをグレゴリオ暦に変換する方法、およびその逆の方法を研究しています。太陽暦(ペルシア暦)は、グレゴリオ暦の日付とほぼ同じですが、1年の日数は(うるうか否か)です。
しかし、私は最近、旧暦のプロジェクトに取り組みました。月暦を調べていると、月のシステムを太陽に変換する論理的な方法が1つもないことに気づきました(少なくとも私の知る限り)。
以下は、私が調査した参考リンクです。

  1. イスラム暦の日付からグレゴリオ暦の日付に変換できません(c#)
  2. イスラム暦からグレゴリオ暦への日付の変換、およびその逆
  3. イスラム暦日付DateTime.Parseを使用してグレゴリオ暦に
  4. イスラム暦の日付をグレゴリオ日付に変換する

上記のリンクをたどって、トレーニングとテストの人々が提示したアルゴリズムを調べたところ、絶対に正しいものはないことに気づきました。

それ"1441/02/30" [Safar 30th]はあなたが試してみたいすべての方法であるグレゴリオ暦の日付に変換するだけです。

次の画像は、前述の例に役立ちます。 ここに画像の説明を入力してください

私はここにいくつかのテストコードを入れて失敗しました:

CultureInfo arSA = new CultureInfo("ar-SA");
arSA.DateTimeFormat.Calendar = new HijriCalendar();
var dateValue = DateTime.ParseExact("1441/02/30", "yyyy/MM/dd", arSA);
return dateValue.ToString();

上記のコードのエラー:

文字列で表されるDateTimeは、カレンダーSystem.Globalization.HijriCalendarではサポートされていません。

HijriCalendar hc = new HijriCalendar();
DateTime date = new DateTime(1441, 2, 30, hc);
return date.ToString();

上記のコードのエラー:

「2日目の日は1から29の間でなければなりません。」

string hijri = "1441/2/30";
HijriCalendar hc = new HijriCalendar();
int year = int.Parse(hijri.Substring(0, 4));
string rem = hijri.Remove(0, 5);
int end = rem.IndexOf('/', 0);
int month = int.Parse(rem.Substring(0, end));
rem = rem.Remove(0, end + 1);
int day = int.Parse(rem);
DateTime date = new DateTime(year, month, day, hc);
return date.ToShortDateString();

上記のコードのエラー:

「2日目の日は1から29の間でなければなりません。」

その後、私はイスラム暦の変換をグレゴリオ暦の日付に変換するアルゴリズムがあることを理解しようとしていましたか?
だから私はいくつかのイスラムのオンライン日付コンバーターをテストしました、そして私は驚きました!両方の日付コンバータ
に入力"1441/2/30"してみてください。
最初の1つが戻りOctober 30, 2019
、2番目の1つが29 October 2019
Hijriグレゴリオコンバーターを 返し
ます。

したがって、ヒジュラ暦の日付をグレゴリオ暦に変換する実際のアルゴリズムがあるかどうかはわかりません。
よろしくお願いします。

詳細については、 https://www.wikiwand.com/simple/Islamic_calendar


更新:知っている正しいライブラリがないことを知っています。しかし、誰かがイスラム暦(そのすべてのインターフェース)について知識または詳細を持っている場合は、ここに説明してください。本当にイスラム暦をすべての人に導入したいと思います。


あなたの例は17-October-2019として出力を与えるべきですか?
snr-モニカを

searchtruth.com/hijriで例を試すと、誤った日付になりますか?
snr-モニカを

私は本当に私は私の記事で述べたことを2つのイスラムの日付コンバータによる正しい出力、何であるかを知らない、出力があるべきOctober 30, 2019 wedOctober 29, 2019 tue。今やってみました。
Reza Paidar

入力した日付が間違っているようです。30分の安全のために1442ではなく1441に入る場合。日付が正しいか確認してください。
snr-モニカを

1
@Gus:ペルシャ暦は太陽系に使用されてOmar khayyamおり、ペルシャの数学者によって発明されました。ペルシア暦は365日(うるう年は366日)ですが、月暦はペルシア暦より11〜12日短くなっています。
Reza Paidar

回答:


1

このコードのようなものを使用して、hijriカレンダー文字列をグレゴリオ暦のDateTimeに変換および解析できます。

//assuming current culture is like en-us or something with gregorian calendar
string hijri = "1441/2/30";
HijriCalendar hc = new HijriCalendar();
var dateParts = hijri.Split('/');
DateTime? gregorianDate=null;
if (dateParts.Length == 3 && int.TryParse(dateParts[0], out int year) &&
     int.TryParse(dateParts[1], out int month) && int.TryParse(dateParts[2], out int day))
{
      if(month == 2 && day==30)
      {
         var temp = hc.ToDateTime(year, month, 29, 0, 0, 0, 0);
         gregorianDate = temp.AddDays(1);
      }
      else
      {
         gregorianDate = hc.ToDateTime(year, month, day, 0, 0, 0, 0);
      }

}

あなたの時間と解決策を与えてくれてありがとう。しかし、私はすでにソリューションをテストしており、エラーがスローされますDay must be between 1 and 29 for month 2. Parameter name: day。以前の投稿コメントで述べたように、別のイスラム暦(月)のサファールには、日数の変数があります。ソリューションには、他のソリューションと同様の同じエラーがあります。
Reza Paidar

.Net のHijriCalendarクラスにバグがある可能性があるため、コードを編集しましたが、例外の回避策があります。
Ali Hamidi

ありがとう。この場合、.netライブラリにバグがあるとは言えません。論理的な説明のない、複数のインターフェースがhijri calanderのエポックであることに気付きました。あなたの解決策は、かなり正確な答えではなく、エラーをスキップするためのチートです。しかし、私は時間を与えるためにuに投票します
Reza Paidar

HijriCalendarクラスのソースコードを見てきました。日付を変換する前にDaysInMonthをチェックしています。サファール(2ヶ月目)は29日とします。したがって、今月は小さなバグがあります
Ali Hamidi

1
私の投稿のコメントを確認すると、Microsoftがhijriカレンダーのドキュメントを紹介しており、Safarと他の月は静的に29日あります。ですから、ある意味では、これはこのライブラリのバグです。
Reza Paidar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.