Skip to content

Commit

Permalink
更新包名为 thru
Browse files Browse the repository at this point in the history
  • Loading branch information
baagod committed Dec 20, 2024
1 parent 038a8cb commit 3c4f82f
Show file tree
Hide file tree
Showing 7 changed files with 79 additions and 53 deletions.
30 changes: 15 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# warp
# thru

golang 时间包
Golang 时间包

## 安装

```shell
go get -u github.com/baagod/thru@main
go get -u github.com/baagod/thru@latest
```

## 使用
Expand All @@ -31,10 +31,10 @@ thru.ParseByLayout("2006-01-02", "2023-03-19") // 通过布局格式创建
现在假设当前时间是:`2023-01-31 13:14:15 +0800 CST` ( 中国标准时间 )

```go
now.AddYear() // 添加一年
now.AddMonth(-2, 3) // 在当前时间上偏移 -2月3天
now.AddDay(3) // 三天后
now.Add(time.Hour) // 1小时后
now.AddYear() // 添加一年
now.AddMonth(-2, 3) // 在当前时间上偏移 -2月3天
now.AddDay(3) // 三天后
now.Add(time.Hour) // 1小时后
```

指定 `d` 参数时可能会导致日期溢出,例如:
Expand All @@ -43,7 +43,7 @@ now.Add(time.Hour) // 1小时后
now.AddYear(1, 1, 0)
```

该函数在指定 `d` 参数时的行为完全和 `time.AddDate()` 相同,因此返回 `2024-03-02 13:14:15`。这导致我们以为结果和预期不符,这就是日期溢出
该函数在指定 `d` 参数时的行为和 `time.AddDate()` 完全相同,因此返回 `2024-03-02 13:14:15`。这导致我们以为结果和预期不符,其实就是日期溢出了

让我来尝试解释一下,这是因为 2024 年 2 月一共有 29 天。当我们预期从 2023-01-31 移动到 2024-02-31 时,实际上天数已经溢出 2
天,结果就是它跑到 2024-02-29 时发现后面还有 2 天要继续增加,最终返回 2024-03-02。
Expand All @@ -53,7 +53,7 @@ now.AddYear(1, 1, 0)
主要使用 `Go(y int, md ...int)` 方法进行操作。该函数偏移 `±y` 年并选择 `m``d` 日,如果 `m, d`
为负数,则从最后的月、日开始选择,并且不会溢出。例如:

- `Go(1, 13, 1)` 会返回 `2024-12-31 13:14:15`
- `Go(1, 13, 1)` 会返回 `2024-12-01 13:14:15`
- `Go(1, 2, 31)` 返回二月最后一天 `2024-02-29 13:14:15`

```go
Expand All @@ -68,7 +68,7 @@ now.GoDay(10) // 本月10号
now.GoYear(2024, 03, 15) // 返回 2024-03-15 13:14:15
```

但是这就跟直接创建差不多了?有用吗?也许吧,我不知道
但是这就跟直接创建差不多了?有用吗?也许吧。

### 开始时间、结束时间

Expand All @@ -88,7 +88,7 @@ now.StartWeek(1) // 下周开始时间
now.StartWeek(2) // 两周后的星期一开始时间
```

另外还提供方便方法,和 `Start(ymd ...int)` 一样:
另外还提供以下方便方法,和 `Start(ymd ...int)` 一样:

- `StartMonth(md ...int)`: 从 `m` 开始。
- `StartDay(d int)`: 从 `d` 开始。
Expand All @@ -112,10 +112,10 @@ Second(3) // 毫秒 (3位)
Second(6) // 微秒 (6位)
Second(9) // 纳秒 (9位)

Time.Unix() // 秒时间戳 (10位)
Time.Unix(3) // 毫秒时间戳 (13位)
Time.Unix(6) // 微秒时间戳 (16位)
Time.Unix(9) // 纳秒时间戳 (19位)
Unix() // 秒时间戳 (10位)
Unix(3) // 毫秒时间戳 (13位)
Unix(6) // 微秒时间戳 (16位)
Unix(9) // 纳秒时间戳 (19位)

UTC() // 返回 UTC 时间
Local() // 返回本地时间
Expand Down
4 changes: 2 additions & 2 deletions format.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package warp
package thru

import (
"fmt"
Expand Down Expand Up @@ -62,7 +62,7 @@ var patterns = map[string]*regexp.Regexp{
// ParseE 解析 value 并返回它所表示的时间
func ParseE(value string, loc ...*time.Location) (Time, error) {
value = strings.Trim(strings.TrimSpace(value), `"`)
if value == "" {
if value == "" || value == "null" {
return Time{}, nil
}

Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
module github.com/baagod/warp
module github.com/baagod/thru

go 1.19
2 changes: 1 addition & 1 deletion helps.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package warp
package thru

func Clamp[T int | int64 | float64](value, min, max T) int {
if value < min {
Expand Down
34 changes: 21 additions & 13 deletions warp.go → thru.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package warp
package thru

import (
"database/sql/driver"
Expand All @@ -12,9 +12,12 @@ var (
)

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

// ---- 创建时间 ----

func New(t time.Time) Time {
return Time{time: t}
}
Expand All @@ -34,6 +37,19 @@ func Date[Month ~int](
return Time{time: time.Date(year, m, day, hour, min, sec, nsec, loc[0])}
}

// Unix 返回给定时间戳的本地时间。secs 可以是秒、毫秒或纳秒级时间戳。
func Unix(secs int64) Time {
if secs <= 9999999999 { // 10 位及以下,视为秒级时间戳
return Time{time: time.Unix(secs, 0)}
}
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 @@ -434,7 +450,7 @@ func Until(t Time) time.Duration {
// Scan 由 DB 转到 Go 时调用
func (t *Time) Scan(value any) error {
if v, ok := value.(time.Time); ok {
*t = Time{v}
*t = Time{time: v}
}
return nil
}
Expand All @@ -444,12 +460,12 @@ func (t Time) Value() (driver.Value, error) {
if t.IsZero() {
return nil, nil
}
return t.String(), nil
return t, nil
}

// MarshalJSON 将 t 转为 JSON 字符串时调用
func (t Time) MarshalJSON() ([]byte, error) {
return []byte(`"` + t.String() + `"`), nil
return []byte(`"` + t.Format(DateTime) + `"`), nil
}

// UnmarshalJSON 将 JSON 字符串转为 t 时调用
Expand All @@ -472,14 +488,6 @@ func (t Time) ZeroOr(u Time) Time {
return t
}

// Unix 返回给定 Unix 时间戳的本地时间
func Unix(secs int64) Time {
if secs <= 9999999999 { // 10 位及以下,视为秒级时间戳
return Time{time: time.Unix(secs, 0)}
}
return Time{time: time.Unix(0, secs)}
}

// IsLeap 返回 year 是否闰年
func IsLeap(year int) bool {
return year%4 == 0 && (year%100 != 0 || year%400 == 0)
Expand Down
39 changes: 39 additions & 0 deletions thru_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
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))
}

func BenchmarkParse(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = Parse("2024-01-02")
}
}
21 changes: 0 additions & 21 deletions warp_test.go

This file was deleted.

0 comments on commit 3c4f82f

Please sign in to comment.