first commit
This commit is contained in:
parent
0f49acf922
commit
43a5b637e3
2
.gitignore
vendored
2
.gitignore
vendored
@ -23,3 +23,5 @@ go.work.sum
|
||||
|
||||
# env file
|
||||
.env
|
||||
|
||||
example
|
||||
314
util.go
Normal file
314
util.go
Normal file
@ -0,0 +1,314 @@
|
||||
package moment
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
// =====================================================================================================================
|
||||
// 天
|
||||
|
||||
// StartOfDay 获取当天的开始时间
|
||||
func StartOfDay() time.Time {
|
||||
now := time.Now()
|
||||
return time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
|
||||
|
||||
// Truncate 方法会将时间戳截断到指定的精度,这里我们将时间戳截断到天的开始
|
||||
// now := time.Now()
|
||||
// return now.Truncate(24 * time.Hour)
|
||||
}
|
||||
|
||||
// StartOfDayStr 获取当天的开始时间
|
||||
// f 为可选参数,用于指定时间格式,默认为 time.DateTime
|
||||
func StartOfDayStr(f ...string) string {
|
||||
if len(f) > 0 {
|
||||
return StartOfDay().Format(f[0])
|
||||
}
|
||||
return StartOfDay().Format(time.DateTime)
|
||||
}
|
||||
|
||||
// EndOfDay 获取当天的结束时间
|
||||
func EndOfDay() time.Time {
|
||||
now := time.Now()
|
||||
return time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 59, 999999999, now.Location())
|
||||
}
|
||||
|
||||
// EndOfDayStr 获取当天的结束时间
|
||||
// f 为可选参数,用于指定时间格式,默认为 time.DateTime
|
||||
func EndOfDayStr(f ...string) string {
|
||||
if len(f) > 0 {
|
||||
return EndOfDay().Format(f[0])
|
||||
}
|
||||
return EndOfDay().Format(time.DateTime)
|
||||
}
|
||||
|
||||
// =====================================================================================================================
|
||||
// 周
|
||||
|
||||
// StartOfWeek 获取本周的开始时间
|
||||
func StartOfWeek() time.Time {
|
||||
now := time.Now()
|
||||
offset := int(time.Monday - now.Weekday())
|
||||
if offset > 0 {
|
||||
offset = -6
|
||||
}
|
||||
weekStart := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location()).AddDate(0, 0, offset)
|
||||
return weekStart
|
||||
}
|
||||
|
||||
// StartOfWeekStr 获取本周的开始时间
|
||||
// f 为可选参数,用于指定时间格式,默认为 time.DateTime
|
||||
func StartOfWeekStr(f ...string) string {
|
||||
if len(f) > 0 {
|
||||
return StartOfWeek().Format(f[0])
|
||||
}
|
||||
return StartOfWeek().Format(time.DateTime)
|
||||
}
|
||||
|
||||
// EndOfWeek 获取本周的结束时间
|
||||
func EndOfWeek() time.Time {
|
||||
now := time.Now()
|
||||
offset := int(time.Sunday - now.Weekday())
|
||||
if offset < 0 {
|
||||
offset = 6
|
||||
}
|
||||
weekEnd := time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 59, 999999999, now.Location()).AddDate(0, 0, offset)
|
||||
return weekEnd
|
||||
}
|
||||
|
||||
// EndOfWeekStr 获取本周的结束时间
|
||||
// f 为可选参数,用于指定时间格式,默认为 time.DateTime
|
||||
func EndOfWeekStr(f ...string) string {
|
||||
if len(f) > 0 {
|
||||
return EndOfWeek().Format(f[0])
|
||||
}
|
||||
return EndOfWeek().Format(time.DateTime)
|
||||
}
|
||||
|
||||
// IsWeekend 判断某一天是否为周末
|
||||
func IsWeekend(t time.Time) bool {
|
||||
weekday := t.Weekday()
|
||||
return weekday == time.Saturday || weekday == time.Sunday
|
||||
}
|
||||
|
||||
// IsWeekday 判断某一天是否为工作日
|
||||
func IsWeekday(t time.Time) bool {
|
||||
return !IsWeekend(t)
|
||||
}
|
||||
|
||||
// =====================================================================================================================
|
||||
// 月
|
||||
|
||||
// StartOfMonth 获取本月的开始时间
|
||||
func StartOfMonth() time.Time {
|
||||
now := time.Now()
|
||||
return time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location())
|
||||
}
|
||||
|
||||
// StartOfMonthStr 获取本月的开始时间
|
||||
// f 为可选参数,用于指定时间格式,默认为 time.DateTime
|
||||
func StartOfMonthStr(f ...string) string {
|
||||
if len(f) > 0 {
|
||||
return StartOfMonth().Format(f[0])
|
||||
}
|
||||
return StartOfMonth().Format(time.DateTime)
|
||||
}
|
||||
|
||||
// EndOfMonth 获取本月的结束时间
|
||||
func EndOfMonth() time.Time {
|
||||
now := time.Now()
|
||||
return time.Date(now.Year(), now.Month()+1, 0, 23, 59, 59, 999999999, now.Location())
|
||||
}
|
||||
|
||||
// EndOfMonthStr 获取本月的结束时间
|
||||
// f 为可选参数,用于指定时间格式,默认为 time.DateTime
|
||||
func EndOfMonthStr(f ...string) string {
|
||||
if len(f) > 0 {
|
||||
return EndOfMonth().Format(f[0])
|
||||
}
|
||||
return EndOfMonth().Format(time.DateTime)
|
||||
}
|
||||
|
||||
// IsFirstDayOfMonth 判断是否是每月的第一天
|
||||
func IsFirstDayOfMonth(t time.Time) bool {
|
||||
return t.Day() == 1
|
||||
}
|
||||
|
||||
// IsLastDayOfMonth 判断是否是每月的最后一天
|
||||
func IsLastDayOfMonth(t time.Time) bool {
|
||||
return t.Day() == t.AddDate(0, 1, 0).AddDate(0, 0, -1).Day()
|
||||
}
|
||||
|
||||
// =====================================================================================================================
|
||||
// 季
|
||||
|
||||
// StartOfQuarter 获取季度的开始日期
|
||||
func StartOfQuarter(t time.Time) time.Time {
|
||||
quarter := GetQuarter(t)
|
||||
startMonth := (quarter-1)*3 + 1
|
||||
return time.Date(t.Year(), time.Month(startMonth), 1, 0, 0, 0, 0, t.Location())
|
||||
}
|
||||
|
||||
// StartOfQuarterStr 获取季度的开始日期
|
||||
// f 为可选参数,用于指定时间格式,默认为 time.DateTime
|
||||
func StartOfQuarterStr(t time.Time, f ...string) string {
|
||||
if len(f) > 0 {
|
||||
return StartOfQuarter(t).Format(f[0])
|
||||
}
|
||||
return StartOfQuarter(t).Format(time.DateTime)
|
||||
}
|
||||
|
||||
// EndOfQuarter 获取季度的结束日期
|
||||
func EndOfQuarter(t time.Time) time.Time {
|
||||
quarter := GetQuarter(t)
|
||||
endMonth := quarter * 3
|
||||
nextYear := t.Year()
|
||||
if endMonth == 12 {
|
||||
endMonth = 1
|
||||
nextYear++
|
||||
}
|
||||
endDate := time.Date(nextYear, time.Month(endMonth), 1, 0, 0, 0, 0, t.Location()).AddDate(0, 0, -1)
|
||||
return time.Date(endDate.Year(), endDate.Month(), endDate.Day(), 23, 59, 59, 999999999, t.Location())
|
||||
}
|
||||
|
||||
// EndOfQuarterStr 获取季度的结束日期
|
||||
// f 为可选参数,用于指定时间格式,默认为 time.DateTime
|
||||
func EndOfQuarterStr(t time.Time, f ...string) string {
|
||||
if len(f) > 0 {
|
||||
return EndOfQuarter(t).Format(f[0])
|
||||
}
|
||||
return EndOfQuarter(t).Format(time.DateTime)
|
||||
}
|
||||
|
||||
// GetQuarter 获取指定日期所在的季度
|
||||
func GetQuarter(t time.Time) int {
|
||||
month := int(t.Month())
|
||||
return (month-1)/3 + 1
|
||||
}
|
||||
|
||||
// IsFirstDayOfQuarter 判断是否是季度的第一天
|
||||
func IsFirstDayOfQuarter(t time.Time) bool {
|
||||
return t.Day() == 1 && t.Month() == time.Month((GetQuarter(t)-1)*3+1)
|
||||
}
|
||||
|
||||
// IsLastDayOfQuarter 判断是否是季度的最后一天
|
||||
func IsLastDayOfQuarter(t time.Time) bool {
|
||||
return t.Day() == 30 && t.Month() == time.Month(GetQuarter(t)*3)
|
||||
}
|
||||
|
||||
// =====================================================================================================================
|
||||
// 年
|
||||
|
||||
// StartOfYear 获取今年的开始时间
|
||||
func StartOfYear() time.Time {
|
||||
now := time.Now()
|
||||
return time.Date(now.Year(), 1, 1, 0, 0, 0, 0, now.Location())
|
||||
}
|
||||
|
||||
// StartOfYearStr 获取今年的开始时间
|
||||
// f 为可选参数,用于指定时间格式,默认为 time.DateTime
|
||||
func StartOfYearStr(f ...string) string {
|
||||
if len(f) > 0 {
|
||||
return StartOfYear().Format(f[0])
|
||||
}
|
||||
return StartOfYear().Format(time.DateTime)
|
||||
}
|
||||
|
||||
// EndOfYear 获取今年的结束时间
|
||||
func EndOfYear() time.Time {
|
||||
now := time.Now()
|
||||
return time.Date(now.Year()+1, 1, 0, 23, 59, 59, 999999999, now.Location())
|
||||
}
|
||||
|
||||
// EndOfYearStr 获取今年的结束时间
|
||||
// f 为可选参数,用于指定时间格式,默认为 time.DateTime
|
||||
func EndOfYearStr(f ...string) string {
|
||||
if len(f) > 0 {
|
||||
return EndOfYear().Format(f[0])
|
||||
}
|
||||
return EndOfYear().Format(time.DateTime)
|
||||
}
|
||||
|
||||
// IsFirstDayOfYear 判断是否是今年的第一天
|
||||
func IsFirstDayOfYear(t time.Time) bool {
|
||||
return t.Day() == 1 && t.Month() == 1
|
||||
}
|
||||
|
||||
// IsLastDayOfYear 判断是否是今年的最后一天
|
||||
func IsLastDayOfYear(t time.Time) bool {
|
||||
return t.Day() == 31 && t.Month() == 12
|
||||
}
|
||||
|
||||
// IsLeapYear 判断是否为闰年
|
||||
// 闰年的判断规则为:
|
||||
// 1. 能被4整除但不能被100整除的年份是闰年。
|
||||
// 2. 能被400整除的年份也是闰年。
|
||||
// 3. 其他年份都不是闰年。
|
||||
// 例如:2000年是闰年,1900年不是闰年,2004年是闰年,2005年不是闰年。
|
||||
// 闰年的作用是为了调整公历的日期,使得每年的天数保持不变。
|
||||
// 闰年的平均年份长度为365.2425天,比平年多0.0078天。
|
||||
// 因此,闰年的影响是在每年的2月29日增加一天,使得2月的天数变为29天。
|
||||
// 平年的2月只有28天。
|
||||
// 闰年的影响是为了调整公历的日期,使得每年的天数保持不变。
|
||||
// 因此,闰年的影响是为了调整公历的日期,使得每年的天数保持不变。
|
||||
func IsLeapYear(year int) bool {
|
||||
return (year%4 == 0 && year%100 != 0) || (year%400 == 0)
|
||||
}
|
||||
|
||||
// =====================================================================================================================
|
||||
// Other
|
||||
|
||||
// IsSameDay 判断两个时间是否为同一天
|
||||
func IsSameDay(first, second time.Time) bool {
|
||||
return first.YearDay() == second.YearDay() && first.Year() == second.Year()
|
||||
}
|
||||
|
||||
// DiffInDays 计算两个时间之间的天数差
|
||||
func DiffInDays(start, end time.Time) int {
|
||||
return int(end.Sub(start).Hours() / 24)
|
||||
}
|
||||
|
||||
// ConvertTimeZone 时区转换
|
||||
func ConvertTimeZone(t time.Time, to *time.Location) time.Time {
|
||||
return t.In(to)
|
||||
}
|
||||
|
||||
// CurrentTimeInLocation 获取特定时区的当前时间
|
||||
func CurrentTimeInLocation(loc *time.Location) time.Time {
|
||||
return time.Now().In(loc)
|
||||
}
|
||||
|
||||
// TimeAgo 将时间转换为多久之前的形式
|
||||
func TimeAgo(t time.Time) string {
|
||||
now := time.Now()
|
||||
diff := now.Sub(t)
|
||||
|
||||
if diff < time.Minute {
|
||||
return "刚刚"
|
||||
} else if diff < time.Hour {
|
||||
return fmt.Sprintf("%d 分钟前", int(diff.Minutes()))
|
||||
} else if diff < 24*time.Hour {
|
||||
return fmt.Sprintf("%d 小时前", int(diff.Hours()))
|
||||
} else if diff < 30*24*time.Hour {
|
||||
return fmt.Sprintf("%d 天前", int(diff.Hours()/24))
|
||||
} else if diff < 365*24*time.Hour {
|
||||
return fmt.Sprintf("%d 个月前", int(diff.Hours()/24/30))
|
||||
}
|
||||
return fmt.Sprintf("%d 年前", int(diff.Hours()/24/365))
|
||||
}
|
||||
|
||||
// GetDatesInRange 获取指定时间段内的日期列表
|
||||
func GetDatesInRange(start, end time.Time) []time.Time {
|
||||
var dates []time.Time
|
||||
current := start
|
||||
for !current.After(end) {
|
||||
dates = append(dates, current)
|
||||
current = current.AddDate(0, 0, 1)
|
||||
}
|
||||
return dates
|
||||
}
|
||||
|
||||
// DayOfYear 计算指定日期是该年的第几天
|
||||
func DayOfYear(t time.Time) int {
|
||||
return t.YearDay()
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user