Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
17
Help us understand the problem. What is going on with this article?
@umisama

time.Timeから日付だけを取り出す

More than 5 years have passed since last update.

現在時刻から日付だけを取り出す(今日の0:00)を作りたい時の話です。

Truncate()を使う

Time型にはTruncateメソッドが用意されていて、指定した大きさ以下の時刻を切り捨ててくれます。

func (t Time) Truncate(d Duration) Time
Truncate returns the result of rounding t down to a multiple of d (since the zero time). If d <= 0, Truncate returns t unchanged.

これに1日(24時間)を指定すれば簡単に日付を取り出せる気がします。

truncate1.go
package main

import (
        "time"
)

func main() {
        t, _ := time.Parse( time.ANSIC, "Fri Feb 7 13:58:00 2014" )
        println(t.Truncate( 24 * time.Hour ).Format(time.ANSIC))
}
output(truncate1.go)
Fri Feb  7 00:00:00 2014

上手く行っているように見えますが、これはあまりおすすめしません。なぜなら、

truncate2.go
package main

import (
        "time"
)

func main() {
        t := time.Now()
        println(t.Truncate( 24 * time.Hour ).Format(time.ANSIC))
}
output(truncate1.go)
Fri Feb  7 09:00:00 2014

こんな感じでタイムゾーンがUTCで無い時は時差分が残ってしまうからです。(Now()はLocationとして"Local"、Linuxの場合は/etc/localtimeを持ちます。Parse()はUTCになります。)
他のメソッドと違い、Truncateはタイムゾーンを考慮してくれないんですね。これは実装のdiv()あたりを読むとそんな感じになっていることがわかります。

Add()を併用する

そんな訳で、こんな感じにしないと上手く行きません。

truncate3.go
package main

import (
        "time"
)

func main() {
        t := time.Now()
        t = t.Truncate( time.Hour ).Add( - time.Duration(t.Hour()) * time.Hour )
        println(t.Format(time.ANSIC))
}

Hourはタイムゾーンを意識した値が帰るので、これを併用すれば意図通りに時刻を切り捨てることが出来ます。

Timeはタイムゾーンとあわせて抽象化したオブジェクトだと理解しているので、出来ればTruncateもUNIXタイムで単純に計算するのではなくてタイムゾーンを意識して動いて欲しい気もします。個人的には。

17
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
umisama
元イケメン高専生、今は現役イケメンエンジニア。 現実と鏡を直視しない事に定評がある。
fe2o3
ソフトウェア開発、教育、情報セキュリティ事業を通して、人とコンピュータのよい関係をつくる企業です。CTF大会開催のトータルソリューション「CTFKit」といった自社開発や、スタートアップに特化した受託開発など事業展開しています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
17
Help us understand the problem. What is going on with this article?