2017-07-11 16 views
3

私はこのような2つの日付があります。時間を無視して日付のみを比較したいと思います。現在、私はこれを持っている:時間を考慮しないで2つの日付を比較する

package main 

import (
    "time" 
    //"fmt" 
) 

func main() { 
    a, _ := time.Parse(time.RFC3339, "2017-02-01T12:00:00+00:00") 
    b, _ := time.Parse(time.RFC3339, "2017-02-11T14:30:00+00:00") 

    x := b.Sub(a) 

    println(int(x.Hours())) 
} 

242を印刷し、どの。それは正しいですが、私は実際にやりたいことは、このように日付を比較である:

a, _ := time.Parse(time.RFC3339, "2017-02-01T00:00:00+00:00") 
    b, _ := time.Parse(time.RFC3339, "2017-02-11T00:00:00+00:00") 

お知らせ:分/時間/秒がゼロに設定されている - diffは今240時間になります。

私は実際にこれを行う方法を理解できませんでした.Goにはtime.SetTime(0, 0, 0)という機能がありませんでしたか、それとも正規の方法で日付をリセットするのですか?

+0

タイムゾーンを考慮する必要がありますか?たとえば、「2017-01-01T22:00:00 + 00:00」と「2017-01-02T02:00:00 + 04:00」は同じ瞬間ですが、異なるタイムゾーンで記述されています。 – Addison

+0

これは良い質問です。私が扱う日付はUTCと仮定されていますので、それほど重要ではありません。しかし、時間帯が異なる場合は、そのことを考慮する必要があります。 – Max

+0

その場合、優生教授の答えはそれをカバーしているようです。 FYI - 答えはタイムゾーンを考慮しているので、私が言及した2つの日付は同じ日と考えられ、したがって0時間離れていると考えられます。 – Addison

答えて

3

Truncate複数回に丸める時間を指定できます。あなたの例では

oneDay := 24 * time.Hour 
a = a.Truncate(oneDay) 
b = b.Truncate(oneDay) 

ここに適応したコードとの遊び場を探す:https://play.golang.org/p/yWIYt3UkiT

+0

もご覧ください:https://golang.org/pkg/time/#Time.Truncate –

+0

よろしいですか。以前はAPIのドキュメントを読んでいましたが、 'Truncate'メソッドから何を作るべきかは不明でした。私はこれを試してみましょう、ありがとう。 – Max

0

を周りのエッジケースが存在する可能性があるためあなたがtime.Timeを使用した場合の取り扱い日付かなり注意しなければなりません夏時間の開始と終了。

恥知らずのプラグイン:DSTの問題を発生させずに日付を処理するために、Dateパッケージ(実際には他の誰かの以前の作品から派生したものです)を書きました。

https://github.com/rickb777/date

あなたが行うことができます

、例えば、

a := date.New(2017, 2, 1) 
b := date.New(2017, 2, 11) 
daysDifference := b.Sub(a) 
fmt.Println(daysDifference) 

日付範囲、タイムスパン、ISO8601の期間とクロックの顔時間を処理するために他のサブパッケージがあります。

関連する問題