golang时间工具包插件库now的使用
Golang 时间工具包插件库 now 的使用
Now 是一个 Golang 的时间工具包。
安装
go get -u github.com/jinzhu/now
使用
基于当前时间计算时间
import "github.com/jinzhu/now"
time.Now() // 2013-11-18 17:51:49.123456789 Mon
now.BeginningOfMinute() // 2013-11-18 17:51:00 Mon
now.BeginningOfHour() // 2013-11-18 17:00:00 Mon
now.BeginningOfDay() // 2013-11-18 00:00:00 Mon
now.BeginningOfWeek() // 2013-11-17 00:00:00 Sun
now.BeginningOfMonth() // 2013-11-01 00:00:00 Fri
now.BeginningOfQuarter() // 2013-10-01 00:00:00 Tue
now.BeginningOfYear() // 2013-01-01 00:00:00 Tue
now.EndOfMinute() // 2013-11-18 17:51:59.999999999 Mon
now.EndOfHour() // 2013-11-18 17:59:59.999999999 Mon
now.EndOfDay() // 2013-11-18 23:59:59.999999999 Mon
now.EndOfWeek() // 2013-11-23 23:59:59.999999999 Sat
now.EndOfMonth() // 2013-11-30 23:59:59.999999999 Sat
now.EndOfQuarter() // 2013-12-31 23:59:59.999999999 Tue
now.EndOfYear() // 2013-12-31 23:59:59.999999999 Tue
now.WeekStartDay = time.Monday // 设置周一为一周的第一天,默认为周日
now.EndOfWeek() // 2013-11-24 23:59:59.999999999 Sun
基于另一个时间计算时间
t := time.Date(2013, 02, 18, 17, 51, 49, 123456789, time.Now().Location())
now.With(t).EndOfMonth() // 2013-02-28 23:59:59.999999999 Thu
基于配置计算时间
location, err := time.LoadLocation("Asia/Shanghai")
myConfig := &now.Config{
WeekStartDay: time.Monday,
TimeLocation: location,
TimeFormats: []string{"2006-01-02 15:04:05"},
}
t := time.Date(2013, 11, 18, 17, 51, 49, 123456789, time.Now().Location()) // // 2013-11-18 17:51:49.123456789 Mon
myConfig.With(t).BeginningOfWeek() // 2013-11-18 00:00:00 Mon
myConfig.Parse("2002-10-12 22:14:01") // 2002-10-12 22:14:01
myConfig.Parse("2002-10-12 22:14") // 返回错误 'can't parse string as time: 2002-10-12 22:14'
星期一/星期日
不用担心 WeekStartDay
设置,你可以直接使用 Monday
和 Sunday
方法:
now.Monday() // 2013-11-18 00:00:00 Mon
now.Monday("17:44") // 2013-11-18 17:44:00 Mon
now.Sunday() // 2013-11-24 00:00:00 Sun (下周日)
now.Sunday("18:19:24") // 2013-11-24 18:19:24 Sun (下周日)
now.EndOfSunday() // 2013-11-24 23:59:59.999999999 Sun (下周日结束)
t := time.Date(2013, 11, 24, 17, 51, 49, 123456789, time.Now().Location()) // 2013-11-24 17:51:49.123456789 Sun
now.With(t).Monday() // 2013-11-18 00:00:00 Mon (如果是周日则返回上周一)
now.With(t).Monday("17:44") // 2013-11-18 17:44:00 Mon (如果是周日则返回上周一)
now.With(t).Sunday() // 2013-11-24 00:00:00 Sun (如果是周日则返回当天开始)
now.With(t).Sunday("18:19:24") // 2013-11-24 18:19:24 Sun (如果是周日则返回当天开始)
now.With(t).EndOfSunday() // 2013-11-24 23:59:59.999999999 Sun (如果是周日则返回当天结束)
解析字符串为时间
time.Now() // 2013-11-18 17:51:49.123456789 Mon
// Parse(string) (time.Time, error)
t, err := now.Parse("2017") // 2017-01-01 00:00:00, nil
t, err := now.Parse("2017-10") // 2017-10-01 00:00:00, nil
t, err := now.Parse("2017-10-13") // 2017-10-13 00:00:00, nil
t, err := now.Parse("1999-12-12 12") // 1999-12-12 12:00:00, nil
t, err := now.Parse("1999-12-12 12:20") // 1999-12-12 12:20:00, nil
t, err := now.Parse("1999-12-12 12:20:21") // 1999-12-12 12:20:21, nil
t, err := now.Parse("10-13") // 2013-10-13 00:00:00, nil
t, err := now.Parse("12:20") // 2013-11-18 12:20:00, nil
t, err := now.Parse("12:20:13") // 2013-11-18 12:20:13, nil
t, err := now.Parse("14") // 2013-11-18 14:00:00, nil
t, err := now.Parse("99:99") // 2013-11-18 12:20:00, Can't parse string as time: 99:99
// MustParse 必须将字符串解析为时间,否则会 panic
now.MustParse("2013-01-13") // 2013-01-13 00:00:00
now.MustParse("02-17") // 2013-02-17 00:00:00
now.MustParse("2-17") // 2013-02-17 00:00:00
now.MustParse("8") // 2013-11-18 08:00:00
now.MustParse("2002-10-12 22:14") // 2002-10-12 22:14:00
now.MustParse("99:99") // panic: Can't parse string as time: 99:99
扩展 now
支持更多格式非常简单,只需更新 now.TimeFormats
添加其他时间布局,例如:
now.TimeFormats = append(now.TimeFormats, "02 Jan 2006 15:04")
如果你希望某个格式得到官方支持,请发送 pull request 给我。
更多关于golang时间工具包插件库now的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang时间工具包插件库now的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang 时间工具包 now 的使用
now 是一个简单易用的 Golang 时间工具包,它提供了比标准库 time 更便捷的时间操作方法。下面我将详细介绍 now 的使用方法和示例代码。
安装 now 包
go get github.com/jinzhu/now
基本使用方法
1. 获取当前时间
package main
import (
"fmt"
"github.com/jinzhu/now"
)
func main() {
// 获取当前时间
currentTime := now.Now()
fmt.Println("当前时间:", currentTime)
}
2. 时间解析
func parseTime() {
// 解析字符串为时间
t, err := now.Parse("2023-01-15")
if err != nil {
fmt.Println("解析错误:", err)
return
}
fmt.Println("解析后的时间:", t)
}
常用时间操作
1. 获取时间段的开始和结束
func timeRange() {
current := now.Now()
// 获取今天的开始时间(00:00:00)
fmt.Println("今天开始:", now.BeginningOfDay())
// 获取今天的结束时间(23:59:59)
fmt.Println("今天结束:", now.EndOfDay())
// 获取本周的开始时间(周一00:00:00)
fmt.Println("本周开始:", now.BeginningOfWeek())
// 获取本周的结束时间(周日23:59:59)
fmt.Println("本周结束:", now.EndOfWeek())
// 获取本月的开始时间
fmt.Println("本月开始:", now.BeginningOfMonth())
// 获取本月的结束时间
fmt.Println("本月结束:", now.EndOfMonth())
// 获取本年的开始时间
fmt.Println("本年开始:", now.BeginningOfYear())
// 获取本年的结束时间
fmt.Println("本年结束:", now.EndOfYear())
}
2. 时间计算
func timeCalculation() {
// 获取明天的此时
fmt.Println("明天:", now.Now().AddDate(0, 0, 1))
// 获取一周后的此时
fmt.Println("一周后:", now.Now().AddDate(0, 0, 7))
// 获取一个月后的此时
fmt.Println("一个月后:", now.Now().AddDate(0, 1, 0))
// 获取一年后的此时
fmt.Println("一年后:", now.Now().AddDate(1, 0, 0))
// 获取昨天的此时
fmt.Println("昨天:", now.Now().AddDate(0, 0, -1))
}
3. 时间比较
func timeCompare() {
t1 := now.Parse("2023-01-01")
t2 := now.Parse("2023-01-15")
// 比较两个时间
if t1.After(t2) {
fmt.Println("t1 在 t2 之后")
} else if t1.Before(t2) {
fmt.Println("t1 在 t2 之前")
} else {
fmt.Println("t1 和 t2 相同")
}
// 计算时间差
duration := t2.Sub(t1)
fmt.Printf("时间差: %v 小时\n", duration.Hours())
}
高级用法
1. 自定义周开始日
默认情况下,now 认为一周从星期一开始,可以修改为从周日开始:
func customWeekStart() {
// 设置一周从周日开始
now.WeekStartDay = time.Sunday
// 现在获取本周开始时间会是上周日
fmt.Println("本周开始(周日):", now.BeginningOfWeek())
}
2. 自定义时间格式
func customFormat() {
// 自定义时间格式
now.TimeFormats = append(now.TimeFormats, "02 Jan 2006")
t, err := now.Parse("15 Jan 2023")
if err != nil {
fmt.Println("解析错误:", err)
return
}
fmt.Println("自定义格式解析:", t)
}
3. 链式调用
func chaining() {
// 链式调用
t := now.New(time.Date(2023, 1, 15, 12, 0, 0, 0, time.UTC)).
BeginningOfMonth().
AddDate(0, 1, 0).
EndOfMonth()
fmt.Println("下个月的最后一天:", t)
}
实际应用示例
1. 计算当月天数
func daysInMonth() {
// 获取当月天数
start := now.BeginningOfMonth()
end := now.EndOfMonth()
days := end.Day() - start.Day() + 1
fmt.Printf("本月有 %d 天\n", days)
}
2. 判断是否是周末
func isWeekend() {
t := now.Now()
weekday := t.Weekday()
if weekday == time.Saturday || weekday == time.Sunday {
fmt.Println("今天是周末")
} else {
fmt.Println("今天是工作日")
}
}
3. 生成时间范围
func timeRangeSlice() {
// 生成一周内每天的日期
start := now.BeginningOfWeek()
for i := 0; i < 7; i++ {
fmt.Println(start.AddDate(0, 0, i).Format("2006-01-02"))
}
}
now 库提供了比标准库更简洁的时间操作方法,特别适合需要频繁处理时间计算的场景。通过合理使用 now,可以大大减少时间处理相关的代码量,提高开发效率。