2021-02-18 14:32:31 +08:00
|
|
|
|
package carbon
|
|
|
|
|
|
2021-07-31 13:27:17 +08:00
|
|
|
|
import (
|
|
|
|
|
"strings"
|
|
|
|
|
)
|
2021-02-18 14:32:31 +08:00
|
|
|
|
|
2021-08-10 10:57:22 +08:00
|
|
|
|
// DiffInYears gets the difference in years.
|
2021-07-28 15:18:05 +08:00
|
|
|
|
// 相差多少年
|
2021-07-23 10:57:18 +08:00
|
|
|
|
func (c Carbon) DiffInYears(carbon ...Carbon) int64 {
|
2021-02-18 14:32:31 +08:00
|
|
|
|
end := c.Now()
|
2021-07-31 13:27:17 +08:00
|
|
|
|
if len(carbon) > 0 {
|
|
|
|
|
end = carbon[len(carbon)-1]
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
2021-04-05 16:30:48 +08:00
|
|
|
|
return c.DiffInMonths(end) / MonthsPerYear
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-08-10 10:57:22 +08:00
|
|
|
|
// DiffInYearsWithAbs gets the difference in years with absolute value.
|
2021-07-28 15:18:05 +08:00
|
|
|
|
// 相差多少年(绝对值)
|
2021-07-23 10:57:18 +08:00
|
|
|
|
func (c Carbon) DiffInYearsWithAbs(carbon ...Carbon) int64 {
|
2021-02-18 14:32:31 +08:00
|
|
|
|
end := c.Now()
|
2021-07-31 13:27:17 +08:00
|
|
|
|
if len(carbon) > 0 {
|
|
|
|
|
end = carbon[len(carbon)-1]
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
|
|
|
|
return getAbsValue(c.DiffInYears(end))
|
|
|
|
|
}
|
|
|
|
|
|
2021-08-10 10:57:22 +08:00
|
|
|
|
// DiffInMonths gets the difference in months.
|
2021-07-28 15:18:05 +08:00
|
|
|
|
// 相差多少月
|
2021-07-23 10:57:18 +08:00
|
|
|
|
func (c Carbon) DiffInMonths(carbon ...Carbon) int64 {
|
2021-02-18 14:32:31 +08:00
|
|
|
|
end := c.Now()
|
2021-07-31 13:27:17 +08:00
|
|
|
|
if len(carbon) > 0 {
|
|
|
|
|
end = carbon[len(carbon)-1]
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
|
|
|
|
dy, dm, dd := end.Year()-c.Year(), end.Month()-c.Month(), end.Day()-c.Day()
|
|
|
|
|
if dd < 0 {
|
|
|
|
|
dm = dm - 1
|
|
|
|
|
}
|
|
|
|
|
if dy == 0 && dm == 0 {
|
2021-08-10 10:57:22 +08:00
|
|
|
|
return int64(0)
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
|
|
|
|
if dy == 0 && dm != 0 && dd != 0 {
|
|
|
|
|
if int(end.DiffInHoursWithAbs(c)) < c.DaysInMonth()*HoursPerDay {
|
2021-08-10 10:57:22 +08:00
|
|
|
|
return int64(0)
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
|
|
|
|
return int64(dm)
|
|
|
|
|
}
|
|
|
|
|
return int64(dy*MonthsPerYear + dm)
|
|
|
|
|
}
|
|
|
|
|
|
2021-08-10 10:57:22 +08:00
|
|
|
|
// DiffInMonthsWithAbs gets the difference in months with absolute value.
|
2021-07-28 15:18:05 +08:00
|
|
|
|
// 相差多少月(绝对值)
|
2021-07-23 10:57:18 +08:00
|
|
|
|
func (c Carbon) DiffInMonthsWithAbs(carbon ...Carbon) int64 {
|
2021-02-18 14:32:31 +08:00
|
|
|
|
end := c.Now()
|
2021-07-31 13:27:17 +08:00
|
|
|
|
if len(carbon) > 0 {
|
|
|
|
|
end = carbon[len(carbon)-1]
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
|
|
|
|
return getAbsValue(c.DiffInMonths(end))
|
|
|
|
|
}
|
|
|
|
|
|
2021-08-10 10:57:22 +08:00
|
|
|
|
// DiffInWeeks gets the difference in weeks.
|
2021-07-28 15:18:05 +08:00
|
|
|
|
// 相差多少周
|
2021-07-23 10:57:18 +08:00
|
|
|
|
func (c Carbon) DiffInWeeks(carbon ...Carbon) int64 {
|
2021-02-18 14:32:31 +08:00
|
|
|
|
end := c.Now()
|
2021-07-31 13:27:17 +08:00
|
|
|
|
if len(carbon) > 0 {
|
|
|
|
|
end = carbon[len(carbon)-1]
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
|
|
|
|
return c.DiffInDays(end) / DaysPerWeek
|
|
|
|
|
}
|
|
|
|
|
|
2021-08-10 10:57:22 +08:00
|
|
|
|
// DiffInWeeksWithAbs gets the difference in weeks with absolute value.
|
2021-07-28 15:18:05 +08:00
|
|
|
|
// 相差多少周(绝对值)
|
2021-07-23 10:57:18 +08:00
|
|
|
|
func (c Carbon) DiffInWeeksWithAbs(carbon ...Carbon) int64 {
|
2021-02-18 14:32:31 +08:00
|
|
|
|
end := c.Now()
|
2021-07-31 13:27:17 +08:00
|
|
|
|
if len(carbon) > 0 {
|
|
|
|
|
end = carbon[len(carbon)-1]
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
|
|
|
|
return getAbsValue(c.DiffInWeeks(end))
|
|
|
|
|
}
|
|
|
|
|
|
2021-08-10 10:57:22 +08:00
|
|
|
|
// DiffInDays gets the difference in days.
|
2021-07-28 15:18:05 +08:00
|
|
|
|
// 相差多少天
|
2021-07-23 10:57:18 +08:00
|
|
|
|
func (c Carbon) DiffInDays(carbon ...Carbon) int64 {
|
2021-02-18 14:32:31 +08:00
|
|
|
|
end := c.Now()
|
2021-07-31 13:27:17 +08:00
|
|
|
|
if len(carbon) > 0 {
|
|
|
|
|
end = carbon[len(carbon)-1]
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
|
|
|
|
return c.DiffInSeconds(end) / SecondsPerDay
|
|
|
|
|
}
|
|
|
|
|
|
2021-08-10 10:57:22 +08:00
|
|
|
|
// DiffInDaysWithAbs gets the difference in days with absolute value.
|
2021-07-28 15:18:05 +08:00
|
|
|
|
// 相差多少天(绝对值)
|
2021-07-23 10:57:18 +08:00
|
|
|
|
func (c Carbon) DiffInDaysWithAbs(carbon ...Carbon) int64 {
|
2021-02-18 14:32:31 +08:00
|
|
|
|
end := c.Now()
|
2021-07-31 13:27:17 +08:00
|
|
|
|
if len(carbon) > 0 {
|
|
|
|
|
end = carbon[len(carbon)-1]
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
|
|
|
|
return getAbsValue(c.DiffInDays(end))
|
|
|
|
|
}
|
|
|
|
|
|
2021-08-10 10:57:22 +08:00
|
|
|
|
// DiffInHours gets the difference in hours.
|
2021-07-28 15:18:05 +08:00
|
|
|
|
// 相差多少小时
|
2021-07-23 10:57:18 +08:00
|
|
|
|
func (c Carbon) DiffInHours(carbon ...Carbon) int64 {
|
2021-02-18 14:32:31 +08:00
|
|
|
|
end := c.Now()
|
2021-07-31 13:27:17 +08:00
|
|
|
|
if len(carbon) > 0 {
|
|
|
|
|
end = carbon[len(carbon)-1]
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
|
|
|
|
return c.DiffInSeconds(end) / SecondsPerHour
|
|
|
|
|
}
|
|
|
|
|
|
2021-08-10 10:57:22 +08:00
|
|
|
|
// DiffInHoursWithAbs gets the difference in hours with absolute value.
|
2021-07-28 15:18:05 +08:00
|
|
|
|
// 相差多少小时(绝对值)
|
2021-07-23 10:57:18 +08:00
|
|
|
|
func (c Carbon) DiffInHoursWithAbs(carbon ...Carbon) int64 {
|
2021-02-18 14:32:31 +08:00
|
|
|
|
end := c.Now()
|
2021-07-31 13:27:17 +08:00
|
|
|
|
if len(carbon) > 0 {
|
|
|
|
|
end = carbon[len(carbon)-1]
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
|
|
|
|
return getAbsValue(c.DiffInHours(end))
|
|
|
|
|
}
|
|
|
|
|
|
2021-08-10 10:57:22 +08:00
|
|
|
|
// DiffInMinutes gets the difference in minutes.
|
2021-07-28 15:18:05 +08:00
|
|
|
|
// 相差多少分钟
|
2021-07-23 10:57:18 +08:00
|
|
|
|
func (c Carbon) DiffInMinutes(carbon ...Carbon) int64 {
|
2021-02-18 14:32:31 +08:00
|
|
|
|
end := c.Now()
|
2021-07-31 13:27:17 +08:00
|
|
|
|
if len(carbon) > 0 {
|
|
|
|
|
end = carbon[len(carbon)-1]
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
|
|
|
|
return c.DiffInSeconds(end) / SecondsPerMinute
|
|
|
|
|
}
|
|
|
|
|
|
2021-08-10 10:57:22 +08:00
|
|
|
|
// DiffInMinutesWithAbs gets the difference in minutes with absolute value.
|
2021-07-28 15:18:05 +08:00
|
|
|
|
// 相差多少分钟(绝对值)
|
2021-07-23 10:57:18 +08:00
|
|
|
|
func (c Carbon) DiffInMinutesWithAbs(carbon ...Carbon) int64 {
|
2021-02-18 14:32:31 +08:00
|
|
|
|
end := c.Now()
|
2021-07-31 13:27:17 +08:00
|
|
|
|
if len(carbon) > 0 {
|
|
|
|
|
end = carbon[len(carbon)-1]
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
|
|
|
|
return getAbsValue(c.DiffInMinutes(end))
|
|
|
|
|
}
|
|
|
|
|
|
2021-08-10 10:57:22 +08:00
|
|
|
|
// DiffInSeconds gets the difference in seconds.
|
2021-07-28 15:18:05 +08:00
|
|
|
|
// 相差多少秒
|
2021-07-23 10:57:18 +08:00
|
|
|
|
func (c Carbon) DiffInSeconds(carbon ...Carbon) int64 {
|
2021-02-18 14:32:31 +08:00
|
|
|
|
end := c.Now()
|
2021-07-31 13:27:17 +08:00
|
|
|
|
if len(carbon) > 0 {
|
|
|
|
|
end = carbon[len(carbon)-1]
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
|
|
|
|
return end.ToTimestamp() - c.ToTimestamp()
|
|
|
|
|
}
|
|
|
|
|
|
2021-08-10 10:57:22 +08:00
|
|
|
|
// DiffInSecondsWithAbs gets the difference in seconds with absolute value.
|
2021-07-28 15:18:05 +08:00
|
|
|
|
// 相差多少秒(绝对值)
|
2021-07-23 10:57:18 +08:00
|
|
|
|
func (c Carbon) DiffInSecondsWithAbs(carbon ...Carbon) int64 {
|
2021-02-18 14:32:31 +08:00
|
|
|
|
end := c.Now()
|
2021-07-31 13:27:17 +08:00
|
|
|
|
if len(carbon) > 0 {
|
|
|
|
|
end = carbon[len(carbon)-1]
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
|
|
|
|
return getAbsValue(c.DiffInSeconds(end))
|
|
|
|
|
}
|
|
|
|
|
|
2021-08-10 10:57:22 +08:00
|
|
|
|
// DiffForHumans gets the difference in a human readable format, i18n is supported.
|
2021-07-28 15:18:05 +08:00
|
|
|
|
// 获取对人类友好的可读格式时间差,支持i18n
|
2021-07-23 10:57:18 +08:00
|
|
|
|
func (c Carbon) DiffForHumans(carbon ...Carbon) string {
|
2021-02-18 14:32:31 +08:00
|
|
|
|
end := c.Now()
|
2021-07-31 13:27:17 +08:00
|
|
|
|
if len(carbon) > 0 {
|
|
|
|
|
end = carbon[len(carbon)-1]
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
2021-07-23 10:57:18 +08:00
|
|
|
|
unit, diff := "", int64(0)
|
2021-02-18 14:32:31 +08:00
|
|
|
|
switch true {
|
|
|
|
|
case c.DiffInYearsWithAbs(end) > 0:
|
|
|
|
|
unit = "year"
|
|
|
|
|
diff = c.DiffInYearsWithAbs(end)
|
|
|
|
|
break
|
|
|
|
|
case c.DiffInMonthsWithAbs(end) > 0:
|
|
|
|
|
unit = "month"
|
|
|
|
|
diff = c.DiffInMonthsWithAbs(end)
|
|
|
|
|
break
|
|
|
|
|
case c.DiffInWeeksWithAbs(end) > 0:
|
|
|
|
|
unit = "week"
|
|
|
|
|
diff = c.DiffInWeeksWithAbs(end)
|
|
|
|
|
break
|
|
|
|
|
case c.DiffInDaysWithAbs(end) > 0:
|
|
|
|
|
unit = "day"
|
|
|
|
|
diff = c.DiffInDaysWithAbs(end)
|
|
|
|
|
break
|
|
|
|
|
case c.DiffInHoursWithAbs(end) > 0:
|
|
|
|
|
unit = "hour"
|
|
|
|
|
diff = c.DiffInHoursWithAbs(end)
|
|
|
|
|
break
|
|
|
|
|
case c.DiffInMinutesWithAbs(end) > 0:
|
|
|
|
|
unit = "minute"
|
|
|
|
|
diff = c.DiffInMinutesWithAbs(end)
|
|
|
|
|
case c.DiffInSecondsWithAbs(end) > 0:
|
|
|
|
|
unit = "second"
|
|
|
|
|
diff = c.DiffInSecondsWithAbs(end)
|
|
|
|
|
case c.DiffInSecondsWithAbs(end) == 0:
|
|
|
|
|
unit = "now"
|
|
|
|
|
diff = 0
|
2021-08-16 09:29:07 +08:00
|
|
|
|
return c.lang.translate(unit, diff)
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
2021-08-16 09:29:07 +08:00
|
|
|
|
translation := c.lang.translate(unit, diff)
|
2021-07-23 10:57:18 +08:00
|
|
|
|
if c.Lt(end) && len(carbon) == 0 {
|
2021-08-16 09:29:07 +08:00
|
|
|
|
return strings.Replace(c.lang.resources["ago"], "%s", translation, 1)
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
2021-07-31 13:27:17 +08:00
|
|
|
|
if c.Lt(end) && len(carbon) > 0 {
|
2021-08-16 09:29:07 +08:00
|
|
|
|
return strings.Replace(c.lang.resources["before"], "%s", translation, 1)
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
2021-07-23 10:57:18 +08:00
|
|
|
|
if c.Gt(end) && len(carbon) == 0 {
|
2021-08-16 09:29:07 +08:00
|
|
|
|
return strings.Replace(c.lang.resources["from_now"], "%s", translation, 1)
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|
2021-08-16 09:29:07 +08:00
|
|
|
|
return strings.Replace(c.lang.resources["after"], "%s", translation, 1)
|
2021-02-18 14:32:31 +08:00
|
|
|
|
}
|