Existe alguma opção de comparação de datas no Go? Tenho que classificar os dados com base na data e hora - independentemente. Portanto, posso permitir um objeto que ocorre dentro de um intervalo de datas, desde que também ocorra dentro de um intervalo de tempos. Neste modelo, eu não poderia simplesmente selecionar a data mais antiga, a hora mais recente / a data mais recente, a hora mais recente e os segundos Unix () compará-los. Eu realmente aprecio qualquer sugestão.
Por fim, escrevi um módulo de comparação de string de análise de tempo para verificar se um tempo está dentro de um intervalo. No entanto, isso não está indo muito bem; Eu tenho alguns problemas escancarados. Vou postar isso aqui apenas por diversão, mas espero que haja uma maneira melhor de comparar os tempos.
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
}
Então, TLDR, escrevi uma função withinTimeRange (range, time), mas não está funcionando totalmente corretamente. (Na verdade, principalmente apenas o segundo caso, em que um intervalo de tempo cruza os dias é quebrado. A parte original funcionou, acabei de perceber que precisaria levar isso em consideração ao fazer conversões para UTC do local.)
Se houver uma maneira melhor (de preferência embutida), adoraria saber mais sobre ela!
NOTA: Apenas como exemplo, resolvi esse problema em Javascript com esta função:
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;
}
No entanto, eu realmente quero fazer esse filtro do lado do servidor.