Có bất kỳ tùy chọn nào để thực hiện so sánh ngày trong Go không? Tôi phải sắp xếp dữ liệu dựa trên ngày và giờ - một cách độc lập. Vì vậy, tôi có thể cho phép một đối tượng xuất hiện trong một phạm vi ngày miễn là nó cũng xuất hiện trong một phạm vi thời gian. Trong mô hình này, tôi không thể chỉ chọn ngày cũ nhất, giờ trẻ nhất / ngày mới nhất, thời gian mới nhất và Unix () giây để so sánh chúng. Tôi thực sự đánh giá cao bất kỳ đề xuất nào.
Cuối cùng, tôi đã viết một mô-đun so sánh chuỗi phân tích cú pháp thời gian để kiểm tra xem thời gian có nằm trong một phạm vi hay không. Tuy nhiên, điều này không tốt chút nào; Tôi có một số vấn đề về lỗ hổng. Tôi sẽ đăng điều đó ở đây chỉ cho vui, nhưng tôi hy vọng có một cách tốt hơn để so sánh thời gian.
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
}
Vì vậy, TLDR, tôi đã viết một hàm withinTimeRange (phạm vi, thời gian) nhưng nó không hoạt động hoàn toàn chính xác. (Trên thực tế, hầu hết chỉ là trường hợp thứ hai, trong đó phạm vi thời gian qua nhiều ngày bị phá vỡ. Phần ban đầu đã hoạt động, tôi chỉ nhận ra rằng tôi cần phải tính đến điều đó khi thực hiện chuyển đổi sang UTC từ địa phương.)
Nếu có một cách tốt hơn (tốt hơn là được tích hợp sẵn), tôi rất muốn nghe về nó!
LƯU Ý: Chỉ là một ví dụ, tôi đã giải quyết vấn đề này trong Javascript với chức năng này:
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;
}
Tuy nhiên, tôi thực sự muốn thực hiện bộ lọc phía máy chủ.