문제

계절에 대한 몇 가지 정보를 모델링해야하며 계절에 대한 정보가 1 년 동안 시작 / 종료 날짜를 기준으로 추적해야합니다. 즉, 사용자가 여름을 5 월 15 일과 9 월 10 일 사이에있는 것으로 정의 할 수 있도록해야합니다.

ISTHISDATEINSEASOSY 유형을 많이 점검해야합니다). 모든 날짜 조작 함수 (예 : 날짜, 달력)는 연도 정보를 포함하여 유효한 날짜와 만 작동하는 것으로 보입니다.

이 작업을 수행하는 방법에 대한 모범 사례가 있습니까? 나는 그것을하는 많은 해킹 방법을 생각할 수 있습니다 (즉, 월과 날의 매월 또는 날짜를 저장하고 기준 연도로 가져와 비교할 수 있습니다). .

나는 이것을 Java 또는 Groovy로 쓰고 있습니다.

할 것입니다 조다-시간 도서관 도서 여기서 도와 요? 나는 그것에 대한 경험이 없지만 훨씬 더 유연성이있는 것으로 보입니다.

나는 찾았다 이 질문 날짜부터 시즌을 식별하는 방법에 대해서는 몇 달에 중점을두고 있으며 날짜를 포함시키기 위해 더 많은 유연성이 필요합니다.

도움이 되었습니까?

해결책

각 사용자가 자신의 데이터를 소유하고 있다면 (즉, 계절을 지정한 다음 자체 정보를 입력하면) 시즌에 데이터를 그 일부로 저장할 수 있지만, 당신이 후에있는 시나리오가 공유 데이터에 대한 느낌을 느낍니다. 계절을 다르게 정의하는 수많은 사용자에 걸쳐 있습니다.

도약 연도가 예기치 않은 문제를 일으킬 수 있으므로 날짜를 '정상화'하는 데 매우주의해야합니다. 즉, 2 월 29 일을 비약 연도에 설정하려고하면 문제 / 예외가 발생할 수 있습니다.

나는 아래를 c#에 묵시적으로 결합했지만 개념은 동일합니다. 나는 실제로 코드를 테스트하지 않았지만 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;
        }

    }
}

위의 코드는 같은 달에 시즌이 시작되고 끝나지 않을 것이라고 가정합니다.

다른 팁

나는 당신이 자신의 데테랑 클래스를 굴려야한다고 생각하지만, 이것은 당신이 이미 그것을하는 영리한 util이 있기를 바랍니다. 계절을 다룰 때 일반적으로 지리를 고려해야합니다. 이는 인생을 정말 어렵게 만들 것입니다. 오즈에서 우리는 미국의 반대이므로 여름은 11 월부터 2 월까지 진행됩니다.

데이터는 어디에 있습니까? 데이터베이스에있는 경우 날짜 (OLAP의 시간 치수와 같은) 날짜 테이블을 만드는 것을 고려할 것입니다. 그런 다음 시간 차원 예제에서 금융 분기와 마찬가지로 계절의 열을 계산할 수 있습니다. (이것은 계절이 변하지 않고 고정 날짜가 있다고 가정합니다).

모든 "계절의 날짜"유형 확인은 시즌을 런타임보다 설정 시간으로 계산하는 데 드는 비용을 미리 작성합니다.

편집하다: 사용자 구성 가능한 시즌 날짜에 대한 의견을 보았습니다. 이것은 시간 차원을 포함하여 데이터베이스에 가입을 할 수 있는데, 이는 데이터 세트를 사용하여 Java에서 더 쉽게 작업 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top