क्या हिजरी तारीख से ग्रेगोरियन तारीखों के लिए कोई सही कनवर्टर है


10

मेरे पास कई प्रोजेक्ट्स हैं जिनमें डेट कंवर्ट हैं। उदाहरण के लिए, मैं सौर कैलेंडर पर काम करता हूं और उन्हें ग्रेगोरियन तिथियों में परिवर्तित करता हूं और इसके विपरीत। सौर कैलेंडर (फारसी कैलेंडर) एक वर्ष में दिनों की संख्या [लीप या नहीं] के संदर्भ में ग्रेगोरियन तिथि के लगभग समान है।
लेकिन मैंने हाल ही में चंद्र कैलेंडर के साथ एक परियोजना पर काम किया। जैसा कि मैंने चंद्र कैलेंडर पर शोध किया है, मुझे एहसास हुआ कि चंद्र प्रणाली को सौर में बदलने के लिए कोई एकल तार्किक तरीका नहीं है (कम से कम जहां तक ​​मुझे पता है)।
यहाँ कुछ संदर्भ लिंक दिए गए हैं जिन पर मैंने शोध किया है:

  1. हिजरी तारीख से ग्रेगोरियन तिथि में परिवर्तित नहीं किया जा सकता (c #)
  2. से परिवर्तित तिथि Hijri कैलेंडर ग्रेगोरियन कैलेंडर और vise के लिए
  3. हिजरी तारीख DateTime.Parse का उपयोग कर gregorian करने के लिए
  4. में परिवर्तित करें Hijri तिथि ग्रेगोरियन तिथि तक

जैसा कि मैंने उपरोक्त लिंक का पालन किया, प्रशिक्षण, और परीक्षण करने वाले लोगों ने एल्गोरिदम प्रस्तुत किए, मैंने देखा कि उनमें से कोई भी बिल्कुल सही नहीं है।

यह कहने के लिए पर्याप्त है, बस "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();

कोड के लिए त्रुटि:

स्ट्रिंग द्वारा प्रस्तुत दिनांक समय कैलेंडर System.Globalization.ijriCalendar में समर्थित नहीं है।

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
और दूसरा एक 29 October 2019
हिजरी ग्रेगोरियन-कन्वर्टर
इस्लामिक डेट कन्वर्टर - ग्रेगोरियन कैलेंडर कन्वर्टर

इसलिए मुझे नहीं पता कि हिजरी तारीखों को ग्रेगोरियन में बदलने के लिए कोई वास्तविक एल्गोरिदम है।
आपके समय के लिए आपका अग्रिम धन्यवाद।

अधिक जानकारी के लिए, https://www.wikiwand.com/simple/Islamic_calendar


अपडेट : मुझे पता है कि जानने के लिए कोई सही पुस्तकालय नहीं है। लेकिन अगर किसी के पास हिजरी कैलेंडर (इसके सभी इंटरफ़ेस) के बारे में जानकारी या विवरण है, तो कृपया यहाँ केवल यह वर्णन करें कि मैं वास्तव में एक हिजरी कैलेंडर को सभी के लिए तैनात करना चाहता हूं।


क्या आपके उदाहरण को 17-अक्टूबर -2019 के रूप में आउटपुट देना चाहिए?
एसएनआर -

जब आप अपना उदाहरण searchtruth.com/hijri पर आज़माते हैं , तो इसका परिणाम गलत तारीख होता है ??
एसएनआर -

मैं वास्तव में नहीं जानता कि दो इस्लामिक तारीख कनवर्टर के कारण क्या सही आउटपुट है, जिसका मैंने अपने पोस्ट में उल्लेख किया है, आउटपुट होना चाहिए October 30, 2019 wedया October 29, 2019 tue। मैंने अब कोशिश की।
रेजा पेडर

आपकी इनपुट तिथि गलत है यदि आप 30 वें सुरक्षित के लिए 1442 के बजाय 1441 में प्राप्त करते हैं। अपनी तिथि की शुद्धता की जांच करें।
एसएनआर -

1
@ गुस: फारसी कैलेंडर सौर प्रणाली का उपयोग कर रहा है और Omar khayyamफारसी गणितज्ञ द्वारा आविष्कार किया गया है। फारसी कैलेंडर में 365 दिन (एक लीप वर्ष में 366) होते हैं, लेकिन चंद्र कैलेंडर फारसी कैलेंडर की तुलना में 11-12 दिन कम है।
रेजा पेडर

जवाबों:


1

आप इस कोड का उपयोग कुछ इस तरह से कर सकते हैं कि हिजरी कैलेंडर स्ट्रिंग्स को ग्रिगोरियन डेटटाइम में कनवर्ट और पार्स करें।

//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। जैसा कि हमने अपनी पोस्ट टिप्पणियों में पहले तर्क दिया था, एक अन्य हिजरी (चंद्र) महीने के सफर में चर दिनों की गिनती होती है। आपके समाधान में अन्य समाधानों के समान त्रुटि है।
रेजा पेडर

हो सकता है कि .Net के HijriCalendar क्लास में एक बग हो, इसलिए मैंने कोड को संपादित किया और इसमें अपवाद के लिए वर्कअराउंड है।
अली हमीदी

धन्यवाद। मैं यह नहीं कह सकता कि इस मामले में .net स्वतंत्रता के साथ बग है। मैंने देखा कि बिना किसी तार्किक विवरण के हिजरी कैलंडर के एक से अधिक इंटरफेस हैं। आपका समाधान त्रुटि को छोड़ने के लिए एक धोखा है जो एक काफी और सटीक उत्तर नहीं है। हालाँकि मैं समय देने के लिए आपको वोट
दूंगा

मैंने HijriCalendar Class का स्रोत कोड देखा है । यह तिथियों को परिवर्तित करने से पहले DaysInMonth की जाँच कर रहा है। यह सफार (2 महीने) के लिए 29 दिन मानता है । तो यह इस महीने के लिए एक छोटा सा बग है
अली हमीदी

1
यदि आप मेरी पोस्ट पर टिप्पणियों की जांच करते हैं, तो Microsoft ने हिजरी कैलेंडर के लिए दस्तावेज पेश किए और आप पता लगा सकते हैं कि सफार और अन्य महीने में लगभग 29 दिन हैं। तो किसी तरह से आप सही हैं कि यह इस लाइब्रेरी के लिए एक बग है।
रेजा पेडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.