Skip to content

Datetime

datetime 日期时间处理包,格式化日期,比较日期。

源码:

用法:

go
import (
    "github.com/duke-git/lancet/v2/datetime"
)

目录

文档

注:

  1. 函数中format参数值需要传以下值之一 (忽略大小写):
  • yyyy-mm-dd hh:mm:ss
  • yyyy-mm-dd hh:mm
  • yyyy-mm-dd hh
  • yyyy-mm-dd
  • yyyy-mm
  • mm-dd
  • dd-mm-yy hh:mm:ss
  • yyyy/mm/dd hh:mm:ss
  • yyyy/mm/dd hh:mm
  • yyyy/mm/dd hh
  • yyyy/mm/dd
  • yyyy/mm
  • mm/dd
  • dd/mm/yy hh:mm:ss
  • yyyymmdd
  • mmddyy
  • yyyy
  • yy
  • mm
  • hh:mm:ss
  • hh:mm
  • mm:ss

AddDay

将日期加/减天数。

函数签名:

go
func AddDay(t time.Time, day int64) time.Time

示例:运行

go
package main

import (
    "fmt"
    "time"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    now := time.Now()

    tomorrow := datetime.AddDay(now, 1)
    diff1 := tomorrow.Sub(now)

    yesterday := datetime.AddDay(now, -1)
    diff2 := yesterday.Sub(now)

    fmt.Println(diff1)
    fmt.Println(diff2)

    // Output:
    // 24h0m0s
    // -24h0m0s
}

AddHour

将日期加/减小时数。

函数签名:

go
func AddHour(t time.Time, hour int64) time.Time

示例:运行

go
package main

import (
    "fmt"
    "time"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    now := time.Now()

    after2Hours := datetime.AddHour(now, 2)
    diff1 := after2Hours.Sub(now)

    before2Hours := datetime.AddHour(now, -2)
    diff2 := before2Hours.Sub(now)

    fmt.Println(diff1)
    fmt.Println(diff2)

    // Output:
    // 2h0m0s
    // -2h0m0s
}

AddMinute

将日期加/减分钟数。

函数签名:

go
func AddMinute(t time.Time, minute int64) time.Time

示例:运行

go
package main

import (
    "fmt"
    "time"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    now := time.Now()

    after2Minutes := datetime.AddMinute(now, 2)
    diff1 := after2Minutes.Sub(now)

    before2Minutes := datetime.AddMinute(now, -2)
    diff2 := before2Minutes.Sub(now)

    fmt.Println(diff1)
    fmt.Println(diff2)

    // Output:
    // 2m0s
    // -2m0s
}

AddYear

将日期加/减年数。

函数签名:

go
func AddYear(t time.Time, year int64) time.Time

示例:运行

go
package main

import (
    "fmt"
    "time"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    now := time.Now()

    after1Year := datetime.AddYear(now, 1)
    diff1 := after1Year.Sub(now)

    before1Year := datetime.AddYear(now, -1)
    diff2 := before1Year.Sub(now)

    fmt.Println(diff1)
    fmt.Println(diff2)

    // Output:
    // 8760h0m0s
    // -8760h0m0s
}

BeginOfMinute

返回指定时间的分钟开始时间。

函数签名:

go
func BeginOfMinute(t time.Time) time.Time

示例:运行

go
package main

import (
    "fmt"
    "time"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
    result := datetime.BeginOfMinute(input)

    fmt.Println(result)

    // Output:
    // 2023-01-08 18:50:00 +0000 UTC
}

BeginOfHour

返回指定时间的小时开始时间。

函数签名:

go
func BeginOfHour(t time.Time) time.Time

示例:运行

go
package main

import (
    "fmt"
    "time"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
    result := datetime.BeginOfHour(input)

    fmt.Println(result)

    // Output:
    // 2023-01-08 18:00:00 +0000 UTC
}

BeginOfDay

返回指定时间的当天开始时间。

函数签名:

go
func BeginOfDay(t time.Time) time.Time

示例:运行

go
package main

import (
    "fmt"
    "time"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
    result := datetime.BeginOfDay(input)

    fmt.Println(result)

    // Output:
    // 2023-01-08 00:00:00 +0000 UTC
}

BeginOfWeek

返回指定时间的每周开始时间,默认开始时间星期日。

函数签名:

go
func BeginOfWeek(t time.Time, beginFrom ...time.Weekday) time.Time

示例:运行

go
package main

import (
    "fmt"
    "time"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
    result := datetime.BeginOfWeek(input)

    fmt.Println(result)

    // Output:
    // 2023-01-08 00:00:00 +0000 UTC
}

BeginOfMonth

返回指定时间的当月开始时间。

函数签名:

