Có bất kỳ công cụ chuyển đổi chính xác nào cho ngày Hijri sang ngày Gregorian


10

Tôi đã làm việc trên nhiều dự án với ngày chuyển đổi. ví dụ, tôi làm việc theo lịch mặt trời và cách chuyển đổi chúng sang ngày Gregorian và ngược lại. Lịch mặt trời (lịch Ba Tư) gần như tương tự với ngày Gregorian về số ngày trong một năm [nhảy hay không].
Nhưng gần đây tôi đã làm việc trong một dự án với lịch âm. Khi tôi nghiên cứu về lịch âm lịch, tôi nhận ra rằng không có bất kỳ phương pháp logic đơn lẻ nào để chuyển đổi hệ mặt trăng thành năng lượng mặt trời (ít nhất là theo như tôi biết).
Dưới đây là một số liên kết tham khảo mà tôi đã nghiên cứu về chúng:

  1. Không thể chuyển đổi từ ngày Hijri sang ngày Gregorian (c #)
  2. Chuyển đổi ngày từ Lịch Hijri sang Lịch Gregorian và ngược lại
  3. Ngày Hijri Đến gregorian bằng DateTime.Pude
  4. Chuyển đổi ngày Hijri sang dữ liệu Gregorian

Khi tôi theo dõi các liên kết ở trên, đào tạo và thử nghiệm mọi người đã trình bày các thuật toán, tôi nhận thấy rằng không ai trong số chúng là hoàn toàn chính xác.

Chỉ cần nói rằng, chỉ cần Chuyển đổi "1441/02/30" [Safar 30th]sang ngày Gregorian mà mọi phương pháp mà bạn muốn thử.

Hình ảnh sau đây là hữu ích cho ví dụ đã nói ở trên. nhập mô tả hình ảnh ở đây

Tôi đặt ở đây một số mã kiểm tra và thất bại:

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

Lỗi cho mã trên:

DateTime được đại diện bởi chuỗi không được hỗ trợ trong lịch System.Globalization.HijriCalWiki.

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

Lỗi cho mã trên:

"Ngày phải từ 1 đến 29 cho tháng 2."

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

Lỗi cho mã trên:

"Ngày phải từ 1 đến 29 cho tháng 2."

Sau đó, tôi đã cố gắng để hiểu rằng có bất kỳ thuật toán nào để triển khai ngày chuyển đổi Hijri sang ngày Gregorian không?
Vì vậy, tôi đã thử nghiệm một số công cụ chuyển đổi ngày trực tuyến Hồi giáo và tôi đã ngạc nhiên!
Chỉ cần cố gắng nhập "1441/2/30"vào cả hai công cụ chuyển đổi ngày.
cái đầu tiên trở lại October 30, 2019
Và cái thứ hai trở về 29 October 2019
Hijri gregorian-convert Hồi giáo chuyển đổi
ngày - Bộ chuyển đổi lịch Gregorian

Vì vậy, tôi không biết có bất kỳ thuật toán thực tế nào để chuyển đổi ngày Hijri sang Gregorian.
Cảm ơn trước cho thời gian của bạn.

Để biết thêm thông tin, https://www.wikiwand.com/simple/Islamic_calWiki


Cập nhật : Tôi biết không có bất kỳ thư viện chính xác nào để biết. nhưng nếu ai đó có kiến ​​thức hoặc chi tiết về Lịch Hijri (tất cả giao diện của nó), vui lòng chỉ mô tả ở đây Tôi thực sự muốn triển khai lịch Hijri cho tất cả.


ví dụ của bạn có nên cho đầu ra là 17 tháng 10 năm 2019 không?
snr - Phục hồi lại

Khi bạn thử ví dụ của mình trên searchtruth.com/hijri , kết quả là sai ngày ??
snr - Phục hồi lại

Tôi thực sự không biết đầu ra chính xác là gì, do hai công cụ chuyển đổi ngày Hồi giáo mà tôi đã đề cập trong bài đăng của mình, đầu ra nên October 30, 2019 wedhoặc October 29, 2019 tue. Tôi đã thử ngay bây giờ.
Reza Paidar

ngày đầu vào của bạn có vẻ sai. Nếu bạn nhận được vào năm 1441 thay vì 1442 cho 30 giây an toàn hơn. Kiểm tra tính chính xác của ngày của bạn.
snr - Phục hồi Monica

1
@Gus: Lịch Ba Tư đang sử dụng cho hệ mặt trời và được phát minh bởi Omar khayyamnhà toán học Ba Tư. Lịch Ba Tư có 365 ngày (365 trong một năm nhuận) nhưng lịch âm là ít hơn 11-12 ngày so với lịch Ba Tư.
Reza Paidar

Câu trả lời:


1

Bạn có thể sử dụng một cái gì đó giống như mã này để chuyển đổi và phân tích các chuỗi lịch Hijri sang DateTime của gregorian.

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

}

cảm ơn bạn đã cho thời gian và giải pháp của bạn. Nhưng tôi đã kiểm tra giải pháp của bạn và nó đưa ra một lỗi Day must be between 1 and 29 for month 2. Parameter name: day. Như chúng ta đã tranh luận trước đây trong các bình luận bài viết của mình, Safar của một tháng Hijri (âm lịch) khác có số ngày thay đổi. giải pháp của bạn có cùng một lỗi tương tự như các giải pháp khác.
Reza Paidar

Có thể có một lỗi trong Lớp HijriCalWiki của .Net vì vậy tôi đã chỉnh sửa mã và nó có một cách giải quyết cho ngoại lệ.
Ali Hamidi

Cảm ơn. Tôi không thể nói rằng có lỗi với .net tự do trong trường hợp này. Tôi nhận thấy rằng có nhiều hơn một giao diện là các epoches với Hijri calander mà không có bất kỳ mô tả logic nào. Giải pháp của bạn là một mánh gian lận để bỏ qua lỗi không phải là một câu trả lời khá và chính xác. Tuy nhiên tôi sẽ bỏ phiếu cho bạn về thời gian
Reza Paidar

Tôi đã thấy Mã nguồn của Lớp HijriCalWiki . nó đang kiểm tra DaysInMonth trước khi chuyển đổi ngày. Nó giả định 29 ngày cho Safar (tháng 2). Vì vậy, nó có một lỗi nhỏ trong tháng này
Ali Hamidi

1
Nếu bạn kiểm tra nhận xét về bài đăng của tôi, microsoft đã giới thiệu tài liệu về lịch Hijri và bạn có thể tìm thấy ở đó Safar và tháng khác đã tĩnh trong 29 ngày. Vì vậy, theo một cách nào đó, bạn đúng đây là một lỗi cho thư viện này.
Reza Paidar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.