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.