私は日付変換を伴う多くのプロジェクトに取り組んでいます。たとえば、私は太陽暦とそれらをグレゴリオ暦に変換する方法、およびその逆の方法に取り組んでいます。太陽暦(ペルシャ暦)は、グレゴリオ暦の日付とほぼ同じですが、1年の日数(うるうか否か)が異なります。
しかし、私は最近、旧暦のプロジェクトに取り組みました。月暦を調べていると、月のシステムを太陽に変換する論理的な方法は1つもないことに気づきました(少なくとも私の知る限り)。
以下は、私が調査した参考リンクです。
上記のリンクをたどって、トレーニングとテストの人々が提示したアルゴリズムを調べたところ、絶対に正しいものはないことに気づきました。
"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"
を入力してください。
最初のものはOctober 30, 2019
を返します
そして、2つ目は29 October 2019
を返します
ヒジュラグレゴリアンコンバーター
イスラム暦の日付変換-グレゴリオ暦の変換
したがって、ヒジュラ暦の日付をグレゴリオ暦に変換する実際のアルゴリズムがあるかどうかはわかりません。
お時間をいただきありがとうございます。
詳しくは https://www.wikiwand.com/simple/Islamic_calendar
更新:知っている正しいライブラリがないことを知っています。しかし、誰かがイスラム暦(そのすべてのインターフェース)について知識または詳細を持っている場合は、ここで説明してください。本当にイスラム暦をすべての人に導入したいと思います。
このコードのようなものを使用して、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);
}
}