أفضل الممارسات من أجل تجاهل العام في موعد تاريخ نطاقات

StackOverflow https://stackoverflow.com/questions/601036

  •  03-07-2019
  •  | 
  •  

سؤال

أحتاج إلى نموذج بعض المعلومات حول الفصول, و تحتاج إلى تتبع لهم على أساس بداية / نهاية التاريخ في السنة-الملحد الطريق.أولا-هاء.أريد أن تسمح للمستخدمين لتحديد الصيف كما يجري بين 15 مايو و سبتمبر 10th, وتفعل ذلك عن كل السنوات.

سوف تحتاج إلى القيام بالكثير من التحقق من نوع isThisDateInSeason).كل تاريخ التلاعب وظائف (أيتاريخ التقويم) يبدو أن تعمل فقط مع تواريخ سارية ، أيبما في ذلك معلومات السنة.

هل هناك أي أفضل الممارسات حول كيفية القيام بذلك ؟ أستطيع أن أفكر في مجموعة من hacky طرق للقيام بذلك (أيمتجر شهر و يوم من الشهر أو لتخزين التمور و تقديمهم إلى سنة الأساس لذا لا يمكن مقارنة) ، ولكن يبدو أن قد تكون هناك طريقة أفضل.

أنا أكتب هذا في جافا أو رائع.

هل Joda الوقت مكتبة المساعدة هنا ؟ ليس لدي خبرة في ذلك ، ولكن يبدو أن لديهم المزيد من المرونة.

وجدت هذا السؤال حول كيفية تحديد الموسم من التاريخ, ولكن يركز على أشهر, وأنا بحاجة إلى المزيد من المرونة إدراج التواريخ.

هل كانت مفيدة؟

المحلول

إذا يملك كل مستخدم البيانات الخاصة بها (أي أنها تحدد مواسم، وبعد ذلك إدخال المعلومات الخاصة بهم) ثم هل يمكن أن مجرد تخزين البيانات مع موسم كجزء من ذلك، ولكن لدي شعور السيناريو كنت بعد غير البيانات المشتركة عبر العديد من المستخدمين الذين يعرفون مواسم مختلفة.

وأنت يجب أن نكون حذرين للغاية إلى 'تطبيع' يعود كما هو سنة كبيسة قد يسبب مشاكل غير متوقعة، أي محاولة لوضع 29 فبراير عن العام غير قفزة سوف يسبب مشاكل / الاستثناءات.

ولقد وضعت أدناه معا، unforutnatly في ج # ولكن مفهوم أن تكون هي نفسها. أنا havnt اختبارها في الواقع رمز، ولكن بوصفها حتى كود psudo أنها قد تساعد.

public class SeasonChecker
{
    public enum Season {Summer, Autumn, Winter, Spring};
    private List<SeasonRange> _seasons = new List<SeasonRange>();

    public void DefineSeason(Season season, DateTime starting, DateTime ending)
    {
        starting = starting.Date;
        ending = ending.Date;

        if(ending.Month < starting.Month)
        {
            // split into 2
            DateTime tmp_ending = new DateTime(ending.Year, 12, 31);
            DateTime tmp_starting = new DateTime(starting.Year, 1, 1);

            SeasonRange r1 = new SeasonRange() { Season = season, Starting= tmp_starting, Ending = ending };
            SeasonRange r2 = new SeasonRange() { Season = season, Starting= starting, Ending = tmp_ending };

            this._seasons.Add(r1);
            this._seasons.Add(r2);
        }
        else
        {
            SeasonRange r1 = new SeasonRange() { Season = season, Starting= starting, Ending = ending };
            this._seasons.Add(r1);
        }
    }

    public Season GetSeason(DateTime check)
    {
        foreach(SeasonRange range in _seasons)
        {
            if(range.InRange(check))
                return range.Season;
        }

        throw new ArgumentOutOfRangeException("Does not fall into any season");
    }


    private class SeasonRange
    {
        public DateTime Starting;
        public DateTime Ending;
        public Season Season;

        public bool InRange(DateTime test)
        {
            if(test.Month == Starting.Month)
            {
                if(test.Day >= Starting.Day)
                {
                    return true;
                }
            }
            else if(test.Month == Ending.Month)
            {
                if(test.Day <= Ending.Day)
                {
                    return true;
                }
            }
            else if(test.Month > Starting.Month && test.Month < Ending.Month)
            {
                return true;
            }

            return false;
        }

    }
}

ملاحظة رمز أعلاه يجعل افتراض أن هذا الموسم لن تبدأ وتنتهي في نفس الشهر - واحدة آمنة إلى حد كبير أعتقد

نصائح أخرى

وأعتقد سيكون لديك للفة الطبقة DATERANGE الخاصة بك، على الرغم من أن هذا هو مثل مشكلة شائعة كنت آمل هناك بالفعل ذكي UTIL الى ان هناك يفعل ذلك. كنقطة العامة عند التعامل مع مواسم عليك أيضا أن تأخذ في الاعتبار الجغرافيا، الأمر الذي سيجعل الحياة صعبة حقا. في عوز نحن على عكس الولايات المتحدة، لذلك يمتد الصيف من نوفمبر الى فبراير شباط.

أين هي البيانات ؟ إذا كان في قاعدة البيانات أود أن تنظر في جدول التواريخ (مثل البعد الزمني في OLAP).ثم يمكنك حساب عمود الفصول كما هي المالية أرباع في بعض الوقت البعد الأمثلة.(هذا على افتراض أن الموسم لا يتغير ولكن لديها تواريخ ثابتة).

كل "إذا كان التاريخ في موسم" نوع التحقق سوف يكون بنيت قبل دفع تكاليف لحساب الموسم في وقت الإعداد بدلا من وقت التشغيل الخاص بك.

تحرير: فقط رأيت تعليقك على المستخدم شكلي مواعيد الموسم.هذا سوف لا تزال تعمل كما يمكنك الانضمام في قاعدة البيانات بما في ذلك البعد الزمني الذي يمكن أن يكون من الأسهل العمل مع مجموعة من البيانات ثم في جاوة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top