2016-02-19 768 views
1

我在程序中有以下代碼,目標是確保一個項目在一個時間範圍內可訪問。出於某種原因,這是錯誤的。我記錄了開始,結束和現在的時間。開始/結束日期通過JSON請求進入,沒有時區。 time.Now()給出了一個時區。那是我的問題嗎?我將如何解決它?GoLang解析time.Now()無時區?

func withinStartAndEnd(item Item) bool { 
    fmt.Println("Start Date", item.Start_date, "\n") 
    fmt.Println("End Date", item.End_date, "\n") 
    fmt.Println("Now:", time.Now(), "\n") 

    //BUG: For some reason event 0's are still not accessible within the timeframe. The fmt's above are to help look at it. time.Now() is printing MST.. maybe that's it? 

    /* 

    Start Date 2016-02-19 09:50:00 +0000 +0000 
    End Date 2016-02-19 10:00:00 +0000 +0000 
    Now: 2016-02-19 09:59:48.73003196 -0700 MST 

    2016/02/19 09:59:48 Item not accessible (#148) 

    */ 
    return item.Start_date.Before(time.Now()) && item.End_date.After(time.Now()) 
} 

回答

1

如果確實沒有時區,則使用UTC,即Coordinated Universal Time

now := time.Now().UTC() 

的目標是讓一切UTC時間。也許,因爲DB時間實際上是MST,

// database time zone is Mountain Time 
dbt, err := time.LoadLocation("America/Denver") 
if err != nil { 
    fmt.Println(err) 
    return 
} 

now := time.Now().UTC() 
start := item.Start_date.In(dbt).UTC() 
end := item.End_date.In(dbt).UTC() 
+0

嗯。看起來開始/結束日期是從沒有時區的數據庫中存儲的,並且date.now假定沒有timezone = UTC,它比較了time.Now()是MST。如果我改變time.Now到time.Now()。MST(),它是關於數據庫的幾個小時。也許最好比較日期,小時和秒數,並忽略時區? –

+0

@NathanHyland:具體的時間必須有一個位置。如果你不知道位置,假設UTC是最好的,你可以做。 – JimB

+0

有什麼方法可以告訴去從數據庫中取出的時間是MST,然後呢?或者我需要更改數據庫類型以與時區有一個日期? 要澄清,不要更改數據庫時間TO MST(將它們從Go認爲它的UTC時間抵消它們幾個小時),但直接將其更改爲MST而不會影響時間。 –