如何进行日期/时间比较

在Go中进行日期比较是否有任何选择?我必须根据日期和时间-

独立地对数据进行排序。因此,我可以允许一个对象在一定日期范围内发生,只要它也在一定时间范围内出现即可。在此模型中,我不能简单地选择最旧的日期,最年轻的时间/最新的日期,最新的时间和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, 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,我编写了一个innerTimeRange(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;

}

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

回答:

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

可以使用Before,After和Equal方法比较时刻。Sub方法减去两个瞬间,产生持续时间。Add方法添加一个时间和一个持续时间,产生一个时间。

播放示例:

package main

import (

"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, ".")

}

}

以上是 如何进行日期/时间比较 的全部内容, 来源链接: utcz.com/qa/409786.html

回到顶部