🎨 改进闪卡下一轮重复时间显示精度 https://github.com/siyuan-note/siyuan/issues/7672

This commit is contained in:
Liang Ding 2023-03-15 18:27:35 +08:00
parent 1d1d49d7b5
commit 37f4191962
No known key found for this signature in database
GPG Key ID: 136F30F901A2231D
2 changed files with 93 additions and 1 deletions

View File

@ -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{

View File

@ -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))