feat: times 包新增 GetWeekdayDateRelativeToNowWithOffset 及 GetWeekdayTimeRelativeToNowWithOffset 函数,用于取代 GetCurrWeekDate 和 GetLastWeekDate 函数

This commit is contained in:
kercylan98
2024-03-18 12:39:26 +08:00
parent 31caa80e29
commit 92d6c5680d
7 changed files with 59 additions and 16 deletions

View File

@@ -56,6 +56,15 @@ func (slf *PrioritySlice[V]) Appends(priority int, vs ...V) {
slf.sort()
}
// AppendByOptionalPriority 添加元素
func (slf *PrioritySlice[V]) AppendByOptionalPriority(v V, priority ...int) {
if len(priority) == 0 {
slf.Append(v, 0)
} else {
slf.Append(v, priority[0])
}
}
// Get 获取元素
func (slf *PrioritySlice[V]) Get(index int) (V, int) {
i := slf.items[index]

View File

@@ -15,32 +15,32 @@ const (
Week = Day * 7
)
// GetCurrWeekDate 获取以 week 为周一的本周 week 时间
func GetCurrWeekDate(now time.Time, week time.Weekday) time.Time {
// GetWeekdayDateRelativeToNowWithOffset 获取相对于当前日期所在周的指定星期的日期,可以根据需要进行周数的偏移。
// - now当前时间。
// - week要获取日期的目标星期。
// - offsetWeeks要偏移的周数正数表示向未来偏移负数表示向过去偏移。
//
// 该函数通常适用于排行榜等场景,例如排行榜为每周六更新,那么通过该函数可以获取到上周排行榜、本周排行榜的准确日期
//
// 该函数将不会保留 now 的时分秒信息,如果需要,可使用 GetWeekdayTimeRelativeToNowWithOffset 函数
func GetWeekdayDateRelativeToNowWithOffset(now time.Time, week time.Weekday, offsetWeeks int) time.Time {
w := int(week)
monday := GetMondayZero(now)
var curr time.Time
if WeekDay(now) >= w {
curr = monday.AddDate(0, 0, w-1)
curr = monday.AddDate(0, 0, (w-1)+offsetWeeks*7)
} else {
curr = monday.AddDate(0, 0, w-1)
curr = monday.AddDate(0, 0, (w-1)+offsetWeeks*7)
curr = curr.AddDate(0, 0, -7)
}
return curr
}
// GetLastWeekDate 获取以 week 为周一的特定时间 now 的上周 week 时间
func GetLastWeekDate(now time.Time, week time.Weekday) time.Time {
w := int(week)
monday := GetMondayZero(now)
var last time.Time
if WeekDay(now) >= w {
last = monday.AddDate(0, 0, -(7 - w + 1))
} else {
last = monday.AddDate(0, 0, -(7 - w + 1))
last = last.AddDate(0, 0, -7)
}
return last
// GetWeekdayTimeRelativeToNowWithOffset 获取相对于当前日期所在周的指定星期的日期,并根据传入的 now 参数保留时、分、秒等时间信息。
// - 参数解释可参考 GetWeekdayDateRelativeToNowWithOffset 函数
func GetWeekdayTimeRelativeToNowWithOffset(now time.Time, week time.Weekday, offsetWeeks int) time.Time {
curr := GetWeekdayDateRelativeToNowWithOffset(now, week, offsetWeeks)
return time.Date(curr.Year(), curr.Month(), curr.Day(), now.Hour(), now.Minute(), now.Second(), now.Nanosecond(), now.Location())
}
// GetMonthDays 获取一个时间当月共有多少天

View File

@@ -0,0 +1,17 @@
package times_test
import (
"github.com/kercylan98/minotaur/utils/times"
"testing"
"time"
)
func TestGetCurrWeekDate(t *testing.T) {
now := time.Now()
date := time.Date(2024, 3, 1, now.Hour(), now.Minute(), now.Second(), now.Nanosecond(), time.Local)
for i := 0; i < 31; i++ {
target := date.AddDate(0, 0, i)
t.Logf(target.Format(time.DateTime) + " -> " + times.GetWeekdayTimeRelativeToNowWithOffset(target, 6, 1).Format(time.DateTime))
}
}