在戈兰做日期比较有什么选择吗?我必须根据日期和时间独立地对数据进行排序。所以我可以允许在一个范围内发生的对象,只要它也发生在一个时间范围内。在这个模型中,我不能简单地选择最老的日期,最小的时间/最新的日期,最新的时间和Unix()秒比较它们。我真的很感激任何建议。

最后,我写了一个时间分析字符串比较模块来检查一个时间是否在一个范围内。但是,这并不好,我有一些空白的问题。我会发布在这里只是为了好玩,但我希望有一个更好的方式来比较。

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,"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,bool) {return a < b,a > b}

/*
 * Returns true for two strings formmated "hh:mm:ss".
 * Note: strings can actually be formatted like "h",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],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],timeLesserEqual)
    beforeEnd := timeCompare(rArr[1],timeGreaterEqual)
    return afterStart || beforeEnd
}

所以TLDR,我写了一个withinTimeRange(range,time)函数,但是它不能完全正确地工作。 (事实上​​,大多数情况下,第二种情况是时间跨越几天都被打破了,原来的部分工作,我只是意识到,当我们从本地进行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;
}

但是我真的想做这个过滤服务器端。

使用 time软件包在Go中处理时间信息。

Play示例:

package main

import (
    "fmt"
    "time"
)

func inTimeSpan(start,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,"01 Jan 16 10:00 UTC")

    in,"01 Jan 15 20:00 UTC")
    out,"01 Jan 17 10:00 UTC")

    if inTimeSpan(start,in) {
        fmt.Println(in,"is between",start,"and",".")
    }

    if !inTimeSpan(start,out) {
        fmt.Println(out,"is not between",".")
    }
}