Pergunta

Eu preciso para modelar algumas informações sobre estações e necessidade de controlá-los com base na data de início / fim de uma forma agnóstica anos. Ou seja, Eu preciso para permitir que os usuários definam verão como sendo entre, digamos, 15 maio e 10 de setembro, e fazer isso para todos os anos.

Vou precisar de fazer um monte de verificação do tipo isThisDateInSeason). Todas as funções de manipulação a data (ou seja, Data, Calendário) parecem funcionar apenas com datas válidas, ou seja, incluindo informações ano.

Há algum melhores práticas em torno de como fazer isso? Não posso pensar em um monte de maneiras hacky de fazê-lo (ou seja, loja de mês e dia do mês ou datas de lojas e apenas trazê-los a um ano de referência para que eu possa pode comparar), mas parece que pode haver uma maneira melhor .

Eu estou escrevendo isso em Java ou Groovy.

O relator Joda-Time ajuda biblioteca aqui? Eu não tenho experiência com isso, mas parece ter muito mais flexibilidade.

este pergunta sobre como identificar um temporada a partir da data, mas que se concentra em meses, e eu preciso de mais flexibilidade para incluir datas.

Foi útil?

Solução

Se cada usuário possui seus próprios dados (ou seja, eles especificam as suas estações e então inserir suas próprias informações), então você pode apenas armazenar os dados com a estação como parte dela, porém eu tenho um sentimento o cenário que você está depois é para os dados compartilhados entre vários usuários que definem as estações de forma diferente.

Você teria que ter muito cuidado para datas 'normalizar' como o ano bissexto pode causar problemas inesperados, ou seja, tentar definir 29 de fevereiro em um ano não bissexto causará problemas / exceções.

Eu coloquei a seguir juntos, unforutnatly seu c #, mas o conceito será o mesmo. I havnt realmente testado o código, mas como até mesmo como código psudo pode ajudar.

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;
        }

    }
}

Observe o código acima faz a suposição de que a temporada não vai começar e terminar no mesmo mês - um bastante segura Acho

Outras dicas

Eu acho que você vai ter que rolar sua própria classe DateRange, embora este seja um problema tão comum que você esperaria já existe uma util inteligente lá fora que faz isso. Como ponto geral quando se trata de estações você também tem que ter em conta a geografia, o que vai tornar a vida muito difícil. Em Oz somos o inverso dos EUA, assim Verão vai de novembro a fevereiro.

Onde está a dados? Se ele estiver em um banco de dados que eu consideraria fazer uma mesa para datas (como uma dimensão de tempo em OLAP). Você pode então calcular uma coluna para as suas estações como eles são para trimestres financeiros em em alguns exemplos Time Dimension. (Isso é assumindo que a sua temporada não muda, mas tem datas fixas).

Todos os "se a data na estação" verificação de tipo será pré-construído empurrando os custos de cálculo da temporada em seu tempo de configuração em vez de seu tempo de execução.

Editar: Só vi o seu comentário em datas temporada configurável usuário. Este trabalho seria ainda como você pode fazer uma junção em um banco de dados, incluindo a dimensão de tempo que poderia ser mais fácil trabalhar com o conjunto de dados, em seguida, em Java.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top