L'aggiunta di una durata ad una data-ora definita in ISO 8601?

6

Ho scritto una libreria per la data e ho bisogno di implementare l'aggiunta di una durata a una data-ora.

Se aggiungo una durata di 1 mese: P1M al 31 marzo 2012: 2012-03-31 , lo standard definisce il risultato?

Poiché la data risultante (31 aprile) non esiste, esistono almeno due opzioni:

  • Tornare all'ultimo giorno del mese risultante. Questo è l'approccio attualmente adottato dall'API ThreeTen , l'implementazione di riferimento (alfa) di JSR-310:
ZonedDateTime date = ZonedDateTime.parse("2012-03-31T00:00:00Z");
Period duration = Period.parse("P1M");
System.out.println(date.plus(duration).toString());

// 2012-04-30T00:00Z
  • Trasportare il giorno in più al mese successivo. Questo è l'approccio adottato dalla classe DateTime in PHP:
$date = new DateTime('2012-03-31T00:00:00Z');
$duration = new DateInterval('P1M');
echo $date->add($duration)->format('c');

// 2012-05-01T00:00:00+00:00

Sono sorpreso che due librerie di data e ora siano contraddittorie su questo punto, quindi mi chiedo se lo standard definisce il risultato di questa operazione?

    
posta Benjamin 19.12.2012 - 13:13
fonte

3 risposte

4

Lavoro in ambito finanziario e capisco che ci sono diverse convenzioni per seguire questi casi d'angolo.

Segui l'articolo di Wikipedia Contaioni giorni per i dettagli.

ISO_8601 non ha alcun valore specifico per il mese come durata, ma il link La Matematica del calendario ISO 8601 suggerisce il mese come 30.6, l'anno come 365.25, con una gestione aggiuntiva per gli anni bisestili.

    
risposta data 19.12.2012 - 15:15
fonte
1

È un caso limite. Non ho le specifiche per sostenere la mia affermazione, ma ...

Dovresti usare l'ultima data del mese successivo. Altrimenti hai aggiunto due mesi e non un mese.

    
risposta data 19.12.2012 - 13:45
fonte
0

L'aggiunta di mesi non ha senso. Dovresti aggiungere solo per giorni o frazioni di giorni. Anche gli anni possono essere problematici quando si ha a che fare con i giorni bisestili. Intendevi un anno o 365 giorni o 366 giorni?

Dovresti stabilire un'aggiunta relativa. Stai cercando la fine del mese, il primo del mese o l'ultimo giorno lavorativo del mese?

Per la fine del mese uso: Per calcolare l'ultimo giorno di aprile

  1. incrementare il mese di un'unità al di là del mese, regolando l'anno secondo le necessità;
  2. cambia il giorno del mese in uno;
  3. Quindi sottrarre un'unità di un giorno;
risposta data 19.12.2012 - 14:40
fonte

Leggi altre domande sui tag