mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-05-03 02:40:54 +08:00
🎨 改进闪卡下一轮重复时间显示精度 https://github.com/siyuan-note/siyuan/issues/7672
This commit is contained in:
parent
1d1d49d7b5
commit
37f4191962
@ -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{
|
||||
|
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user