【问题标题】:Calculate number of days between two dates?计算两个日期之间的天数?
【发布时间】:2015-02-26 01:53:04
【问题描述】:

如何计算两个日期之间的天数?在下面的代码中,我应该得到小时数,这意味着我只需要除以 24。但是,我得到的结果类似于 -44929.000000。我只看了一两天,所以我预计是 24 或 48 小时。

package main

import (
    "fmt"
    "time"
)

func main() {
    timeFormat := "2006-01-02"

    t, _ := time.Parse(timeFormat, "2014-12-28")
    fmt.Println(t)
    //  duration := time.Since(t)
    duration := time.Now().Sub(t)
    fmt.Printf("%f", duration.Hours())
}

这是可执行的 Go 代码:http://play.golang.org/p/1MV6wnLVKh

【问题讨论】:

    标签: time go


    【解决方案1】:

    程序员节快乐

    package main
    
    import (
        "fmt"
        "time"
    )    
    
    func main() {
        loc, _ := time.LoadLocation("UTC")
        now  := time.Now().In(loc)
        firstDate := time.Date(now.Year(), 1, 1, 0, 0, 0, 0, loc)
        diff := now.Sub(firstDate)
        
        fmt.Printf("The difference between %s and today %s es %d days\n", now.String(), firstDate.String(),  int(diff.Hours()/24)+1)
    
    
        // Just a joke
        if ( int(diff.Hours()/24)+1 == 256 ) {
            fmt.Printf("¡Happy programmer's day!") 
        } else {
            fmt.Printf("On my computer it works...!?") 
        }
    }
    

    【讨论】:

      【解决方案2】:

      在使用timeOne.Sub(timeTwo).Hours() / 24 的这种技术时要注意的一点是,夏令时可能会导致一天只包含 23 小时,这会稍微偏离这个计算。

      【讨论】:

        【解决方案3】:

        下面的代码给出了所有天的列表以及从开始日期到日期之间的天数: 您可以单击链接中的代码 去游乐场:https://play.golang.org/p/MBThBpTqjdz

        to := time.Now()
        from := to.AddDate(0, -1, 0)
        fmt.Println("toDate", to)
        fmt.Println("fromDate", from)
        days := to.Sub(from) / (24 * time.Hour)
        fmt.Println("days", int(days))
        noofdays := int(days)
        
        for i := 0; i <= noofdays; i++ {
            fmt.Println(from.AddDate(0, 0, i))
        }
        

        【讨论】:

          【解决方案4】:
          package main
          
          import (
              "fmt"
              "time"
          )
          
          func main() {
          
              date := time.Now()
              fmt.Println(date)
          
              format := "2006-01-02 15:04:05"
              then,_ := time.Parse(format, "2007-09-18 11:58:06")
              fmt.Println(then)
          
              diff := date.Sub(then)
          
              //func Since(t Time) Duration
              //Since returns the time elapsed since t. 
              //It is shorthand for time.Now().Sub(t).
          
              fmt.Println(diff.Hours())// number of Hours
              fmt.Println(diff.Nanoseconds())// number of Nanoseconds
              fmt.Println(diff.Minutes())// number of Minutes
              fmt.Println(diff.Seconds())// number of Seconds
          
              fmt.Println(int(diff.Hours()/24))// number of days    
          
          }
          

          这里是运行代码https://play.golang.org/p/Vbhh1cBKnh

          【讨论】:

            【解决方案5】:

            您的程序似乎按预期工作。我得到 45.55 小时。您是否尝试过在本地运行它?

            游乐场时间是固定的,time.Now() 将始终为您提供 2009-11-10 23:00:00 +0000 UTC。

            【讨论】:

            • 哎哟。我以前就知道。我有一段时间没有使用 Go 了。谢谢。
            • 当夏令时更改发生时,这仍然会给出错误的结果。 Duration 仅将两个瞬间之间经过的时间表示为 int64 纳秒计数。它不能直接用于计算一年两次没有错误的天数。叹息。
            • @Rick-777 你有解决你提到的问题的方法吗?
            • 是的,我在 github.com/rickb777/date(从 fxtlabs 派生)工作,其中包括一个 Sub 方法。它使用time api,但在减去它们之前更难确定两个时间点的日期。
            • int64(math.Ceil(duration.Hours() / 24)) 是我用来查找两个日期之间的天数,其中duration 是两个日期之间的差异。
            猜你喜欢
            • 1970-01-01
            • 2019-09-27
            • 1970-01-01
            • 2011-11-08
            • 2017-07-22
            相关资源
            最近更新 更多