go
func BeginOfMonth(t time.Time) time.Time

示例:运行

go
package main

import (
    "fmt"
    "time"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
    result := datetime.BeginOfMonth(input)

    fmt.Println(result)

    // Output:
    // 2023-01-01 00:00:00 +0000 UTC
}

BeginOfYear

返回指定时间的当年开始时间

函数签名:

go
func BeginOfYear(t time.Time) time.Time

示例:运行

go
package main

import (
    "fmt"
    "time"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
    result := datetime.BeginOfYear(input)

    fmt.Println(result)

    // Output:
    // 2023-01-01 00:00:00 +0000 UTC
}

EndOfMinute

返回指定时间的分钟结束时间。

函数签名:

go
func EndOfMinute(t time.Time) time.Time

示例:运行

go
package main

import (
    "fmt"
    "time"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
    result := datetime.EndOfMinute(input)

    fmt.Println(result)

    // Output:
    // 2023-01-08 18:50:59.999999999 +0000 UTC
}

EndOfHour

返回指定时间的小时结束时间。

函数签名:

go
func EndOfHour(t time.Time) time.Time

示例:运行

go
package main

import (
    "fmt"
    "time"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
    result := datetime.EndOfHour(input)

    fmt.Println(result)

    // Output:
    // 2023-01-08 18:59:59.999999999 +0000 UTC
}

EndOfDay

返回指定时间的当天结束时间。

函数签名:

go
func EndOfDay(t time.Time) time.Time

示例:运行

go
package main

import (
    "fmt"
    "time"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
    result := datetime.EndOfDay(input)

    fmt.Println(result)

    // Output:
    // 2023-01-08 23:59:59.999999999 +0000 UTC
}

EndOfWeek

返回指定时间的星期结束时间,默认结束时间星期六。

函数签名:

go
func EndOfWeek(t time.Time, endWith ...time.Weekday) time.Time

示例:运行

go
package main

import (
    "fmt"
    "time"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
    result := datetime.EndOfWeek(input)

    fmt.Println(result)

    // Output:
    // 2023-01-14 23:59:59.999999999 +0000 UTC
}

EndOfMonth

返回指定时间的当月结束时间。

函数签名:

go
func EndOfMonth(t time.Time) time.Time

示例:运行

go
package main

import (
    "fmt"
    "time"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
    result := datetime.EndOfMonth(input)

    fmt.Println(result)

    // Output:
    // 2023-01-31 23:59:59.999999999 +0000 UTC
}

EndOfYear

返回指定时间的当年结束时间。

函数签名:

go
func EndOfYear(t time.Time) time.Time

示例:运行

go
package main

import (
    "fmt"
    "time"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
    result := datetime.EndOfYear(input)

    fmt.Println(result)

    // Output:
    // 2023-12-31 23:59:59.999999999 +0000 UTC
}

GetNowDate

获取当天日期,返回格式:yyyy-mm-dd。

函数签名:

go
func GetNowDate() string

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    currentDate := datetime.GetNowDate()
    fmt.Println(currentDate)

    // Output:
    // 2022-01-28
}

GetNowTime

获取当时时间,返回格式:hh:mm:ss

函数签名:

go
func GetNowTime() string

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    currentTime := datetime.GetNowTime()
    fmt.Println(currentTime)

    // Output:
    // 15:57:33
}

GetNowDateTime

获取当时日期和时间,返回格式:yyyy-mm-dd hh:mm:ss。

函数签名:

go
func GetNowDateTime() string

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    current := datetime.GetNowDateTime()
    fmt.Println(current)

    // Output:
    // 2022-01-28 15:59:33
}

GetTodayStartTime

返回当天开始时间, 格式: yyyy-mm-dd 00:00:00。

函数签名:

go
func GetTodayStartTime() string

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    startTime := datetime.GetTodayStartTime()
    fmt.Println(startTime)

    // Output:
    // 2023-06-29 00:00:00
}

GetTodayEndTime

返回当天结束时间,格式: yyyy-mm-dd 23:59:59。

函数签名:

go
func GetTodayEndTime() string

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    endTime := datetime.GetTodayEndTime()
    fmt.Println(endTime)

    // Output:
    // 2023-06-29 23:59:59
}

GetZeroHourTimestamp

获取零点时间戳(timestamp of 00:00)

函数签名:

go
func GetZeroHourTimestamp() int64

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    zeroTime := datetime.GetZeroHourTimestamp()
    fmt.Println(zeroTime)

    // Output:
    // 1643299200
}

GetNightTimestamp

获取午夜时间戳(timestamp of 23:59)。

函数签名:

go
func GetNightTimestamp() int64

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    nightTime := datetime.GetNightTimestamp()
    fmt.Println(nightTime)

    // Output:
    // 1643385599
}

