¿Hay opciones para comparar fechas en Go? Tengo que ordenar los datos en función de la fecha y la hora, de forma independiente. Entonces, podría permitir un objeto que ocurra dentro de un rango de fechas siempre que también ocurra dentro de un rango de tiempos. En este modelo, no podría simplemente seleccionar la fecha más antigua, la hora más joven / la fecha más reciente, la hora más reciente y los segundos de Unix () compararlos. Realmente agradecería cualquier sugerencia.
En última instancia, escribí un módulo de comparación de cadenas de análisis de tiempo para verificar si un tiempo está dentro de un rango. Sin embargo, esto no está yendo muy bien; Tengo algunos problemas enormes. Publicaré eso aquí solo por diversión, pero espero que haya una mejor manera de comparar el tiempo.
package main
import (
"strconv"
"strings"
)
func tryIndex(arr []string, index int, def string) string {
if index <= len(arr)-1 {
return arr[index]
}
return def
}
/*
* Takes two strings of format "hh:mm:ss" and compares them.
* Takes a function to compare individual sections (split by ":").
* Note: strings can actually be formatted like "h", "hh", "hh:m",
* "hh:mm", etc. Any missing parts will be added lazily.
*/
func timeCompare(a, b string, compare func(int, int) (bool, bool)) bool {
aArr := strings.Split(a, ":")
bArr := strings.Split(b, ":")
// Catches margins.
if (b == a) {
return true
}
for i := range aArr {
aI, _ := strconv.Atoi(tryIndex(aArr, i, "00"))
bI, _ := strconv.Atoi(tryIndex(bArr, i, "00"))
res, flag := compare(aI, bI)
if res {
return true
} else if flag { // Needed to catch case where a > b and a is the lower limit
return false
}
}
return false
}
func timeGreaterEqual(a, b int) (bool, bool) {return a > b, a < b}
func timeLesserEqual(a, b int) (bool, bool) {return a < b, a > b}
/*
* Returns true for two strings formmated "hh:mm:ss".
* Note: strings can actually be formatted like "h", "hh", "hh:m",
* "hh:mm", etc. Any missing parts will be added lazily.
*/
func withinTime(timeRange, time string) bool {
rArr := strings.Split(timeRange, "-")
if timeCompare(rArr[0], rArr[1], timeLesserEqual) {
afterStart := timeCompare(rArr[0], time, timeLesserEqual)
beforeEnd := timeCompare(rArr[1], time, timeGreaterEqual)
return afterStart && beforeEnd
}
// Catch things like `timeRange := "22:00:00-04:59:59"` which will happen
// with UTC conversions from local time.
// THIS IS THE BROKEN PART I BELIEVE
afterStart := timeCompare(rArr[0], time, timeLesserEqual)
beforeEnd := timeCompare(rArr[1], time, timeGreaterEqual)
return afterStart || beforeEnd
}
Entonces TLDR, escribí una función withinTimeRange (rango, tiempo) pero no funciona del todo correctamente. (De hecho, en su mayoría, solo el segundo caso, donde un rango de tiempo cruza los días, se rompe. La parte original funcionó, me acabo de dar cuenta de que tendría que tener en cuenta eso al hacer conversiones a UTC desde local).
Si hay una forma mejor (preferiblemente incorporada), ¡me encantaría escucharla!
NOTA: Solo como ejemplo, resolví este problema en Javascript con esta función:
function withinTime(start, end, time) {
var s = Date.parse("01/01/2011 "+start);
var e = Date.parse("01/0"+(end=="24:00:00"?"2":"1")+"/2011 "+(end=="24:00:00"?"00:00:00":end));
var t = Date.parse("01/01/2011 "+time);
return s <= t && e >= t;
}
Sin embargo, realmente quiero hacer este filtro del lado del servidor.
fuente
Para la comparación entre dos tiempos, use time.Sub ()
Los resultados del programa:
http://play.golang.org/p/bbxeTtd4L6
fuente
En el caso de que el intervalo finalice, sea una fecha sin horas como "desde el 01-01-2017 hasta el día completo del 16-01-2017", es mejor ajustar el intervalo a 23 horas 59 minutos y 59 segundos como:
fuente
Los protocolos recientes prefieren el uso de RFC3339 según la documentación del paquete de tiempo de golang .
fuente
Lo siguiente resolvió mi problema de convertir una cadena en una fecha
paquete principal
Gracias a paul adam smith
fuente