今月の最初と最後の日を取得しようとしています。月と日ではなく日と時間を追加できます。これは、次の月から1日を引いて今月の最後の日を取得することを考えていました。このようなもの:
package main
import (
"fmt"
"time"
)
func main() {
date := time.Now()
nextMonth := date.Add(time.Month)
LastDay := nextMonth.Add(-time.Hour * 24)
fmt.Println(LastDay)
}
あなたはnowライブラリを使用できます、それは本当に簡単です:
now.BeginningOfMonth() // 2013-11-01 00:00:00 Fri
now.EndOfMonth() // 2013-11-30 23:59:59.999999999 Sat
詳細はこちらをご覧ください: https://github.com/jinzhu/now
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)
}
@ Apinの答え は、nowlibがを作成するため、危険です。多くの間違った仮定(私も足に噛みつきました)。
現在の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)
import "time"
func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time
日付は、対応する時刻を返します
yyyy-mm-dd hh:mm:ss + nsec nanoseconds
指定された場所のその時間の適切なゾーンで。
月、日、時間、最小、秒、およびnsecの値は通常の範囲外である可能性があり、変換中に正規化されます。たとえば、10月32日は11月1日に変換されます。
夏時間への移行では、時間をスキップまたは繰り返します。たとえば、米国では、2011年3月13日午前2時15分は発生しませんでしたが、2011年11月6日午前1時15分は2回発生しました。そのような場合、時間帯の選択、したがって時間は明確に定義されていません。日付は、遷移に関係する2つのゾーンのいずれかで正しい時刻を返しますが、どちらを保証するものではありません。
Locがnilの場合、日付はパニックします。
通常の範囲外の月と日の値は正規化されます。たとえば、月の時間間隔の最初と最後の日には、
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
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())
}
_
次に、today := time.Now()
を使用して、次のような関数の1つ/両方に渡すことができます-eom := EndOfMonth(today)
は、適切な日付を取得します。
時間、DSTなどが重要な場合、日付を取得したら、その上に詳細を飾り付けるのは非常に簡単です。
最後に、ここで遊ぶことができる遊び場リンクがあります- https://play.golang.org/p/DxnGuqh6g4k
私はこのようにします:
// 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()
}
a
goutilsは多くの便利なfuncツールを提供します。 goutils
beginningOfTMonth:=time.TimeBeginningOfMonth(t)
endOfTMonth:=time.TimeEndOfMonth(t)
beginningOfTWeek:=time.TimeBeginningOfWeek(t)
endOfTWeek:=time.TimeEndOfWeek(t)