Tiempo de acción rápido para Go
f , err := strftime . New ( `.... pattern ...` )
if err := f . Format ( buf , time . Now ()); err != nil {
log . Println ( err . Error ())
}
Los objetivos de esta biblioteca son
Toma el patrón y la hora y lo formatea. Esta función es una función de utilidad que vuelve a compilar el patrón cada vez que se llama a la función. Si sabe de antemano que formateará el mismo patrón varias veces, considere usar New
para crear un objeto Strftime
y reutilizarlo.
Toma el patrón y crea un nuevo objeto Strftime
.
Devuelve la cadena del patrón utilizada para crear este objeto Strftime
.
Formatea la hora según el patrón precompilado y escribe el resultado en el io.Writer
especificado.
Formatea la hora según el patrón precompilado y devuelve la cadena de resultado.
patrón | descripción |
---|---|
%A | representación nacional del nombre completo del día laborable |
%a | representación nacional del día laborable abreviado |
%B | representación nacional del nombre del mes completo |
%b | representación nacional del nombre abreviado del mes |
%DO | (año/100) como número decimal; los dígitos individuales están precedidos por un cero |
%do | representación nacional de hora y fecha |
%D | equivalente a %m/%d/%y |
%d | día del mes como número decimal (01-31) |
%mi | el día del mes como número decimal (1-31); los dígitos individuales están precedidos por un espacio en blanco |
%F | equivalente a %Y-%m-%d |
%H | la hora (reloj de 24 horas) como número decimal (00-23) |
%h | igual que %b |
%I | la hora (reloj de 12 horas) como número decimal (01-12) |
%j | el día del año como número decimal (001-366) |
% k | la hora (reloj de 24 horas) como número decimal (0-23); los dígitos individuales están precedidos por un espacio en blanco |
%l | la hora (reloj de 12 horas) como número decimal (1-12); los dígitos individuales están precedidos por un espacio en blanco |
%METRO | el minuto como número decimal (00-59) |
%metro | el mes como número decimal (01-12) |
%norte | una nueva línea |
%pag | representación nacional de "ante meridiem" (am) o "post meridiem" (pm), según corresponda. |
%R | equivalente a %H:%M |
%r | equivalente a %I:%M:%S %p |
%S | el segundo como número decimal (00-60) |
%T | equivalente a %H:%M:%S |
%t | una pestaña |
%U | el número de semana del año (domingo como primer día de la semana) como número decimal (00-53) |
%u | el día de la semana (el lunes como primer día de la semana) como un número decimal (1-7) |
%V | el número de semana del año (el lunes como primer día de la semana) como número decimal (01-53) |
%v | equivalente a %e-%b-%Y |
%W | el número de semana del año (el lunes como primer día de la semana) como número decimal (00-53) |
%w | el día de la semana (domingo como primer día de la semana) como un número decimal (0-6) |
%INCÓGNITA | representación nacional de la época |
%incógnita | representación nacional de la fecha |
%Y | el año con siglo como número decimal |
%año | el año sin siglo como número decimal (00-99) |
%Z | el nombre de la zona horaria |
%z | la zona horaria desplazada de UTC |
%% | a '%' |
Esta biblioteca en general intenta ser compatible con POSIX, pero a veces solo necesita una o dos especificaciones adicionales que se usan relativamente ampliamente pero que no están incluidas en la especificación POSIX.
Por ejemplo, POSIX no especifica cómo imprimir milisegundos, pero las implementaciones populares permiten que %f
o %L
lo logren.
Para esos casos, strftime.Strftime
se puede configurar para utilizar un conjunto personalizado de especificaciones:
ss := strftime.NewSpecificationSet()
ss.Set('L', ...) // provide implementation for `%L`
// pass this new specification set to the strftime instance
p, err := strftime.New(`%L`, strftime.WithSpecificationSet(ss))
p.Format(..., time.Now())
La implementación debe implementar la interfaz Appender
, que es
type Appender interface {
Append([]byte, time.Time) []byte
}
Para extensiones de uso común, como el ejemplo de milisegundos y la marca de tiempo de Unix, proporcionamos una implementación predeterminada para que el usuario pueda realizar una de las siguientes acciones:
// (1) Pass a specification byte and the Appender
// This allows you to pass arbitrary Appenders
p, err := strftime.New(
`%L`,
strftime.WithSpecification('L', strftime.Milliseconds),
)
// (2) Pass an option that knows to use strftime.Milliseconds
p, err := strftime.New(
`%L`,
strftime.WithMilliseconds('L'),
)
De manera similar para la marca de tiempo de Unix:
// (1) Pass a specification byte and the Appender
// This allows you to pass arbitrary Appenders
p, err := strftime.New(
`%s`,
strftime.WithSpecification('s', strftime.UnixSeconds),
)
// (2) Pass an option that knows to use strftime.UnixSeconds
p, err := strftime.New(
`%s`,
strftime.WithUnixSeconds('s'),
)
Si falta una especificación común, no dude en enviar un PR (pero asegúrese de poder defender qué tan "común" es)
Milliseconds
(opción relacionada: WithMilliseconds
);
Microseconds
(opción relacionada: WithMicroseconds
);
UnixSeconds
(opción relacionada: WithUnixSeconds
).
Los siguientes puntos de referencia se ejecutaron por separado porque algunas bibliotecas usaban cgo en plataformas específicas (en particular, la versión rápida)
// On my OS X 10.14.6, 2.3 GHz Intel Core i5, 16GB memory.
// go version go1.13.4 darwin/amd64
hummingbird% go test -tags bench -benchmem -bench .
<snip>
BenchmarkTebeka-4 297471 3905 ns/op 257 B/op 20 allocs/op
BenchmarkJehiah-4 818444 1773 ns/op 256 B/op 17 allocs/op
BenchmarkFastly-4 2330794 550 ns/op 80 B/op 5 allocs/op
BenchmarkLestrrat-4 916365 1458 ns/op 80 B/op 2 allocs/op
BenchmarkLestrratCachedString-4 2527428 546 ns/op 128 B/op 2 allocs/op
BenchmarkLestrratCachedWriter-4 537422 2155 ns/op 192 B/op 3 allocs/op
PASS
ok github.com/lestrrat-go/strftime 25.618s
// On a host on Google Cloud Platform, machine-type: f1-micro (vCPU x 1, memory: 0.6GB)
// (Yes, I was being skimpy)
// Linux <snip> 4.9.0-11-amd64 #1 SMP Debian 4.9.189-3+deb9u1 (2019-09-20) x86_64 GNU/Linux
// go version go1.13.4 linux/amd64
hummingbird% go test -tags bench -benchmem -bench .
<snip>
BenchmarkTebeka 254997 4726 ns/op 256 B/op 20 allocs/op
BenchmarkJehiah 659289 1882 ns/op 256 B/op 17 allocs/op
BenchmarkFastly 389150 3044 ns/op 224 B/op 13 allocs/op
BenchmarkLestrrat 699069 1780 ns/op 80 B/op 2 allocs/op
BenchmarkLestrratCachedString 2081594 589 ns/op 128 B/op 2 allocs/op
BenchmarkLestrratCachedWriter 825763 1480 ns/op 192 B/op 3 allocs/op
PASS
ok github.com/lestrrat-go/strftime 11.355s
Esta biblioteca es mucho más rápida que otras bibliotecas SI puede reutilizar el patrón de formato.
Aquí está la lista comentada de los resultados de las pruebas comparativas. Puede ver claramente que (re)usar un objeto Strftime
y producir una cadena es lo más rápido. Escribir en un io.Writer
parece un poco lento, pero dado que el que produce la cadena está haciendo casi exactamente lo mismo, creemos que esto es puramente la sobrecarga de escribir en un io.Writer
Ruta de importación | Puntaje | Nota |
---|---|---|
github.com/lestrrat-go/strftime | 3000000 | Usando FormatString() (en caché) |
github.com/fastly/go-utils/strftime | 2000000 | Versión Pure Go en OS X |
github.com/lestrrat-go/strftime | 1000000 | Usando Format() (NO almacenado en caché) |
github.com/jehiah/go-strftime | 1000000 | |
github.com/fastly/go-utils/strftime | 1000000 | versión cgo en Linux |
github.com/lestrrat-go/strftime | 500000 | Usando Format() (en caché) |
github.com/tebeka/strftime | 300000 |
Sin embargo, dependiendo de su patrón, esta velocidad puede variar. Si encuentra un patrón en particular que parece lento, envíe parches o pruebas.
Tenga en cuenta también que este punto de referencia solo utiliza el subconjunto de especificaciones de conversión compatibles con TODAS las bibliotecas comparadas.
Algunos aspectos a considerar al realizar comparaciones de rendimiento en el futuro:
%specification
maneja?