FormatTimeToStr

将日期格式化成字符串,`format` 参数格式参考注1。

函数签名:

go
func FormatTimeToStr(t time.Time, format string, timezone ...string) string

示例:运行

go
package main

import (
    "fmt"
    "time"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    t, _ := time.Parse("2006-01-02 15:04:05", "2021-01-02 16:04:08")

    result1 := datetime.FormatTimeToStr(t, "yyyy-mm-dd hh:mm:ss")
    result2 := datetime.FormatTimeToStr(t, "yyyy-mm-dd")
    result3 := datetime.FormatTimeToStr(t, "dd-mm-yy hh:mm:ss")

    fmt.Println(result1)
    fmt.Println(result2)
    fmt.Println(result3)

    // Output:
    // 2021-01-02 16:04:08
    // 2021-01-02
    // 02-01-21 16:04:08
}

FormatStrToTime

将字符串格式化成时间,`format` 参数格式参考注1。

函数签名:

go
func FormatStrToTime(str, format string, timezone ...string) (time.Time, error)

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    result1, _ := datetime.FormatStrToTime("2021-01-02 16:04:08", "yyyy-mm-dd hh:mm:ss")
    result2, _ := datetime.FormatStrToTime("2021-01-02", "yyyy-mm-dd")
    result3, _ := datetime.FormatStrToTime("02-01-21 16:04:08", "dd-mm-yy hh:mm:ss")

    fmt.Println(result1)
    fmt.Println(result2)
    fmt.Println(result3)

    // Output:
    // 2021-01-02 16:04:08 +0000 UTC
    // 2021-01-02 00:00:00 +0000 UTC
    // 2021-01-02 16:04:08 +0000 UTC
}

NewUnixNow

创建一个当前时间的unix时间戳。

函数签名:

go
type theTime struct {
    unix int64
}
func NewUnixNow() *theTime

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    tm := datetime.NewUnixNow()
    fmt.Println(tm)

    // Output:
    // &{1647597438}
}

NewUnix

创建一个unix时间戳。

函数签名:

go
type theTime struct {
    unix int64
}
func NewUnix(unix int64) *theTime

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    tm := datetime.NewUnix(1647597438)
    fmt.Println(tm)

    // Output:
    // &{1647597438}
}

NewFormat

创建一个yyyy-mm-dd hh:mm:ss格式时间字符串的unix时间戳。

函数签名:

go
type theTime struct {
    unix int64
}
func NewFormat(t string) (*theTime, error)

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    tm, err := datetime.NewFormat("2022-03-18 17:04:05")
    fmt.Println(tm)

    // Output:
    // &{1647594245}
}

NewISO8601

创建一个iso8601格式时间字符串的unix时间戳。

函数签名:

go
type theTime struct {
    unix int64
}
func NewISO8601(iso8601 string) (*theTime, error)

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    tm, err := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
    fmt.Println(tm)

    // Output:
    // &{1136214245}
}

ToUnix

返回unix时间戳。

函数签名:

go
func (t *theTime) ToUnix() int64

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    tm := datetime.NewUnixNow()
    fmt.Println(tm.ToUnix())

    // Output:
    // 1647597438
}

ToFormat

返回格式'yyyy-mm-dd hh:mm:ss'的日期字符串。

函数签名:

go
func (t *theTime) ToFormat() string

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
    fmt.Println(tm.ToFormat())

    // Output:
    // 2022-03-18 17:04:05
}

ToFormatForTpl

返回tpl格式指定的日期字符串。

函数签名:

go
func (t *theTime) ToFormatForTpl(tpl string) string

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
    ts := tm.ToFormatForTpl("2006/01/02 15:04:05")
    fmt.Println(ts)

    // Output:
    // 2022/03/18 17:04:05
}

ToIso8601

返回iso8601日期字符串。

函数签名:

go
func (t *theTime) ToIso8601() string

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    tm, _ := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
    ts := tm.ToIso8601()
    fmt.Println(ts)

    // Output:
    // 2006-01-02T23:04:05+08:00
}

IsLeapYear

验证是否是闰年。

函数签名:

go
func IsLeapYear(year int) bool

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    result1 := datetime.IsLeapYear(2000)
    result2 := datetime.IsLeapYear(2001)

    fmt.Println(result1)
    fmt.Println(result2)

    // Output:
    // true
    // false
}

BetweenSeconds

返回两个时间的间隔秒数。

函数签名:

