Obtener la hora actual como cadena formateada en Ir?

131

¿Cuál es la mejor manera de obtener la marca de tiempo actual en Go y convertirla en cadena? Necesito tanto la fecha como la hora, por ejemplo. AAAAMMDDhhmmss formato.

brianoh
fuente
1
Esto es todo lo que necesitas golangprograms.com/…
Eduardo A. Fernández Díaz

Respuestas:

149

Usa la time.Now()función y el time.Format()método.

t := time.Now()
fmt.Println(t.Format("20060102150405"))

imprime 20110504111515, o al menos lo hizo hace unos minutos. (Estoy en horario de verano del este). Hay varios formatos de hora predefinidos en las constantes definidas en el paquete de hora.

Puede usarlo time.Now().UTC()si prefiere tener UTC que su zona horaria local.

nmichaels
fuente
15
Definitivamente me gusta la Kitchenconstante ( = "3:04PM")
tux21b
55
Gracias por esa información ¿Cómo sabe el paquete de tiempo al pasar "20060102150405", justo lo que estamos pasando, ya que no es una de las constantes predefinidas en el paquete de tiempo? ¿Cuál es el significado de esa fecha y hora en el paquete de tiempo (20060102150405)? Me parece un poco peculiar, pero mientras funcione, supongo que no importa mientras no cometamos un error al codificarlo. Supongo que no les pareció adecuado proporcionar una constante para ese formato y coincidir con el patrón de cadena.
brianoh 05 de
9
@brianoh: Ver golang.org/pkg/time/#Constants Es el momento "01/02 03:04:05 PM '06 -0700" Porque cada componente tiene un número diferente (1, 2, 3, etc.), Puede determinar a partir de los números qué componentes desea.
newacct
1
Tenga en cuenta que time.LocalTime () ya no existe: vea mi respuesta a continuación para que sea compatible con Go 1.0.3
Deleplace
71

¡Todas las otras respuestas son muy erróneas para alguien que viene de Google y busca "marca de tiempo en marcha"! AAAAMMDDhhmmss no es una "marca de tiempo".

Para obtener la "marca de tiempo" de una fecha en marcha ( número de segundos desde enero de 1970), la función correcta es .Unix () , y realmente devuelve un entero

Bactismo
fuente
8
Estoy de acuerdo; la pregunta debería titularse "fecha actual" no "marca de tiempo actual"
developerbmw
1
Aunque es tarde, creo que .Unix () debería apuntar a golang.org/pkg/time/#Time.Unix cuyo tipo de retorno es int64.
nacido libre
Si bien es técnicamente correcto, creo que muchos codificadores en la actualidad combinan la marca de tiempo con 'La hora actual en algún tipo de formato', por lo que ese título sería igualmente confuso para la mayoría.
Roger Hill
He sugerido una edición - Get current time as formatted string in Go?. Esperemos que alguien lo apruebe.
akki
56

Para facilitar la lectura, es mejor usar las constantes de RFC en el paquete de tiempo (creo)

import "fmt" 
import "time"

func main() {
    fmt.Println(time.Now().Format(time.RFC850))
}
matthewmcneely
fuente
44
¿Cómo produce esto AAAAMMDDhhmmss?
Rod
2
RFC850 produce Tuesday, 10-Nov-09 23:00:00 UTC RFC3339 = "2006-01-02T15:04:05Z07:00" play.golang.org/p/XmobwWSz5pN golang.org/pkg/time
Chris McKee
32

Utilice las funciones time.Now () y time.Format () (ya que time.LocalTime () ya no existe a partir de Go 1.0.3)

t := time.Now()
fmt.Println(t.Format("20060102150405"))

Demostración en línea (con fecha fijada en el pasado en el patio de juegos, no importa)

Deleplace
fuente
66
Y puede usarlo simplemente como una cadena como esta:s := "Actual time is: "+time.Now().String()
Michael
2

Como eco de la respuesta de @Bactisme, la forma en que se recuperaría la marca de tiempo actual (en milisegundos, por ejemplo) es:

msec := time.Now().UnixNano() / 1000000

Recurso: https://gobyexample.com/epoch

Jack Ryan
fuente
0

https://golang.org/src/time/format.go especificado Para el tiempo de análisis 15se usa para horas, 04se usa para minutos, 05para segundos.

Para analizar la fecha 11, Jan, Januaryes desde hace meses, 02, Mon, Mondaypara el día del mes, 2006por año y por supuesto MSTpara la zona

Pero también puede usar este diseño, lo cual me parece muy simple. "Mon Jan 2 15:04:05 MST 2006"

    const layout = "Mon Jan 2 15:04:05 MST 2006"
    userTimeString := "Fri Dec 6 13:05:05 CET 2019"

    t, _ := time.Parse(layout, userTimeString)
    fmt.Println("Server: ", t.Format(time.RFC850))
    //Server:  Friday, 06-Dec-19 13:05:05 CET

    mumbai, _ := time.LoadLocation("Asia/Kolkata")
    mumbaiTime := t.In(mumbai)
    fmt.Println("Mumbai: ", mumbaiTime.Format(time.RFC850))
    //Mumbai:  Friday, 06-Dec-19 18:35:05 IST

MANIFESTACIÓN

ACERO
fuente
-4

Para responder la pregunta exacta:

import "github.com/golang/protobuf/ptypes"

Timestamp, _ = ptypes.TimestampProto(time.Now())
suran
fuente
Gracias Suran, esto es útil cuando la marca de tiempo debe enviarse a través de grpc
rajeshk