|
在 Go 日期比较有什么选择吗?我必须根据日期和时间对数据进行排序 - 独立。因此,只要它也出现在一个时间范围内,我可能会允许一个对象出现在一个日期范围内。在这个模型中,我不能简单地选择最旧的日期、最年轻的时间/最新的日期、最新的时间和 Unix() 秒比较它们。我真的很感激任何建议。! Q1 m0 H8 j+ g+ `
最后,我写了一个时间分析字符串比较模块来检查时间是否在一定范围内。然而,情况并不好。我有一些悬而未决的问题。我只是想在这里玩,但我希望有更好的时间比较方法。! X! x7 A- S( B7 ]0 _" J: I' n, A4 O! v
package mainimport "strconv" "strings")func tryIndex(arr []string,index int,def string) string if index b and a is the lower limit return false } return false}func timeGreaterEqual(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}7 _* g$ D3 W4 k! S# t' `' @
所以 TLDR,我写了一个 insideTimeRange(range,time) 函数,但它没有完全正常工作。(事实上,主要是第二种情况,即跨越时间范围几天的情况被破坏。原始部分是有效的,我刚刚意识到它正在从当地转变为 UTC 需要考虑这一点。1 t/ y3 |% t7 Q0 q; D$ b* r
如果有更好的方法(最好是内置的),我真的很想听!
( S: T" ]* Z& r& f注意:比如我用这个函数 Javascript 解决了这个问题:
) `' ^+ r S* T2 C& Vfunction 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;}
% J4 o ^+ b* A4 c& { 但我真的很想做这个过滤服务器端。
; _! C9 S) l N4 A/ o R7 ? 0 n+ b3 y- z {) T
解决方案:
& ^% \) Q( r, u 使用time包在 Go 处理时间信息。
" U# [& A) v' n5 V可以使用 Before、After 和 Equal 方法比较时间瞬间。Sub 方法减去两个时刻,产生一个 Duration。Add 方法添加时间和持续时间,产生时间。 }4 G Y9 {1 b7 p5 c% S
播放示例:) T, S* f) Q7 W. g, M- x
[code]package mainimport "fmt" "time")func inTimeSpan(start,end,check time.Time) bool return check.After(start) && check.Before(end)}func main() start,_ := time.Parse(time.RFC822,"01 Jan 15 10:00 UTC") end,_ := time.Parse(time.RFC822,"01 Jan 16 10:00 UTC") in,_ := time.Parse(time.RFC822,"01 Jan 15 20:00 UTC") out,_ := time.Parse(time.RFC822,"01 Jan 17 10:00 UTC") if inTimeSpan(start,end,in) fmt.Println(in,"is between",start,"and",end,".") } if !inTimeSpan(start,end,out) fmt.Println(out,"is not between",start,"and",end,".") code] |
|