Go'da tarih karşılaştırması yapmak için herhangi bir seçenek var mı? Verileri tarih ve saate göre - bağımsız olarak sıralamak zorundayım. Bu nedenle, bir zaman aralığı içinde de meydana geldiği sürece, bir tarih aralığı içinde oluşan bir nesneye izin verebilirim. Bu modelde, en eski tarihi, en genç saati / en son tarihi, en son saati ve Unix () saniyeleri karşılaştırmakla yetinemezdim. Herhangi bir öneriyi gerçekten takdir ediyorum.
Sonuçta, bir zamanın bir aralık içinde olup olmadığını kontrol etmek için bir zaman ayrıştırma dizesi karşılaştırma modülü yazdım. Ancak, bu pek de uzak değil; Bazı boşluk sorunlarım var. Bunu sadece eğlence için buraya göndereceğim, ama umarım zaman karşılaştırması yapmanın daha iyi bir yolu vardır.
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
}
Bu yüzden TLDR, bir insideTimeRange (aralık, zaman) işlevi yazdım, ancak tam olarak doğru çalışmıyor. (Aslında, çoğunlukla bir zaman aralığının günler boyunca kesiştiği ikinci durumdur. Orijinal parça işe yaradı, yerelden UTC'ye dönüştürme yaparken bunu hesaba katmam gerektiğini fark ettim.)
Daha iyi (tercihen yerleşik) bir yol varsa, bunu duymak isterim!
NOT: Örnek olarak, bu sorunu Javascript'te şu fonksiyonla çözdüm:
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;
}
Ancak bu filtreyi sunucu tarafında gerçekten yapmak istiyorum.