Apakah ada pilihan dalam melakukan perbandingan tanggal di Go? Saya harus mengurutkan data berdasarkan tanggal dan waktu - secara mandiri. Jadi saya mungkin mengizinkan objek yang muncul dalam rentang tanggal selama itu juga muncul dalam rentang waktu tertentu. Dalam model ini, saya tidak bisa begitu saja memilih tanggal terlama, waktu termuda / tanggal terbaru, waktu terbaru dan detik Unix () membandingkannya. Saya sangat menghargai saran apapun.
Pada akhirnya, saya menulis modul perbandingan string parsing waktu untuk memeriksa apakah suatu waktu berada dalam kisaran. Namun, ini tidak berjalan dengan baik; Saya punya beberapa masalah yang menganga. Saya akan mempostingnya di sini hanya untuk bersenang-senang, tetapi saya berharap ada cara yang lebih baik untuk membandingkan waktu.
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
}
Jadi TLDR, saya menulis fungsi withinTimeRange (rentang, waktu) tetapi tidak bekerja sepenuhnya dengan benar. (Faktanya, sebagian besar hanya kasus kedua, di mana rentang waktu melintasi beberapa hari rusak. Bagian asli berfungsi, saya baru menyadari bahwa saya perlu memperhitungkannya saat membuat konversi ke UTC dari lokal.)
Jika ada cara yang lebih baik (sebaiknya dibangun di dalam), saya ingin sekali mendengarnya!
CATATAN: Hanya sebagai contoh, saya menyelesaikan masalah ini di Javascript dengan fungsi ini:
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;
}
Namun saya sangat ingin melakukan filter ini di sisi server.
sumber
Untuk perbandingan antara dua kali gunakan waktu.Sub ()
Keluaran program:
http://play.golang.org/p/bbxeTtd4L6
sumber
Untuk kasus ketika interval Anda berakhir adalah tanggal tanpa jam seperti "dari 01-01 2017 hingga sepanjang hari 2017-01-16" lebih baik menyesuaikan interval menjadi 23 jam 59 menit dan 59 detik seperti:
sumber
Protokol terbaru lebih memilih penggunaan RFC3339 per dokumentasi paket waktu golang .
sumber
Berikut ini memecahkan masalah saya mengubah string menjadi tanggal
paket utama
Terima kasih untuk paul adam smith
sumber