มีตัวแปลงที่ถูกต้องสำหรับวันที่ฮิจเราะห์เป็นวันที่แบบคริสต์ศักราชหรือไม่


10

ฉันทำงานหลายโครงการที่มีการแปลงวันที่ ตัวอย่างเช่นฉันทำงานในปฏิทินสุริยคติและวิธีแปลงให้เป็นวันที่แบบคริสต์ศักราชและในทางกลับกัน ปฏิทินสุริยคติ (ปฏิทินเปอร์เซีย) เกือบจะคล้ายกับวันที่แบบคริสต์ศักราชในแง่ของจำนวนวันในหนึ่งปี [ก้าวกระโดดหรือไม่]
แต่เมื่อเร็ว ๆ นี้ฉันได้ทำงานในโครงการที่มีปฏิทินจันทรคติ ขณะที่ฉันค้นคว้าเกี่ยวกับปฏิทินจันทรคติฉันก็ตระหนักว่าไม่มีวิธีการทางตรรกะเดียวในการแปลงระบบจันทรคติเป็นพลังงานแสงอาทิตย์ (อย่างน้อยเท่าที่ฉันรู้)
นี่คือลิงค์อ้างอิงบางส่วนที่ฉันค้นคว้าเกี่ยวกับพวกเขา:

  1. ไม่สามารถแปลงจาก Hijri Date เป็น Gregorian date (c #)
  2. แปลงวันที่จาก Hijri Calendar เป็น Gregorian Calendar และในทางกลับกัน
  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();

ข้อผิดพลาดสำหรับรหัสข้างต้น:

"วันต้องอยู่ระหว่าง 1 ถึง 29 สำหรับเดือน 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();

ข้อผิดพลาดสำหรับรหัสข้างต้น:

"วันต้องอยู่ระหว่าง 1 ถึง 29 สำหรับเดือน 2"

หลังจากนั้นฉันพยายามที่จะเข้าใจว่ามีอัลกอริทึมใดในการปรับใช้วันที่แปลงฮิจเราะห์เป็นวันที่แบบคริสต์ศักราช?
ดังนั้นฉันจึงทดสอบตัวแปลงวันที่ออนไลน์ของอิสลามและฉันก็ประหลาดใจ!
แค่ลองใส่ตัว"1441/2/30"แปลงวันที่ทั้งคู่
คนแรกที่กลับมาOctober 30, 2019
และคนที่สองที่กลับมา29 October 2019
Hijri gregorian-Converter
Islamic Date Converter - Gregorian Calendar Converter

ดังนั้นฉันไม่รู้ว่ามีอัลกอริทึมจริง ๆ ในการแปลงวันที่ฮิจเราะห์เป็นเกรกอเรียน
ขอบคุณล่วงหน้าสำหรับเวลาของคุณ

สำหรับข้อมูลเพิ่มเติม https://www.wikiwand.com/simple/Islamic_calendar


อัปเดต : ฉันรู้ว่าไม่มีไลบรารีที่ถูกต้องสำหรับความรู้ แต่ถ้าใครมีความรู้หรือรายละเอียดเกี่ยวกับปฏิทินฮิจเราะห์ (อินเทอร์เฟซทั้งหมด) โปรดอธิบายที่นี่ฉันต้องการปรับใช้ปฏิทินฮิจเราะห์สำหรับทุกคน


ตัวอย่างของคุณควรให้ผลลัพธ์เป็น 17 ตุลาคม 2019 หรือไม่
snr - Reinstate Monica

เมื่อคุณลองตัวอย่างในsearchtruth.com/hijriผลลัพธ์จะผิดหรือไม่?
snr - Reinstate Monica

ผมไม่ทราบว่าเป็นผลผลิตที่ถูกต้องเนื่องจากวันที่สองแปลงอิสลามที่ฉันกล่าวถึงในการโพสต์ของฉันเอาท์พุทที่ควรจะเป็นหรือOctober 30, 2019 wed October 29, 2019 tueฉันลองแล้ว
Reza Paidar

วันที่ป้อนของคุณดูเหมือนผิด ถ้าคุณได้รับใน 1441 แทน 1442 เพื่อความปลอดภัยที่ 30 ตรวจสอบความถูกต้องของวันที่ของคุณ
snr - Reinstate Monica

1
@Gus: ปฏิทินเปอร์เซียใช้กับระบบสุริยจักรวาลและคิดค้นโดยOmar khayyamนักคณิตศาสตร์ชาวเปอร์เซีย ปฏิทินเปอร์เซียมี 365 วัน (366 ในปีอธิกสุรทิน) แต่ปฏิทินจันทรคตินั้นน้อยกว่าปฏิทินเปอร์เซีย 11-12 วัน
Reza Paidar

คำตอบ:


1

คุณสามารถใช้บางอย่างเช่นรหัสนี้ในการแปลงและแยกสตริงฮิจเราะห์ปฏิทินเป็น gregorian 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ขึ้น ดังที่เราถกเถียงกันก่อนหน้านี้ในความคิดเห็นโพสต์ของฉัน Safar ของเดือน Hijri อื่น (จันทรคติ) มีจำนวนวันแปรผัน โซลูชันของคุณมีข้อผิดพลาดเดียวกันกับโซลูชันอื่น ๆ
Reza Paidar

อาจจะมีข้อผิดพลาดในHijriCalendar Class ของ. Net ดังนั้นฉันจึงแก้ไขรหัสและมีวิธีแก้ไขสำหรับข้อยกเว้น
Ali Hamidi

ขอบคุณ ฉันไม่สามารถพูดได้ว่ามีข้อผิดพลาดกับ. net Liberary ในกรณีนี้ ฉันสังเกตเห็นว่ามีมากกว่าหนึ่งอินเทอร์เฟซเป็นยุคกับฮิจเราะห์โดยไม่มีคำอธิบายเชิงตรรกะใด ๆ วิธีแก้ปัญหาของคุณคือการโกงข้ามข้อผิดพลาดไม่ใช่คำตอบที่ค่อนข้างแม่นยำ อย่างไรก็ตามฉันจะลงคะแนนให้คุณเพื่อให้เวลา
Reza Paidar

ฉันได้เห็นซอร์สโค้ดของHijriCalendar Class แล้ว มันกำลังตรวจสอบ DaysInMonth ก่อนที่จะแปลงวันที่ จะถือว่า 29 วันสำหรับSafar (เดือนที่ 2) ดังนั้นจึงมีข้อบกพร่องเล็กน้อยสำหรับเดือนนี้
Ali Hamidi

1
หากคุณตรวจสอบความคิดเห็นในโพสต์ของฉัน microsoft ได้แนะนำเอกสารสำหรับปฏิทินฮิจเราะห์และคุณสามารถดูได้ที่นั่น Safar และเดือนอื่น ๆ นั้นมีเวลา 29 วัน ในบางกรณีคุณพูดถูกนี่เป็นข้อบกพร่องของห้องสมุดนี้
Reza Paidar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.