2016-01-24 10 views
6

Sono un principiante di Go e sto faticando un po 'a cercare di formattare e visualizzare alcuni dati di clock TOD del mainframe IBM. Voglio formattare i dati sia in GMT che in ora locale (come predefinito, altrimenti nella zona specificata dall'utente).In Vai, come posso estrarre il valore del mio offset dell'ora locale corrente?

Per questo, ho bisogno di ottenere il valore dell'offset dell'ora locale da GMT come numero intero con segno di secondi.

In zoneinfo.go (che confesso io non pienamente capito), posso vedere

// A zone represents a single time zone such as CEST or CET. 
type zone struct { 
    name string // abbreviated name, "CET" 
    offset int // seconds east of UTC 
    isDST bool // is this zone Daylight Savings Time? 
} 

ma questo non è, credo, esportato, quindi questo codice non funziona:

package main 
import ("time"; "fmt") 

func main() { 
    l, _ := time.LoadLocation("Local") 
    fmt.Printf("%v\n", l.zone.offset) 
} 

C'è un modo semplice per ottenere queste informazioni?

+0

@olif vince, in una cosa molto vicino. Grazie a tutti per le vostre risposte. –

risposta

9

È possibile utilizzare il metodo di zona() sul tipo di tempo:

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 
    t := time.Now() 
    _, z := t.Zone() 
    fmt.Println(z) 
} 

Zona calcola il fuso orario in vigore al tempo t, restituendo il nome abbreviato della zona (come "CET") e il suo offset in secondi ad est di UTC.

5

Package time

func (Time) Local

func (t Time) Local() Time 

Resi t con la posizione impostata l'ora locale.

func (Time) Zone

func (t Time) Zone() (name string, offset int) 

Zona calcola il fuso orario in vigore al tempo t, restituendo il nome abbreviato della zona (come "CET") e il suo offset in secondi est di UTC.

type Location

type Location struct { 
     // contains filtered or unexported fields 
} 

una posizione Mappe istanti di tempo alla zona in uso in quel momento. In genere, la posizione rappresenta l'insieme di offset temporali nell'uso di in un'area geografica, come CEST e CET per l'Europa centrale.

var Local *Location = &localLoc 

Locale rappresenta il fuso orario locale del sistema.

var UTC *Location = &utcLoc 

UTC rappresenta il tempo universale coordinato (UTC).

func (Time) In

func (t Time) In(loc *Location) Time 

rendimenti t con le informazioni sulla posizione impostata loc.

In panico se loc è nullo.

Per esempio,

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 
    t := time.Now() 

    // For a time t, offset in seconds east of UTC (GMT) 
    _, offset := t.Local().Zone() 
    fmt.Println(offset) 

    // For a time t, format and display as UTC (GMT) and local times. 
    fmt.Println(t.In(time.UTC)) 
    fmt.Println(t.In(time.Local)) 
} 

uscita:

-18000 
2016-01-24 16:48:32.852638798 +0000 UTC 
2016-01-24 11:48:32.852638798 -0500 EST 
3

Non credo abbia senso per convertire manualmente il tempo di un'altra TZ. Usa la funzione time.Time.In:

package main 

import (
    "fmt" 
    "time" 
) 

func printTime(t time.Time) { 
    zone, offset := t.Zone() 
    fmt.Println(t.Format(time.Kitchen), "Zone:", zone, "Offset UTC:", offset) 
} 

func main() { 
    printTime(time.Now()) 
    printTime(time.Now().UTC()) 

    loc, _ := time.LoadLocation("America/New_York") 
    printTime(time.Now().In(loc)) 
} 
Problemi correlati