Получите первый и последний день текущего месяца в Go/Golang?
Я пытаюсь получить первый и последний день текущего месяца. Вы можете добавить дни и часы, но не месяц, который я думал о вычитании в один день из следующего месяца, чтобы получить последний день этого месяца. Что-то вроде этого:
package main
import (
"fmt"
"time"
)
func main() {
date := time.Now()
nextMonth := date.Add(time.Month)
LastDay := nextMonth.Add(-time.Hour * 24)
fmt.Println(LastDay)
}
Ответы
Ответ 1
Теперь вы можете использовать библиотеку, это действительно просто:
now.BeginningOfMonth() // 2013-11-01 00:00:00 Fri
now.EndOfMonth() // 2013-11-30 23:59:59.999999999 Sat
Пожалуйста, посмотрите здесь для получения подробной информации: https://github.com/jinzhu/now
Ответ 2
time.Month
- это тип, а не значение, поэтому вы не можете Add
его. Кроме того, ваша логика неверна, потому что если вы добавите месяц и вычтите день, вы не получите конца месяца, вы получите что-то в середине следующего месяца. Если сегодня 24 апреля, вы получите 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)
}
ссылка на игровое поле
Ответ 3
Ответ @Apin опасен, потому что теперь 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)
Ответ 4
Время пакета
import "time"
func Date
func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time
Дата возвращает время, соответствующее
yyyy-mm-dd hh:mm:ss + nsec nanoseconds
в соответствующей зоне за это время в данном месте.
Значения месяц, день, час, мин, сек и nsec могут быть вне их обычные диапазоны и будут нормализованы во время преобразования. Для Например, 32 октября конвертируется в 1 ноября.
Переход на летнее время пропускает или повторяет время. Для например, в Соединенных Штатах, 13 марта 2011 г. 2:15 никогда не происходило, в то время как 6 ноября 2011 года 1:15 утра произошло дважды. В таких случаях выбор часового пояса и, следовательно, время, не определено. Дата возвращает правильное время в одной из двух зон, участвующих в переход, но он не гарантирует, что.
Дата паники, если loc равен нулю.
Значения месяца и дня вне их обычных диапазонов будут нормализованы. Например, для первого и последнего дня интервала времени месяца,
package main
import (
"fmt"
"os"
"time"
)
func monthInterval(t time.Time) (firstDay, lastDay time.Time) {
y, m, _ := t.Date()
loc := t.Location()
firstDay = time.Date(y, m, 1, 0, 0, 0, 0, loc)
lastDay = time.Date(y, m+1, 1, 0, 0, 0, -1, loc)
return firstDay, lastDay
}
func main() {
t := time.Now()
fmt.Println(t.Round(0))
first, last := monthInterval(t)
fmt.Println(first)
fmt.Println(last)
dstLoc, err := time.LoadLocation("America/Los_Angeles")
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
// Sunday, March 12, 2017, 2:00:00 am to Sunday, March 12, 2017, 3:00:00 am
dstStart := time.Date(2017, 03, 12, 2+1, 0, 0, 0, dstLoc)
// Sunday, November 5, 2017, 2:00:00 am to Sunday, November 5, 2017, 1:00:00 am
dstEnd := time.Date(2017, 11, 5, 2-1, 0, 0, 0, dstLoc)
t = dstStart
fmt.Println()
fmt.Println(t)
first, last = monthInterval(t)
fmt.Println(first)
fmt.Println(last)
t = dstEnd.Add(time.Hour)
fmt.Println()
fmt.Println(t)
first, last = monthInterval(t)
fmt.Println(first)
fmt.Println(last)
}
Вывод:
2017-10-27 05:45:08.197312082 -0400 EDT
2017-10-01 00:00:00 -0400 EDT
2017-10-31 23:59:59.999999999 -0400 EDT
2017-03-12 03:00:00 -0700 PDT
2017-03-01 00:00:00 -0800 PST
2017-03-31 23:59:59.999999999 -0700 PDT
2017-11-05 01:00:00 -0800 PST
2017-11-01 00:00:00 -0700 PDT
2017-11-30 23:59:59.999999999 -0800 PST
Ответ 5
Не уверен, когда AddDate(...)
был добавлен к time.Time
, но вполне возможно, что он был добавлен после того, как у этого вопроса было 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())
}
Тогда вы могли бы использовать today := time.Now()
и передать его одной/обеим функциям, например, так - eom := EndOfMonth(today)
чтобы получить соответствующую дату.
Если время, летнее время и тому подобное важны, должно быть довольно просто украсить эти детали сверху, как только вы получите дату.
Наконец, вот ссылка на игровую площадку, где вы можете поиграть с ней - https://play.golang.org/p/DxnGuqh6g4k
Ответ 6
Goutils предоставляет много полезных инструментов func. goutils
beginningOfTMonth:=time.TimeBeginningOfMonth(t)
endOfTMonth:=time.TimeEndOfMonth(t)
beginningOfTWeek:=time.TimeBeginningOfWeek(t)
endOfTWeek:=time.TimeEndOfWeek(t)
Ответ 7
Я бы сделал это следующим образом:
// 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()
}
а