มีตัวเลือกในการเปรียบเทียบวันที่ใน 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 (ช่วงเวลา) แต่มันทำงานไม่ถูกต้องทั้งหมด (อันที่จริงส่วนใหญ่เป็นเพียงกรณีที่สองซึ่งช่วงเวลาที่ข้ามข้ามวันเสียไปส่วนเดิมใช้งานได้ฉันเพิ่งรู้ว่าต้องคำนึงถึงสิ่งนั้นเมื่อทำการแปลงเป็น 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;
}
อย่างไรก็ตามฉันต้องการทำตัวกรองฝั่งเซิร์ฟเวอร์