Skip to content

Commit

Permalink
optimization
Browse files Browse the repository at this point in the history
  • Loading branch information
dobyte committed Jan 31, 2023
1 parent 4db415f commit 8059004
Show file tree
Hide file tree
Showing 2 changed files with 201 additions and 30 deletions.
177 changes: 147 additions & 30 deletions utils/xtime/time.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,18 +62,17 @@ func Now() time.Time {

// Today 今天
func Today() time.Time {
now := Now()
return time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
return Now()
}

// Yesterday 昨天
func Yesterday() time.Time {
return Today().AddDate(0, 0, -1)
return Day(-1)
}

// Tomorrow 明天
func Tomorrow() time.Time {
return Today().AddDate(0, 0, 1)
return Day(1)
}

// Transform 时间转换
Expand Down Expand Up @@ -119,31 +118,47 @@ func UnixNano(nsec int64) time.Time {
return time.Unix(nsec/1e9, nsec%1e9).In(location)
}

// GetFirstSecondOfDay 获取一天中的第一秒
// offsetDays 偏移天数,例如:-1:前一天 0:当前 1:明天
func GetFirstSecondOfDay(offsetDays ...int) time.Time {
// Day 获取某一天的当前时刻
// offsetDays 偏移天数,例如:-1:前一天 0:当前 1:明天
func Day(offset ...int) time.Time {
now := Now()
if len(offsetDays) > 0 {
now = now.AddDate(0, 0, offsetDays[0])

if len(offset) > 0 {
now = now.AddDate(0, 0, offset[0])
}

return time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
return now
}

// GetLastSecondOfDay 获取一天中的最后一秒
// offsetDays 偏移天数,例如:-1:前一天 0:当前 1:明天
func GetLastSecondOfDay(offsetDays ...int) time.Time {
now := Now()
if len(offsetDays) > 0 {
now = now.AddDate(0, 0, offsetDays[0])
}
// DayHead 获取一天中的第一秒
// offsetDays 偏移天数,例如:-1:前一天 0:当前 1:明天
func DayHead(offset ...int) time.Time {
date := Day(offset...)

return time.Date(date.Year(), date.Month(), date.Day(), 0, 0, 0, 0, date.Location())
}

// DayTail 获取一天中的最后一秒
// offsetDays 偏移天数,例如:-1:前一天 0:当前 1:明天
func DayTail(offset ...int) time.Time {
date := Day(offset...)

return time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 59, 0, now.Location())
return time.Date(date.Year(), date.Month(), date.Day(), 23, 59, 59, 999999999, date.Location())
}

// GetFirstDayOfWeek 获取一周中的第一天
// offsetWeeks 偏移周数,例如:-1:上一周 0:本周 1:下一周
func GetFirstDayOfWeek(offsetWeeks ...int) time.Time {
// Week 获取一周中的当前时刻
// offsetWeeks 偏移周数,例如:-1:上一周 0:本周 1:下一周
func Week(offset ...int) time.Time {
if len(offset) > 0 {
return Now().AddDate(0, 0, offset[0]*7)
} else {
return Now()
}
}

// WeekHead 获取一周中的第一天的第一秒
// offsetWeeks 偏移周数,例如:-1:上一周 0:本周 1:下一周
func WeekHead(offset ...int) time.Time {
var (
now = Now()
offsetDays = int(time.Monday - now.Weekday())
Expand All @@ -153,24 +168,126 @@ func GetFirstDayOfWeek(offsetWeeks ...int) time.Time {
offsetDays = -6
}

if len(offsetWeeks) > 0 {
offsetDays += offsetWeeks[0] * 7
if len(offset) > 0 {
offsetDays += offset[0] * 7
}

return now.AddDate(0, 0, offsetDays)
date := now.AddDate(0, 0, offsetDays)

return time.Date(date.Year(), date.Month(), date.Day(), 0, 0, 0, 0, date.Location())
}

// GetLastDayOfWeek 获取一周中的最后一天
// offsetWeeks 偏移周数,例如:-1:上一周 0:本周 1:下一周
func GetLastDayOfWeek(offsetWeeks ...int) time.Time {
// WeekTail 获取一周中的最后一天的最后一秒
// offsetWeeks 偏移周数,例如:-1:上一周 0:本周 1:下一周
func WeekTail(offset ...int) time.Time {
var (
now = Now()
offsetDays = int(time.Sunday - now.Weekday() + 7)
)

if len(offsetWeeks) > 0 {
offsetDays += offsetWeeks[0] * 7
if len(offset) > 0 {
offsetDays += offset[0] * 7
}

date := now.AddDate(0, 0, offsetDays)

return time.Date(date.Year(), date.Month(), date.Day(), 23, 59, 59, 999999999, date.Location())
}

// Month 获取某一月的当前时刻
// offsetMonths 偏移月数,例如:-1:前一月 0:当前月 1:下一月
func Month(offset ...int) time.Time {
now := Now()

if len(offset) == 0 || offset[0] == 0 {
return now
}

offsetYears := offset[0] / 12
offsetMonths := offset[0] % 12
year := now.Year() + offsetYears
month := int(now.Month()) + offsetMonths
day := now.Day()

if month <= 0 {
year--
month += 12
}

switch time.Month(month) {
case time.April, time.June, time.September, time.November:
if day > 30 {
day = 30
}
case time.February:
if (year%4 == 0 && year%100 != 0) || year%400 == 0 {
if day > 29 {
day = 29
}
} else {
if day > 28 {
day = 28
}
}
}

return time.Date(year, time.Month(month), day, now.Hour(), now.Minute(), now.Second(), now.Nanosecond(), now.Location())
}

// MonthHead 获取一月中的第一天的第一秒
// offset 偏移月数,例如:-1:前一月 0:当前月 1:下一月
func MonthHead(offset ...int) time.Time {
now := Now()

if len(offset) == 0 || offset[0] == 0 {
return time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location())
}

offsetYears := offset[0] / 12
offsetMonths := offset[0] % 12
year := now.Year() + offsetYears
month := int(now.Month()) + offsetMonths

if month <= 0 {
year--
month += 12
}

return time.Date(year, time.Month(month), 1, 0, 0, 0, 0, now.Location())
}

// MonthTail 获取一月中的最后一天的最后一秒
// offset 偏移月数,例如:-1:前一月 0:当前月 1:下一月
func MonthTail(offset ...int) time.Time {
now := Now()

if len(offset) == 0 || offset[0] == 0 {
return time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 59, 999999999, now.Location())
}

offsetYears := offset[0] / 12
offsetMonths := offset[0] % 12
year := now.Year() + offsetYears
month := int(now.Month()) + offsetMonths

if month <= 0 {
year--
month += 12
}

var day int
switch time.Month(month) {
case time.January, time.March, time.May, time.July, time.August, time.October, time.December:
day = 31
case time.April, time.June, time.September, time.November:
day = 30
case time.February:
if (year%4 == 0 && year%100 != 0) || year%400 == 0 {
day = 29
} else {
day = 28
}
}

return now.AddDate(0, 0, offsetDays)
return time.Date(year, time.Month(month), day, 23, 59, 59, 999999999, now.Location())
}
54 changes: 54 additions & 0 deletions utils/xtime/time_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,57 @@ func TestNow(t *testing.T) {
func TestToday(t *testing.T) {
t.Log(xtime.Today())
}

func TestDay(t *testing.T) {
t.Log(xtime.Day())
t.Log(xtime.Day(-1))
t.Log(xtime.Day(1))
}

func TestDayHead(t *testing.T) {
t.Log(xtime.DayHead())
t.Log(xtime.DayHead(-1))
t.Log(xtime.DayHead(1))
}

func TestDayTail(t *testing.T) {
t.Log(xtime.DayTail())
t.Log(xtime.DayTail(-1))
t.Log(xtime.DayTail(1))
}

func TestWeek(t *testing.T) {
t.Log(xtime.Week())
t.Log(xtime.Week(-1))
t.Log(xtime.Week(1))
}

func TestWeekHead(t *testing.T) {
t.Log(xtime.WeekHead())
t.Log(xtime.WeekHead(-1))
t.Log(xtime.WeekHead(1))
}

func TestWeekTail(t *testing.T) {
t.Log(xtime.WeekTail())
t.Log(xtime.WeekTail(-1))
t.Log(xtime.WeekTail(1))
}

func TestMonth(t *testing.T) {
for i := 0; i <= 100; i++ {
t.Log(xtime.Month(0 - i))
}
}

func TestMonthHead(t *testing.T) {
for i := 0; i <= 100; i++ {
t.Log(xtime.MonthHead(0 - i))
}
}

func TestMonthTail(t *testing.T) {
for i := 0; i <= 100; i++ {
t.Log(xtime.MonthTail(0 - i))
}
}

0 comments on commit 8059004

Please sign in to comment.