Skip to content

Commit

Permalink
- 移除使用 append(d, x) 的方式作为默认值。
Browse files Browse the repository at this point in the history
- 修正 `Start()` 和 `End()` 系列方法返回不对问题。
  • Loading branch information
baagod committed Dec 20, 2024
1 parent 3c4f82f commit 5f75e94
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 88 deletions.
Empty file added go.sum
Empty file.
97 changes: 37 additions & 60 deletions thru.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ var (
)

type Time struct {
time time.Time
layout string
time time.Time
}

// ---- 创建时间 ----
Expand All @@ -27,8 +26,8 @@ func Now() Time {
}

func Date[Month ~int](
year int, month Month, day,
hour, min, sec, nsec int, loc ...*time.Location,
year int, month Month, day, hour,
min, sec, nsec int, loc ...*time.Location,
) Time {
if loc == nil {
loc = append(loc, time.Local)
Expand All @@ -45,11 +44,6 @@ func Unix(secs int64) Time {
return Time{time: time.Unix(0, secs)}
}

func (t Time) Layout(layout string) Time {
t.layout = layout
return t
}

// ---- 添加时间 ----

// AddYear 添加年月日,指定 d 参数时年、月会溢出。默认添加一年。
Expand Down Expand Up @@ -98,8 +92,11 @@ func (t Time) AddMonth(md ...int) Time {

// AddDay 添加天数,默认添加一天。
func (t Time) AddDay(d ...int) Time {
d = append(d, 1)
return t.AddYear(0, 0, d[0])
day := 1
if d != nil {
day = d[0]
}
return t.AddYear(0, 0, day)
}

// Add 返回 t + d 时间
Expand Down Expand Up @@ -159,34 +156,20 @@ func (t Time) GoDay(d int) Time {

// Start 它和 `AddYear(ymd ...int)` 类似,但是返回开始时间。
func (t Time) Start(ymd ...int) Time {
y, m := 1, 0

if i := len(ymd); i > 0 {
if y = ymd[0]; i > 1 {
m = ymd[1]
}
if i > 2 && ymd[0] != 0 {
u := t.time.AddDate(y, m, ymd[2])
return Date(u.Year(), u.Month(), u.Day(), 0, 0, 0, 0, t.Location())
}
}

months := t.Month() + m // 计算总月数
y += t.Year() + (months-1)/12 // 计算新的年份
if m = (months-1)%12 + 1; m <= 0 { // 计算剩余月数并处理负数情况
m += 12 // 将月份调整到正确范围 (1-12)
y-- // 由于月份向前偏移了一年,所以年份需要减 1。
}

d := t.Day() // 获取原始日期
if maxDay := DaysIn(y, m); d > maxDay { // 处理溢出天数
d = maxDay
y, m, d := t.Year(), 1, 1

if i := len(ymd); i == 1 { // 传年
y += ymd[0]
} else if i == 2 { // 传年月
y, m = y+ymd[0], t.Month()+ymd[1]
} else if i > 2 { // 传年月日
y, m, d = y+ymd[0], t.Month()+ymd[1], t.Day()+ymd[2]
}

return Date(y, m, d, 0, 0, 0, 0, t.Location())
}

// StartMonth 返回时间 t 的 m 月 d 日的开始时间
// StartMonth 返回 m 月 d 日的开始时间
func (t Time) StartMonth(md ...int) Time {
m, d := 0, 0
if i := len(md); i > 0 {
Expand All @@ -197,10 +180,13 @@ func (t Time) StartMonth(md ...int) Time {
return t.Start(0, m, d)
}

// StartDay 返回时间 t d 日开始时间
// StartDay 返回 t d 日开始时间
func (t Time) StartDay(d ...int) Time {
d = append(d, 0)
return t.Start(0, 0, d[0])
var day int
if d != nil {
day = d[0]
}
return t.Start(0, 0, day)
}

// StartWeek 偏移至 ±n 周开始时间,默认返回本周开始时间。
Expand All @@ -220,29 +206,16 @@ func (t Time) StartWeek(n ...int) Time {

// ---- 结束时间 ----

// End 时间 t.Year()+y 年的 m 月 d 日结束时间
// End 它和 `AddYear(ymd ...int)` 类似,但是返回结束时间。
func (t Time) End(ymd ...int) Time {
y, m, d := t.Year(), 12, 31

if i := len(ymd); i > 0 {
if y = ymd[0]; i > 1 {
m = ymd[1]
}
if i > 2 && ymd[2] != 0 {
u := t.time.AddDate(y, m, ymd[2])
return Date(u.Year(), u.Month(), u.Day(), 23, 59, 59, 999999999, t.Location())
}
}

months := t.Month() + m // 计算总月数
y += t.Year() + (months-1)/12 // 计算新的年份
if m = (months-1)%12 + 1; m <= 0 { // 计算剩余月数并处理负数情况
m += 12 // 将月份调整到正确范围 (1-12)
y-- // 由于月份向前偏移了一年,所以年份需要减 1。
}

if maxDay := DaysIn(y, m); d > maxDay { // 处理溢出天数
d = maxDay
y, m, d := t.Year(), t.Month(), t.Day()

if i := len(ymd); i == 1 { // 传年
y += ymd[0]
} else if i == 2 { // 传年月
y, m = y+ymd[0], m+ymd[1]
} else if i > 2 { // 传年月日
y, m, d = y+ymd[0], m+ymd[1], d+ymd[2]
}

return Date(y, m, d, 23, 59, 59, 999999999, t.Location())
Expand All @@ -261,7 +234,11 @@ func (t Time) EndMonth(md ...int) Time {

// EndDay 时间 t 的 d 日的结束时间
func (t Time) EndDay(d ...int) Time {
return t.End(0, 0, append(d, 0)[0])
var day int
if d != nil {
day = d[0]
}
return t.End(0, 0, day)
}

// EndWeek 偏移至 ±n 周结束时间,默认返回本周结束时间。
Expand Down
34 changes: 6 additions & 28 deletions thru_test.go
Original file line number Diff line number Diff line change
@@ -1,39 +1,17 @@
package thru

import (
"encoding/json"
"fmt"
"testing"
)

type Model struct {
Time Time `json:"time"`
}

func (m Model) MarshalJSON() ([]byte, error) {
type Alias Model
fmt.Printf("%p\n", &m.Time) // 0xc0000940c0
a := (*Alias)(&m)
a.Time = m.Time.Layout(DateTime)
fmt.Printf("%p\n", &m.Time) // 0xc0000940c0
return json.Marshal(a)
}

func TestWarp(t *testing.T) {
pt, _ := ParseE("2024-12-20T09:33:59.9549583+08:00")
// pt, _ := time.Parse(time.DateTime, "2023-01-31 13:14:15")
// fmt.Println(pt.AddYear(1, 1))
fmt.Println(pt)

var m Model
m.Time = Now()

b, _ := json.Marshal(&m)
fmt.Println(string(b))
pt, _ := ParseE("2024-03-01")
// pt, _ := time.Parse(time.DateOnly, "2023-03-01")
fmt.Println(pt.Start(0, 1))
}

func BenchmarkParse(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = Parse("2024-01-02")
}
func TestStart(t *testing.T) {
pt, _ := ParseE("2024-03-02 15:04:05.999999999")
fmt.Println(pt.Start())
}

0 comments on commit 5f75e94

Please sign in to comment.