2013-07-13 22 views
16

Voglio ottenere un datetime, contando settimane da una data, giorni da una settimana e secondi da 00:00.Qualcosa come python timedelta in golang

Con Python posso usare questo:

BASE_TIME = datetime.datetime(1980,1,6,0,0) 
tdelta = datetime.timedelta(weeks = 1722, 
          days = 1, 
          seconds = 66355) 
mydate = BASE_DATE + tdelta 

Sto cercando di farlo con Go, ma ho qualche problema per raggiungerlo:

package main 

import (
    "fmt" 
    "time" 
) 

var base = time.Date(1980, 1, 6, 0, 0, 0, 0, time.UTC) 

func main() { 
    weeks := 1722 
    days := 1 
    seconds := 66355 
    weeksToSecs := 7 * 24 * 60 * 60 
    daysToSecs := 24 * 60 * 60 
    totalSecs := (weeks * weeksToSecs) + (days * daysToSecs) + seconds 
    nanosecs := int64(totalSecs) * 1000000000 

    //delta := time.Date(0, 0, 0, 0, 0, totalSecs, 0, time.UTC) 

    date := base.Add(nanosecs) 

    fmt.Printf("Result: %s", date) 

} 

prog.go: 21: è possibile utilizzare nanosec (tipo Int64) come tipo time.Duration in argomento della funzione

http://play.golang.org/p/XWSK_QaXrQ

Cosa mi manca?
Grazie

risposta

17
package main 

import (
     "fmt" 
     "time" 
) 

func main() { 
     baseTime := time.Date(1980, 1, 6, 0, 0, 0, 0, time.UTC) 
     date := baseTime.Add(1722*7*24*time.Hour + 24*time.Hour + 66355*time.Second) 
     fmt.Println(date) 
} 

Playground


uscita

2013-01-07 18:25:55 +0000 UTC 
+0

Awesome @ jnml Grazie mille .. – chespinoza

+0

Come dovrei passare le settimane come una var per aggiungere? se passo un int64 (settimane) il compilatore dice prog.go: 12: operazione non valida: int64 (settimane) * 7 * 24 * time.Hour (tipi non corrispondenti int64 e time.Duration) http://play.golang.org/ p/P1Dw258gRW – chespinoza

+2

Sostituisci 'int64 (settimane)' con 'time.Duration (settimane)' –

4

di jnml risposta opere ed è andare più idiomatiche. Ma per illustrare il motivo per cui il tuo codice originale non ha funzionato, tutto ciò che devi fare è cambiare una riga.

date := base.Add(time.Duration(nanosecs)) invierà i nanosec al tempo.Durata che è il tipo che Add si aspetta al contrario di int64. Go non esegue automaticamente il cast di un tipo per te, quindi si è lamentato del tipo int64.

+0

Sì, grazie @Jeremy_Wall – chespinoza

0

timeutil supporta timedelta e strftime.

package main 

import (
    "fmt" 
    "time" 

    "github.com/leekchan/timeutil" 
) 

func main() { 
    base := time.Date(2015, 2, 3, 0, 0, 0, 0, time.UTC) 
    td := timeutil.Timedelta{Days: 10, Minutes: 17, Seconds: 56} 

    result := base.Add(td.Duration()) 
    fmt.Println(result) // "2015-02-13 00:17:56 +0000 UTC" 
}