3 回答

TA貢獻1877條經(jīng)驗 獲得超6個贊
有很多方法可以解決這個問題,選擇正確的方法取決于“開始時間前 x 分鐘”的含義:
“只是時鐘部分”我假設(shè)您的意思是當天,或者,如果當前時間在“時鐘部分”之后,明天。
夏令時的開始/結(jié)束可能會導致明顯的答案可能不正確(但您需要指定在這些時間應該發(fā)生什么)。
是否需要考慮時區(qū)?(我暫時不會假設(shè),但值得考慮一下?。?。
我將通過計算目標時間和檢查時間之間的分鐘數(shù)來解決這個問題,如下所示:
func MinutesBefore(target time.Time, check time.Time) int {
t := time.Date(check.Year(), check.Month(), check.Day(), target.Hour(), target.Minute(), target.Second(), target.Nanosecond(), target.Location())
if t.Before(check) {
t = time.Date(check.Year(), check.Month(), check.Day()+1, target.Hour(), target.Minute(), target.Second(), target.Nanosecond(), target.Location())
}
return int(t.Sub(check).Minutes())
}
在操場上嘗試一些測試用例。

TA貢獻1789條經(jīng)驗 獲得超8個贊
截斷差異可能更容易,而不是時間,例如:
package main
import (
"log"
"time"
)
const (
day = time.Hour * 24
)
func within(t1, t2 time.Time, epsilon time.Duration) bool {
delta := t1.Sub(t2)
delta = (delta - delta.Truncate(day))
// Take absolute value of delta.
if delta < 0 {
delta = -delta
}
// Reduce if the times are closer across midnight.
if adjusted := day - delta; adjusted < delta {
delta = adjusted
}
return delta <= epsilon
}
func main() {
start := time.Date(2019, 7, 2, 01, 0, 0, 0, time.UTC)
for _, tc := range []struct {
t time.Time
e time.Duration
want bool
}{
{
t: time.Date(2020, 11, 20, 0, 45, 0, 0, time.UTC),
e: time.Minute * 30,
want: true,
},
{
t: time.Date(2020, 11, 20, 0, 20, 0, 0, time.UTC),
e: time.Minute * 30,
want: false,
},
{
t: time.Date(2020, 11, 20, 23, 0, 0, 0, time.UTC),
e: time.Minute * 120,
want: true,
},
{
t: time.Date(2020, 11, 20, 0, 0, 0, 0, time.UTC),
e: time.Minute * 120,
want: true,
},
{
t: time.Date(2020, 11, 20, 0, 20, 0, 0, time.UTC),
e: time.Minute * 120,
want: true,
},
{
t: time.Date(2020, 11, 20, 22, 30, 0, 0, time.UTC),
e: time.Minute * 120,
want: false,
},
{
t: time.Date(2020, 11, 20, 13, 0, 0, 0, time.UTC),
e: time.Hour * 24,
want: true,
},
} {
if within(start, tc.t, tc.e) != tc.want {
log.Fatalf("test failed for %v, %v, %v", start, tc.t, tc.e)
}
}
}
您說您想在 24 小時或更長時間內(nèi)返回true,x但請注意,因為您想要案例 2 的第一個示例中給出的行為,結(jié)果證明true將在x12 小時或更長時間內(nèi)返回,因為那是如果您接受 24 小時內(nèi)或跨過 24 小時的最近距離,則為兩次之間的最大距離。

TA貢獻1851條經(jīng)驗 獲得超5個贊
您可以使用模板解析日期的時間分數(shù)(時鐘部分)15:04:05
var start time.Time
start, _ = time.Parse("15:04:05", "01:00:00")
我們想要減去start并now檢查結(jié)果是否不大于x
if start.Sub(now).Minutes() <= x.Minutes() {
return true
}
這將適用于我們的第一個案例,但是當我們中間有一個午夜時它會失敗。解決這個問題,我們可以從中減去一天now
if start.Before(now) {
now = now.Add(-time.Hour * 24)
}
那么在這里你有它
func rangeOf(x time.Duration, start time.Time, now time.Time) bool {
if start.Before(now) {
now = now.Add(-time.Hour * 24)
}
if start.Sub(now).Minutes() <= x.Minutes() {
return true
}
return false
}
這是案例二測試
func main() {
x := 120 * time.Minute
var now time.Time
now, _ = time.Parse("15:04:05", "23:00:00")
fmt.Printf("%t\n", rangeOf(x, start, now))
now, _ = time.Parse("15:04:05", "00:00:00")
fmt.Printf("%t\n", rangeOf(x, start, now))
now, _ = time.Parse("15:04:05", "00:20:00")
fmt.Printf("%t\n", rangeOf(x, start, now))
now, _ = time.Parse("15:04:05", "22:30:00")
fmt.Printf("%t\n", rangeOf(x, start, now))
}
這里的所有測試用例https://play.golang.com/p/Ijs-rlPCIIJ
- 3 回答
- 0 關(guān)注
- 190 瀏覽
添加回答
舉報