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 设置,你可以直接使用 MondaySunday 方法:

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,可以大大减少时间处理相关的代码量,提高开发效率。

回到顶部