回答

收藏

如何进行日期/时间比较

技术问答 技术问答 265 人阅读 | 0 人回复 | 2023-09-12

在 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& V
    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;}
    % 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]
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则