Golang中如何计算日期剩余天数
Golang中如何计算日期剩余天数 我有一个日期字符串。它可能是过去的日期、未来的日期或当前日期。我想将其与当前时间进行比较。 假设当前日期是2021-06-17,而日期字符串是2021-06-15 那么它应该返回-2,如果日期已过,则应以负数返回。 假设当前日期是2021-06-17,而日期字符串是2021-06-19 那么它应该返回2。 我希望你理解了。 实际上我想做的是:
if daysleft <= 3 {
}
我有我的代码,但它不能完美工作,例如如果日期已过,它也会返回一个正整数。比如当前日期是2021-06-17,日期字符串是2021-06-19,那么它会返回2;而如果日期字符串是2021-06-15,它也会返回2,但它应该返回-2。
这是我的代码:
package main
import (
"fmt"
"time"
)
func main() {
days := daysBetween(time.Now(), date("2021-06-02"))
fmt.Printf("%d\n", days)
t, _ := time.Parse("2006-01-02", "2021-06-02")
if days <= 3 {
fmt.Printf("%s", t.AddDate(0, 0, 5))
}
}
func date(s string) time.Time {
d, _ := time.Parse("2006-01-02", s)
return d
}
func daysBetween(a, b time.Time) int {
if a.After(b) {
a, b = b, a
}
days := -a.YearDay()
for year := a.Year(); year < b.Year(); year++ {
days += time.Date(year, time.December, 31, 0, 0, 0, 0, time.UTC).YearDay()
}
days += b.YearDay()
return days
}
有人能提供一个解决方案吗?
更多关于Golang中如何计算日期剩余天数的实战教程也可以访问 https://www.itying.com/category-94-b0.html
实际上,我们有两个文件。 expire.txt back.txt
我们的程序将从 expire.txt 文件中读取一个过期日期,然后将其与当前时间进行比较。如果距离过期还剩 3 天或更少,程序将从过期日期中减去 5 天,并将结果存储在 back.txt 中。
我希望你理解了,请帮我解决这个问题。
更多关于Golang中如何计算日期剩余天数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
可能是这样的
package main
import (
"fmt"
"time"
)
func daysBetween(a, b time.Time) int {
fmt.Printf("a=%d-%d-%d b=%d-%d-%d\n", a.Year(), int(a.Month()), a.Day(), b.Year(), int(b.Month()), b.Day())
days := a.Sub(b).Hours() / 24
if days < 0 {
days *= -1
}
return int(days)
}
func main() {
dt := time.Now()
t1 := Date(dt.Year(), int(dt.Month()), dt.Day())
t2 := Date(2009, 11, 9)
days := daysBetween(t1, t2)
fmt.Println(days)
}
func Date(year, month, day int) time.Time {
return time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.UTC)
}
要计算日期剩余天数并正确返回正负数,可以使用time.Sub()方法计算时间差,然后转换为天数。以下是修正后的代码:
package main
import (
"fmt"
"time"
)
func main() {
// 测试用例
fmt.Printf("未来日期: %d\n", daysLeft("2021-06-19")) // 应返回 2
fmt.Printf("过去日期: %d\n", daysLeft("2021-06-15")) // 应返回 -2
fmt.Printf("当天日期: %d\n", daysLeft("2021-06-17")) // 应返回 0
// 使用示例
days := daysLeft("2021-06-19")
if days <= 3 {
fmt.Printf("距离目标日期还有/已过 %d 天\n", days)
}
}
func daysLeft(dateStr string) int {
// 解析目标日期
target, err := time.Parse("2006-01-02", dateStr)
if err != nil {
return 0
}
// 获取当前日期(去除时间部分)
now := time.Now()
current := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
// 计算天数差
diff := target.Sub(current)
days := int(diff.Hours() / 24)
return days
}
更简洁的版本,直接使用Truncate()方法:
func daysLeft(dateStr string) int {
target, err := time.Parse("2006-01-02", dateStr)
if err != nil {
return 0
}
// 将当前时间截断到天
now := time.Now().Truncate(24 * time.Hour)
target = target.Truncate(24 * time.Hour)
// 计算天数差
diff := target.Sub(now)
return int(diff.Hours() / 24)
}
处理时区问题的版本:
func daysLeft(dateStr string) int {
// 使用UTC时区解析日期
target, err := time.Parse("2006-01-02", dateStr)
if err != nil {
return 0
}
// 获取当前UTC日期
now := time.Now().UTC()
current := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC)
target = time.Date(target.Year(), target.Month(), target.Day(), 0, 0, 0, 0, time.UTC)
// 计算天数差
days := int(target.Sub(current).Hours() / 24)
return days
}
测试输出:
func main() {
// 设置当前时间为2021-06-17进行测试
testDate := "2021-06-17"
fmt.Printf("当前日期设为: %s\n", testDate)
tests := []string{"2021-06-15", "2021-06-17", "2021-06-19"}
for _, d := range tests {
fmt.Printf("目标日期 %s: %d 天\n", d, daysLeftWithFixedDate(d, testDate))
}
}
func daysLeftWithFixedDate(dateStr, currentStr string) int {
target, _ := time.Parse("2006-01-02", dateStr)
current, _ := time.Parse("2006-01-02", currentStr)
target = time.Date(target.Year(), target.Month(), target.Day(), 0, 0, 0, 0, time.UTC)
current = time.Date(current.Year(), current.Month(), current.Day(), 0, 0, 0, 0, time.UTC)
return int(target.Sub(current).Hours() / 24)
}
输出结果:
当前日期设为: 2021-06-17
目标日期 2021-06-15: -2 天
目标日期 2021-06-17: 0 天
目标日期 2021-06-19: 2 天

