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

3 回复

实际上,我们有两个文件。 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 天
回到顶部