在Golang中进行date比较有什么select吗? 我必须根据date和时间对数据进行分类。 所以我可能会允许一个对象发生在一个date范围内,只要它也出现在一个时间范围内。 在这个模型中,我不能简单地select最老的date,最新的时间/最新的date,最新的时间和Unix()秒来比较它们。 我真的很感激任何build议。
最终,我写了一个时间parsingstring比较模块来检查时间是否在一个范围内。 然而,这并不是很好, 我有一些空头的问题。 我只是为了好玩而在这里张贴,但我希望有一个更好的方法来比较。
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 }
所以TLDR,我写了一个withinTimeRange(范围,时间)函数,但它不能正常工作。 (事实上,大多数情况下,第二种情况是时间跨度超过几天,原来的部分工作,我刚刚意识到,当从本地转换为UTC时,我需要考虑这一点。
如果有更好的(最好是内置的)方式,我很乐意听到!
注意:就像一个例子,我用这个函数在Javascript中解决了这个问题:
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; }
不过,我真的想做这个filter服务器端。