获取Go/Golang当月的第一天和最后一天?

vin*_*iyo 19 time date go

我想要获得当月的第一天和最后一天.您可以添加日期和小时但不是月份,我想从下个月减去一天以获得本月的最后一天.像这样的东西:

package main

import (
    "fmt"
    "time"
)

func main() {

    date := time.Now()
    nextMonth := date.Add(time.Month)
    LastDay := nextMonth.Add(-time.Hour * 24)

    fmt.Println(LastDay)

}
Run Code Online (Sandbox Code Playgroud)

Ami*_*pta 29

time.Month是一种类型,而不是一种价值,所以你不能Add这样.此外,你的逻辑是错误的,因为如果你添加一个月并减去一天,你没有到月底,你会在下个月中旬得到一些东西.如果今天是4月24日,你将获得5月23日.

以下代码将执行您正在寻找的内容:

package main

import (
    "time"
    "fmt"
)

func main() {
    now := time.Now()
    currentYear, currentMonth, _ := now.Date()
    currentLocation := now.Location()

    firstOfMonth := time.Date(currentYear, currentMonth, 1, 0, 0, 0, 0, currentLocation)
    lastOfMonth := firstOfMonth.AddDate(0, 1, -1)

    fmt.Println(firstOfMonth)
    fmt.Println(lastOfMonth)
}
Run Code Online (Sandbox Code Playgroud)

游乐场链接


Shr*_*yas 16

不确定何时AddDate(...)添加到time.Time,但很可能是在这个问题出现黄金时间之后添加的 :)

这是实现相同目标的另一种方法time.Time.AddDate(...)-

func BeginningOfMonth(date time.Time)  (time.Time) {
    return date.AddDate(0, 0, -date.Day() + 1)
}

func EndOfMonth(date time.Time) (time.Time) {
    return date.AddDate(0, 1, -date.Day())
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用today := time.Now()它并将其传递给这样的一个/两个函数 -eom := EndOfMonth(today)以获得适当的日期。

如果时间、夏令时等很重要,那么在获得日期后在上面装饰这些细节应该非常简单。

最后,这是一个游乐场链接,您可以在其中玩耍 - https://play.golang.org/p/DxnGuqh6g4k


gab*_*abs 13

@阿平的回答是危险的,因为现在的lib使得许多错误的假设(它咬了我的脚太).
现在的lib不考虑夏令时和许多其他事情:https: //github.com/jinzhu/now/issues/13

这就是我这样做的方式:

t := time.Now()
firstday := time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, time.Local)
lastday := firstday.AddDate(0, 1, 0).Add(time.Nanosecond * -1)
Run Code Online (Sandbox Code Playgroud)

  • 我为你添加了一个BUG ALERT评论[@ Apin的答案](/sf/answers/2578129151/). (3认同)

Api*_*pin 9

现在可以使用库,它非常简单:

now.BeginningOfMonth()    // 2013-11-01 00:00:00 Fri
now.EndOfMonth()          // 2013-11-30 23:59:59.999999999 Sat
Run Code Online (Sandbox Code Playgroud)

请查看详细信息:https://github.com/jinzhu/now

  • @peterSO修正了,抱歉这个问题. (6认同)
  • 错误提示:[夏令时](https://github.com/jinzhu/now)在夏令时过渡期间未给出正确的结果。它错误地假设一天中始终有24小时:`func(现在为* Now)BeginningOfMonth()time.Time`:`* 24 * time.Hour`。 (2认同)

Ric*_*nop 5

I would do it like this:

// LastDayOfMonth returns 28-31 - the last day in the month of the time object
// passed in to the function
func LastDayOfMonth(t time.Time) int {
    firstDay := time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, time.UTC)
    lastDay := firstDay.AddDate(0, 1, 0).Add(-time.Nanosecond)
    return lastDay.Day()
}
Run Code Online (Sandbox Code Playgroud)

a


小智 5

这也可以是一个解决方案:

currentTimestamp := time.Now().UTC()
currentYear, currentMonth, _ := currentTimestamp.Date()
currentLocation := currentTimestamp.Location()

firstOfMonth := time.Date(currentYear, currentMonth, 1, 0, 0, 0, 0, currentLocation)
lastOfMonth := time.Date(currentYear, currentMonth+1, 0, 23, 59, 59, 999999999, currentLocation)

fmt.Println(firstOfMonth)
fmt.Println(lastOfMonth)
Run Code Online (Sandbox Code Playgroud)

输出:

firstOfMonth: 2019-11-01 00:00:00 +0000 UTC
lastOfMonth: 2019-11-30 23:59:59.999999999 +0000 UTC
Run Code Online (Sandbox Code Playgroud)

单击此处尝试一下: Playground 链接