go
func BetweenSeconds(t1 time.Time, t2 time.Time) int64

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    today := time.Now()
    tomorrow := datetime.AddDay(today, 1)
    yesterday := datetime.AddDay(today, -1)

    result1 := datetime.BetweenSeconds(today, tomorrow)
    result2 := datetime.BetweenSeconds(today, yesterday)

    fmt.Println(result1)
    fmt.Println(result2)

    // Output:
    // 86400
    // -86400
}

DayOfYear

返回参数日期是一年中的第几天。

函数签名:

go
func DayOfYear(t time.Time) int

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    date1 := time.Date(2023, 02, 01, 1, 1, 1, 0, time.Local)
    result1 := datetime.DayOfYear(date1)

    date2 := time.Date(2023, 01, 02, 1, 1, 1, 0, time.Local)
    result2 := datetime.DayOfYear(date2)

    date3 := time.Date(2023, 01, 01, 1, 1, 1, 0, time.Local)
    result3 := datetime.DayOfYear(date3)

    fmt.Println(result1)
    fmt.Println(result2)
    fmt.Println(result3)

    // Output:
    // 31
    // 1
    // 0
}

IsWeekend(已废弃, 使用 '== Weekday')

判断日期是否是周末。

函数签名:

go
func IsWeekend(t time.Time) bool

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    date1 := time.Date(2023, 06, 03, 0, 0, 0, 0, time.Local)
    date2 := time.Date(2023, 06, 04, 0, 0, 0, 0, time.Local)
    date3 := time.Date(2023, 06, 02, 0, 0, 0, 0, time.Local)

    result1 := datetime.IsWeekend(date1)
    result2 := datetime.IsWeekend(date2)
    result3 := datetime.IsWeekend(date3)

    fmt.Println(result1)
    fmt.Println(result2)
    fmt.Println(result3)

    // Output:
    // true
    // true
    // false
}

NowDateOrTime

根据指定的格式和时区返回当前时间字符串。

函数签名:

go
func NowDateOrTime(format string, timezone ...string) string

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    result1 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss")

    result2 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss", "EST")

    fmt.Println(result1)
    fmt.Println(result2)

    // Output:
    // 2023-07-26 15:01:30
    // 2023-07-26 02:01:30
}

Timestamp

返回当前秒级时间戳。

函数签名:

go
func Timestamp(timezone ...string) int64

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    ts := datetime.Timestamp()

    fmt.Println(ts)

    // Output:
    // 1690363051
}

TimestampMilli

返回当前毫秒级时间戳。

函数签名:

go
func TimestampMilli(timezone ...string) int64

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    ts := datetime.TimestampMilli()

    fmt.Println(ts)

    // Output:
    // 1690363051331
}

TimestampMicro

返回当前微秒级时间戳。

函数签名:

go
func TimestampMicro(timezone ...string) int64

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    ts := datetime.TimestampMicro()

    fmt.Println(ts)

    // Output:
    // 1690363051331784
}

TimestampNano

返回当前纳秒级时间戳。

函数签名:

go
func TimestampNano(timezone ...string) int64

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    ts := datetime.TimestampNano()

    fmt.Println(ts)

    // Output:
    // 1690363051331788000
}

TrackFuncTime

测试函数执行时间。

函数签名:

go
func TrackFuncTime(pre time.Time) func()

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    defer datetime.TrackFuncTime(time.Now())()

    var n int
    for i := 0; i < 5000000; i++ {
        n++
    }

    fmt.Println(1) // Function main execution time:     1.460287ms
}

DaysBetween

返回两个日期之间的天数差。

函数签名:

go
func DaysBetween(start, end time.Time) int

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    start := time.Date(2024, time.September, 1, 0, 0, 0, 0, time.UTC)
    end := time.Date(2024, time.September, 10, 0, 0, 0, 0, time.UTC)

    result := datetime.DaysBetween(start, end)

    fmt.Println(result)

    // Output:
    // 9
}

GenerateDatetimesBetween

生成从start到end的所有日期时间的字符串列表。layout参数表示时间格式,例如"2006-01-02 15:04:05",interval参数表示时间间隔,例如"1h"表示1小时,"30m"表示30分钟。

函数签名:

go
func GenerateDatetimesBetween(start, end time.Time, layout string, interval string) ([]string, error)

示例:运行

go
package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datetime"
)

func main() {
    start := time.Date(2024, time.September, 1, 0, 0, 0, 0, time.UTC)
    end := time.Date(2024, time.September, 1, 2, 0, 0, 0, time.UTC)

    layout := "2006-01-02 15:04:05"
    interval := "1h"

    result, err := datetime.GenerateDatetimesBetween(start, end, layout, interval)

    fmt.Println(result)
    fmt.Println(err)

    // Output:
    // [2024-09-01 00:00:00 2024-09-01 01:00:00 2024-09-01 02:00:00]
    // <nil>
}