क्या गो में तारीख की तुलना करने का कोई विकल्प है? मुझे तारीख और समय के आधार पर डेटा को सॉर्ट करना होगा - स्वतंत्र रूप से। इसलिए मैं एक ऐसी वस्तु की अनुमति दे सकता हूं जो कि कुछ समय के भीतर होती है क्योंकि यह कई बार होती है। इस मॉडल में, मैं केवल सबसे पुरानी तारीख, सबसे कम समय / नवीनतम तारीख, नवीनतम समय और यूनिक्स () सेकंड का चयन नहीं कर सका। मैं वास्तव में किसी भी सुझाव की सराहना करेंगे।
अंततः, मैंने एक समय लिखा है कि स्ट्रिंग की तुलना करने के लिए मॉड्यूल की जाँच करें कि क्या एक समय सीमा के भीतर है। हालाँकि, यह अच्छी तरह से नहीं है; मुझे कुछ गैपिंग मुद्दे मिले हैं। मैं यहाँ सिर्फ मनोरंजन के लिए पोस्ट करूँगा, लेकिन मुझे उम्मीद है कि समय की तुलना करने का एक बेहतर तरीका है।
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, मैं एक भीतर समय (रेंज, समय) समारोह लिखा है, लेकिन यह पूरी तरह से सही ढंग से काम नहीं कर रहा है। (वास्तव में, ज्यादातर सिर्फ दूसरा मामला है, जहां दिनों के साथ एक समय सीमा पार हो जाती है। मूल भाग ने काम किया, मुझे बस एहसास हुआ कि स्थानीय से यूटीसी के लिए रूपांतरण करते समय मुझे इसके लिए ध्यान देना होगा।)
अगर वहाँ एक बेहतर (अधिमानतः बनाया गया) तरीका है, तो मुझे इसके बारे में सुनना अच्छा लगेगा!
नोट: बस एक उदाहरण के रूप में, मैंने इस फ़ंक्शन को जावास्क्रिप्ट में इस फ़ंक्शन के साथ हल किया:
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;
}
हालाँकि मैं वास्तव में यह फ़िल्टर सर्वर-साइड करना चाहता हूं।