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, 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;
}
그러나 나는이 필터를 서버 측에서 정말로 원합니다.