From 37f4191962209bc35f2b7ffc4639be45fecb34d0 Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Wed, 15 Mar 2023 18:27:35 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20=E6=94=B9=E8=BF=9B=E9=97=AA=E5=8D=A1?= =?UTF-8?q?=E4=B8=8B=E4=B8=80=E8=BD=AE=E9=87=8D=E5=A4=8D=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E7=B2=BE=E5=BA=A6=20https://github.com/siyua?= =?UTF-8?q?n-note/siyuan/issues/7672?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/model/flashcard.go | 2 +- kernel/util/time.go | 92 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 1 deletion(-) diff --git a/kernel/model/flashcard.go b/kernel/model/flashcard.go index 0a557c165..be50ee4f5 100644 --- a/kernel/model/flashcard.go +++ b/kernel/model/flashcard.go @@ -233,7 +233,7 @@ type Flashcard struct { func newFlashcard(card riff.Card, blockID, deckID string, now time.Time) *Flashcard { nextDues := map[riff.Rating]string{} for rating, due := range card.NextDues() { - nextDues[rating] = strings.TrimSpace(util.HumanizeRelTime(due, now, Conf.Lang)) + nextDues[rating] = strings.TrimSpace(util.HumanizeDiffTime(due, now, Conf.Lang)) } return &Flashcard{ diff --git a/kernel/util/time.go b/kernel/util/time.go index 457eba976..ef82042ce 100644 --- a/kernel/util/time.go +++ b/kernel/util/time.go @@ -17,6 +17,8 @@ package util import ( + "bytes" + "fmt" "math" "strings" "time" @@ -38,6 +40,96 @@ func CurrentTimeSecondsStr() string { return time.Now().Format("20060102150405") } +func HumanizeDiffTime(a, b time.Time, lang string) string { + labels := TimeLangs[lang] + year, month, day, hour, min, _ := humanizeDiffTime(a, b) + buf := bytes.Buffer{} + if 0 < year { + if 1 == year { + buf.WriteString(fmt.Sprintf(labels["1y"].(string), " ")) + } else { + buf.WriteString(fmt.Sprintf(labels["xy"].(string), year, " ")) + } + } + if 0 < month { + if 1 == month { + buf.WriteString(fmt.Sprintf(labels["1M"].(string), " ")) + } else { + buf.WriteString(fmt.Sprintf(labels["xM"].(string), month, " ")) + } + } + if 0 < day { + if 1 == day { + buf.WriteString(fmt.Sprintf(labels["1d"].(string), " ")) + } else { + buf.WriteString(fmt.Sprintf(labels["xd"].(string), day, " ")) + } + } + if 0 < hour { + if 1 == hour { + buf.WriteString(fmt.Sprintf(labels["1h"].(string), " ")) + } else { + buf.WriteString(fmt.Sprintf(labels["xh"].(string), hour, " ")) + } + } + if 0 < min { + if 1 == min { + buf.WriteString(fmt.Sprintf(labels["1m"].(string), " ")) + } else { + buf.WriteString(fmt.Sprintf(labels["xm"].(string), min, " ")) + } + } + return strings.TrimSpace(buf.String()) +} + +func humanizeDiffTime(a, b time.Time) (year, month, day, hour, min, sec int) { + // 感谢 https://stackoverflow.com/a/36531443/1043233 + + if a.Location() != b.Location() { + b = b.In(a.Location()) + } + if a.After(b) { + a, b = b, a + } + y1, M1, d1 := a.Date() + y2, M2, d2 := b.Date() + + h1, m1, s1 := a.Clock() + h2, m2, s2 := b.Clock() + + year = y2 - y1 + month = int(M2 - M1) + day = d2 - d1 + hour = h2 - h1 + min = m2 - m1 + sec = s2 - s1 + + // Normalize negative values + if sec < 0 { + sec += 60 + min-- + } + if min < 0 { + min += 60 + hour-- + } + if hour < 0 { + hour += 24 + day-- + } + if day < 0 { + // days in month: + t := time.Date(y1, M1, 32, 0, 0, 0, 0, time.UTC) + day += 32 - t.Day() + month-- + } + if month < 0 { + month += 12 + year-- + } + return +} + func HumanizeRelTime(a time.Time, b time.Time, lang string) string { _, magnitudes := humanizeTimeMagnitudes(lang) return strings.TrimSpace(humanize.CustomRelTime(a, b, "", "", magnitudes))