Entrambe le date, perché è ciò che gli utenti si aspettano (nella maggior parte dei casi)
Ho lavorato su alcuni progetti che dovevano funzionare con la logica che circonda le date e la scadenza delle entità. E ci sono alcune insidie.
La natura di queste trappole è che ciò che ha senso per un programmatore non è necessariamente ciò che ha senso per le persone che usano l'applicazione.
Le persone nel business normalmente dicono cose del genere, questa cosa è attiva dal 1. al 31. di luglio. Ora, ciò che intendono è che entrambe le date sono incluse, cioè dovrebbe essere attiva per 31 giorni, non 30. Ma ciò sfugge alle normali regole aritmetiche.
Quindi, se si pone la domanda dal punto di vista degli utenti finali, nella mia esperienza la risposta dovrebbe essere che è necessario includere entrambe le date quando si calcola il numero di giorni.
Alcuni esempi della mia esperienza lavorativa:
Ho lavorato alla creazione di una bacheca online e abbiamo avuto molti problemi con le date di fine per alcuni tipi di entità (scadenza per un lavoro, una sottoscrizione, ecc.). Questi sarebbero specificati come l'ultimo giorno in cui questa entità era ancora valida, che è ciò che è stato memorizzato nel database. Ma ciò che avrebbe avuto senso nel codice sarebbe stato avere l'ora esatta in cui l'entità avrebbe cambiato stato, cioè alle 00:00 della seguente data. Ciò porta a una logica di dominio molto complessa.
A un certo punto, ho rifattorizzato l'intero sistema, aggiungendo un giorno a ogni EndDate nel database, quindi spostato la logica al livello di presentazione, specificando che la data effettiva presentata all'utente dovrebbe essere il giorno che precede quello nel database. Ciò ha portato a una logica di dominio molto più pulita per quanto riguarda la scadenza degli articoli.
Quando ho realizzato il prossimo progetto con cui era importante la data / la logica di scadenza dell'entità, ho creato un tipo di dati Data specifico per racchiudere queste regole, inclusi gli operatori di confronto di overload con la build in DateTime classe, operatori aritmetici, ecc. Ciò ha portato a un codice ancora più semplice, poiché rispecchiava molto meglio il modello di dominio e sono stati rimossi i requisiti per sottrarre il livello di un giorno da tutti i giorni di fine, rimuovendo anche il rischio che qualcuno dimenticasse di implementarlo.