2016-04-07 39 views
12

Nel codice seguente,perché sto ottenendo risposte errate in funzione data data golang

  • t1 è il tempo di 62 giorni dopo la data 1970/01/01 (gg aa/mm /)
  • t2 è tempo di 63 giorni dopo il 1970/01/01 (dd aa/mm /) data

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 

    t1 := time.Date(0, 0, 62, 0, 0, 0, 0, time.UTC).AddDate(1970, 1, 1) 
    t2 := time.Date(0, 0, 63, 0, 0, 0, 0, time.UTC).AddDate(1970, 1, 1) 

    fmt.Println("Time1: ", t1) 
    fmt.Println("Time2: ", t2) 
} 

Se t1 è:

Time1: 1970-03-04 00:00:00 +0000 UTC 

mi aspetto T2 da:

Time2: 1970-03-05 00:00:00 +0000 UTC 

Ma l'output è:

Time2: 1970-03-02 00:00:00 +0000 UTC 

Qual è la ragione di questo?

risposta

11

t1 è tempo di 62 giorni dopo la data 1970/1/1 (aa/mm /) t2 è il tempo di 63 giorni dalla data 1970/1/1 (dd aa/mm /)

Questo non è vero. t1 è il tempo 1970 anni, 1 mese e 1 giorno dopo qualsiasi mezzo time.Date(0, 0, 62, 0, 0, 0, 0, time.UTC).

fmt.Println(time.Date(0, 0, 62, 0, 0, 0, 0, time.UTC)) 
fmt.Println(time.Date(0, 0, 63, 0, 0, 0, 0, time.UTC)) 

ci dà:

0000-01-31 00:00:00 +0000 UTC 
0000-02-01 00:00:00 +0000 UTC 

Questo è completamente sbagliato. UTC non è definito per nessuna data prima del 1972, il calendario gregoriano non inizia fino al 1582 e non c'è mai stato alcun anno 0. Ignorando tutto ciò, non vedo come il giorno 63 di un anno possa essere interpretato come il 31 gennaio, ma andiamo con esso comunque.

Aggiungiamo le cose al primo timestamp: aggiungere 1970, otteniamo 1970-01-31. Aggiungi un mese, otteniamo 1970-02-31. Ma 1970-02-31 non è una data valida. Quindi è normalizzato fino al 3 marzo. Il 1970 non è stato un anno bisestile, febbraio ha avuto 28 giorni, quindi il 29 febbraio è il 1 marzo, il 30 febbraio è il 2 marzo, il 31 febbraio è il 3 marzo. Aggiungi un giorno al 1970-03-03 e otteniamo il 1970-03-04.

Il secondo timestamp analizza già al 1 ° febbraio. Aggiungi un mese e arriviamo il 1 ° marzo, aggiungi un giorno e arriviamo il 2 marzo.

Questo è ciò che accade quando si aggiungono mesi ai timestamp. Un mese non è una durata ben definita. Quindi la biblioteca cerca di essere intelligente per te e questo ti dà risultati inaspettati.

Btw. per qualche motivo: fmt.Println(time.Date(0, 0, 0, 0, 0, 0, 0, time.UTC)) viene interpretato come -0001-11-30 00:00:00 +0000 UTC. Non ho idea del perché. Non ha importanza perché l'anno 0 e il mese 0 non esistono. Ma spiega perché i precedenti timestamp finiscono il 31 gennaio e il 1 ° febbraio.

Non vi è alcun motivo per aggiungere dati a questo ordine in AddDate. Non è documentato per quanto posso vedere. Potrebbe anche aver aggiunto prima il giorno, poi il mese, poi gli anni. Prova a eseguire questo:

fmt.Println(time.Date(2015, 1, 31, 0, 0, 0, 0, time.UTC).AddDate(1, 0, 0).AddDate(0, 1, 0)) 
fmt.Println(time.Date(2015, 1, 31, 0, 0, 0, 0, time.UTC).AddDate(0, 1, 0).AddDate(1, 0, 0)) 
Problemi correlati