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.
fonte
Para comparação entre duas vezes, use time.Sub ()
O programa produz:
http://play.golang.org/p/bbxeTtd4L6
fonte
Para o caso de quando o seu intervalo terminar é uma data sem horas como "de 01-01-2017 a todo o dia de 2016-01-16", é melhor ajustar o intervalo para 23 horas, 59 minutos e 59 segundos, como:
fonte
Protocolos recentes preferem o uso de RFC3339 por documentação de pacote de tempo golang .
fonte
O seguinte resolveu meu problema de converter string em data
pacote principal
Obrigado a paul adam smith
fonte