Intervalos de Tempo

Aberto, Fechado e suas Implicações em Sistemas Reais

Por que isso importa?

Quando lidamos com dados de séries temporais — como medições de energia, reservas de hotel, períodos promocionais ou agendamentos médicos — definir corretamente os intervalos de tempo evita bugs sutis e garante que agregações, filtros e análises sejam confiáveis.

O que é um intervalo de tempo?

Um intervalo define uma faixa entre dois pontos no tempo: start e end. A questão fundamental é: o valor inicial (start) e final (end) estão incluídos no intervalo?

Existem quatro tipos principais:

  • [start, end] → Fechado: inclui o start e o end.
  • [start, end) → Semifechado à direita: inclui start, mas não inclui end.
  • (start, end] → Semifechado à esquerda: não inclui start, mas inclui end.
  • (start, end) → Aberto: não inclui start nem end.

Exemplos reais no dia a dia

  • Reservas de hotéis e Airbnb:
  • Geralmente usam [start, end).
  • Se você reservar de 10 a 15 de abril, o check-in é no dia 10 e check-out no dia 15, sem ocupar este último dia integralmente.
  • Eventos em calendários (Google Calendar, Outlook):
  • Tipicamente [start, end).
  • Um evento das 14h às 15h inclui exatamente o início das 14h, mas não as 15h, permitindo eventos subsequentes exatamente às 15h.
  • Promoções em e-commerce:
  • Frequentemente [start, end].
  • Uma promoção válida de 1 a 10 de dezembro inclui o último dia completo.
  • Períodos fiscais e contábeis:
  • Normalmente [start, end].
  • Incluem todas as transações realizadas exatamente no último dia do período.

Na prática: por que isso muda tudo?

Imagine medições de energia feitas a cada 5 minutos:

  • Uma medição às 10:00 e outra às 10:05.
  • Se você agrega intervalos em buckets, usando [start, end), a medição feita exatamente às 10:05 pertence ao próximo bucket (10:05-10:10).
  • Caso use [start, end], terá que lidar com sobreposição ou duplicidade nas bordas.

Como escolher e padronizar na aplicação?

A escolha depende do contexto:

  • Dados contínuos (medição, eventos recorrentes): [start, end) é o padrão ideal.
  • Evita duplicidade em pontos exatos nas bordas.
  • Dados pontuais (promoções, período fiscal): [start, end] pode ser melhor.
  • Garante que o último instante exato seja sempre incluído.

Sugestão prática:

  • Escolha um padrão ([start, end) é o mais comum).
  • Seja explícito sobre isso na documentação.
  • Use enums ou helpers para não deixar margem a dúvidas.

Implementação simples no código

Exemplo prático em C#:

public enum IntervalType
{
    Closed,       // [start, end]
    Open,         // (start, end)
    LeftClosed,   // [start, end)
    RightClosed   // (start, end]
}

public bool IsWithin(DateTime value, DateTime start, DateTime end, IntervalType type)
{
    return type switch
    {
        IntervalType.Closed => value >= start && value <= end,
        IntervalType.Open => value > start && value < end,
        IntervalType.LeftClosed => value >= start && value < end,
        IntervalType.RightClosed => value > start && value <= end,
        _ => throw new ArgumentOutOfRangeException()
    };
}
C#

Conclusão

Pode parecer apenas detalhe técnico, mas intervalos de tempo influenciam diretamente a qualidade, precisão e confiança das aplicações. Definir claramente um padrão evita bugs sutis e facilita a manutenção e evolução do sistema.