Ci sono opzioni per fare il confronto delle date in Go? Devo ordinare i dati in base a data e ora, in modo indipendente. Quindi potrei consentire un oggetto che si verifica in un intervallo di date purché si presenti anche in un intervallo di volte. In questo modello, non potevo semplicemente selezionare la data più vecchia, l'ora più giovane / la data più recente, l'ora più recente e i secondi Unix () per confrontarli. Apprezzerei davvero qualsiasi suggerimento.
Alla fine, ho scritto un modulo di confronto della stringa di analisi del tempo per verificare se un tempo rientra in un intervallo. Tuttavia, questo non sta andando bene; Ho alcuni problemi a bocca aperta. Lo posterò qui solo per divertimento, ma spero che ci sia un modo migliore per confrontare il tempo.
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
}
Quindi TLDR, ho scritto una funzione withinTimeRange (range, time) ma non funziona del tutto correttamente. (In effetti, per lo più solo il secondo caso, in cui un intervallo di tempo attraversa i giorni è interrotto. La parte originale ha funzionato, ho appena capito che avrei dovuto tenerne conto quando effettuavo conversioni a UTC da locale.)
Se c'è un modo migliore (preferibilmente integrato), mi piacerebbe saperne di più!
NOTA: solo come esempio, ho risolto questo problema in Javascript con questa funzione:
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;
}
Tuttavia, voglio davvero fare questo filtro lato server.