c# - गैर-स्थलीय कैलेंडर को कार्यान्वित करना




.net datetime calendar (3)

System.Globalization.Calendar से वैश्वीकरण नामस्थान (यानी JapaneseCalendar कैलेंडर) के भीतर कई गैर-ग्रेगोरियन कैलेंडर क्लास व्युत्पन्न हैं। आप अपना खुद का कार्यान्वयन करने में सक्षम होना चाहिए। मैं एक नमूना चाबुक करूँगा, लेकिन कैलेंडर वर्ग में 16 अमूर्त विधियां हैं ...

आप GregorianCalendar से बस अपनी कक्षा को प्राप्त करने में सक्षम हो सकते हैं और केवल GetMilliseconds(DateTime) विधि को ओवरराइड कर GetMilliseconds(DateTime) , बेस के रिटर्न वैल्यू को 1.027d गुणा करके 1.027d

चूंकि मैं किसी अन्य प्रश्न के समाधान में देख रहा था, मैंने खुद को यह सोचकर पाया कि क्या पृथ्वी कैलेंडर के आधार पर कैलेंडर को लागू करने के लिए .NET के Calendar वर्ग का उपयोग करना संभव था या नहीं।

उदाहरण के लिए, मंगल ग्रह पृथ्वी पर एक दिन से 2.7% लंबा है:

आज तक अंतरिक्ष यान लैंडर परियोजनाओं द्वारा उपयोग किए जाने वाले एक सम्मेलन को 24 घंटे "मंगल घड़ी" का उपयोग करके स्थानीय सौर समय का ट्रैक रखना है, जिस पर घंटे, मिनट और सेकंड उनके मानक (पृथ्वी) अवधि से 2.7% अधिक हैं।

MarsCalendar को कार्यान्वित करने का कोई अच्छा तरीका है कि एक सेकंड की लंबाई मानक GregorianCalendar से अलग है, और इस प्रकार सभी मानक AddDays() , AddHours() , आदि कार्यों के लिए DateTime ऑब्जेक्ट्स का उपयोग करने में सक्षम हो सकता है? (नोट: आदर्श रूप से, एक समाधान - यदि कोई अस्तित्व में है - ग्रह के किसी भी रूप पर लागू होगा जिसके लिए लगातार लंबाई के "1 दिन" और "1 वर्ष" दोनों को परिभाषित करना संभव है। मंगल ग्रह एक महान उदाहरण बनाता है, हालांकि )


जवाब न है।

कैलेंडर दृढ़ता से एक संस्कृति का उत्पाद है।
उदाहरण के लिए यहां भी पृथ्वी पर कई कैलेंडर हैं ..
कुछ संस्कृतियों के लिए एक दिन शुरू होता है और दूसरों के लिए सूर्योदय पर समाप्त होता है यह सूर्यास्त है ..

आप क्या कर सकते हैं नियंत्रित वातावरण में कुछ सार्वभौमिक स्थिरता को प्रारंभिक संदर्भ बिंदु के रूप में तय करना है .. जैसे कि परमाणु घड़ी कैसे बनाई जाती है .. इससे आपको सबसे छोटा समय मिल सकता है .. और उस पर आप निर्माण कर सकते हैं अन्य उपायों का एक पैमाने, ऐसे दूसरे, घंटे, दिन और आदि ..
लेकिन आपको वास्तव में इसकी आवश्यकता नहीं है .. पृथ्वी जो सूर्य को घूमती है वह एक ही चीज़ प्राप्त करने के लिए पहले से ही एक प्राकृतिक स्रोत है और इसके लिए कोई निर्माण प्रयास की आवश्यकता नहीं है .. यह आपको संतोषजनक सटीकता में एक ही परिणाम देगा और इसमें लगभग 6 मिलियन लोग हैं लगातार यह क्यूइंग।

मंगल पर तारीख या समय क्या है? यह पृथ्वी पर जैसा ही है।

यदि आप कैलेंडर को समझने की एकता को "विस्फोट" करना चाहते हैं .. प्रत्येक दिव्य वस्तु को सिद्धांतित करने से अपना स्थानीय समय हो सकता है ... कोई समस्या नहीं - लेकिन आपको यह स्वीकार करना होगा कि उन स्थानीय समयों में आम सामान्य साझा नियम नहीं होगा, वे arbiter और "संस्कृति" या प्रति वस्तु के कुछ अन्य arbiter चयन से संबंधित होगा - जिसका अर्थ है कि पार्सिंग गणना करने के लिए नरक होगा और प्रति वस्तु होना होगा।
(इसका मतलब यह नहीं है कि मैं खुद ही विचार के खिलाफ हूं)


मैंने पुन: उपयोग के लिए अपनी बेस लाइब्रेरी में एक्सटेंशन विधि बनाई:

public static class INotifyPropertyChangedExtensions
{
    public static bool SetPropertyAndNotify<T>(this INotifyPropertyChanged sender,
               PropertyChangedEventHandler handler, ref T field, T value, 
               [CallerMemberName] string propertyName = "",
               EqualityComparer<T> equalityComparer = null)
    {
        bool rtn = false;
        var eqComp = equalityComparer ?? EqualityComparer<T>.Default;
        if (!eqComp.Equals(field,value))
        {
            field = value;
            rtn = true;
            if (handler != null)
            {
                var args = new PropertyChangedEventArgs(propertyName);
                handler(sender, args);
            }
        }
        return rtn;
    }
}

यह CallerMemberNameAttribute वजह से .NET 4.5 के साथ काम करता है। यदि आप इसे पहले के .NET संस्करण के साथ उपयोग करना चाहते हैं तो आपको विधि घोषणा को बदलना होगा: ...,[CallerMemberName] string propertyName = "", ... to ...,string propertyName, ...

उपयोग:

public class Dog : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    string _name;

    public string Name
    {
        get { return _name; }
        set
        {
            this.SetPropertyAndNotify(PropertyChanged, ref _name, value);
        }
    }
}






c# .net datetime calendar