在Go程序中,时间始终为0。

huangapple go评论101阅读模式
英文:

Time always 0 in a go program

问题

我正在尝试从Bitfinex API获取交易并将其打印在屏幕上。除了时间之外,一切都正常工作。

我想知道为什么在这个例子中它们总是打印为0001-01-01 00:00:00...

在UnmarshalJSON中,"t"包含我需要的时间。只是似乎无法与Trade结构保持一致。

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io/ioutil"
  6. "net/http"
  7. "strconv"
  8. "time"
  9. )
  10. type Trade struct {
  11. Tid int
  12. Timestamp myTime
  13. }
  14. type myTime time.Time
  15. func (t myTime) String() string {
  16. when := time.Time(t)
  17. return when.Format("2006-01-02 15:04:05")
  18. }
  19. func (t myTime) UnmarshalJSON(b []byte) error {
  20. ts, err := strconv.Atoi(string(b))
  21. if err != nil {
  22. return err
  23. }
  24. t = myTime(time.Unix(int64(ts), 0))
  25. return nil
  26. }
  27. func main() {
  28. trades, _ := GetTrades()
  29. for _, trade := range trades {
  30. fmt.Printf("%d - %s\n", trade.Tid, trade.Timestamp)
  31. }
  32. }
  33. func GetTrades() (trades []Trade, err error) {
  34. r, err := http.Get("https://api.bitfinex.com/v1/trades/BTCUSD")
  35. defer r.Body.Close()
  36. body, _ := ioutil.ReadAll(r.Body)
  37. json.Unmarshal(body, &trades)
  38. return
  39. }

以上是你提供的代码。

英文:

I am trying here to get trades from Bitfinex API and print them on the screen. Everything works fine, except for times.

I wonder why they always prints as 0001-01-01 00:00:00 in this example...

In UnmarshalJSON, "t" contains the time I need. It just doesn't seem to stick to the Trade structure.

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io/ioutil"
  6. "net/http"
  7. "strconv"
  8. "time"
  9. )
  10. type Trade struct {
  11. Tid int
  12. Timestamp myTime
  13. }
  14. type myTime time.Time
  15. func (t myTime) String() string {
  16. when := time.Time(t)
  17. return when.Format("2006-01-02 15:04:05")
  18. }
  19. func (t myTime) UnmarshalJSON(b []byte) error {
  20. ts, err := strconv.Atoi(string(b))
  21. if err != nil {
  22. return err
  23. }
  24. t = myTime(time.Unix(int64(ts), 0))
  25. return nil
  26. }
  27. func main() {
  28. trades, _ := GetTrades()
  29. for _, trade := range trades {
  30. fmt.Printf("%d - %s\n", trade.Tid, trade.Timestamp)
  31. }
  32. }
  33. func GetTrades() (trades []Trade, err error) {
  34. r, err := http.Get("https://api.bitfinex.com/v1/trades/BTCUSD")
  35. defer r.Body.Close()
  36. body, _ := ioutil.ReadAll(r.Body)
  37. json.Unmarshal(body, &trades)
  38. return
  39. }

答案1

得分: 5

你可以在指针接收器上进行解组,否则你只是在复制不相关的数据:

  1. func (t *myTime) UnmarshalJSON(b []byte) error {
  2. // ^^^^^^^ 这里
  3. ts, err := strconv.Atoi(string(b))
  4. if err != nil {
  5. return err
  6. }
  7. *t = myTime(time.Unix(int64(ts), 0))
  8. // ^^ 这里也是
  9. return nil
  10. }

我不确定在指针接收器中重新分配数据的做法在安全性和惯用性上如何,有人可以澄清吗?

(这个方法是可行的,但不确定是否符合“最佳实践”)

英文:

You can unmarshal on a pointer receiver .. otherwise you're just copying unrelated data around:

  1. func (t *myTime) UnmarshalJSON(b []byte) error {
  2. // ^^^^^^^ this
  3. ts, err := strconv.Atoi(string(b))
  4. if err != nil {
  5. return err
  6. }
  7. *t = myTime(time.Unix(int64(ts), 0))
  8. // ^^ this too
  9. return nil
  10. }

I'm not sure how "safe"/"idiomatic" this is to re-assign data in a pointer receiver.. can someone clarify?

(this works btw.. not sure if its "best practice")

答案2

得分: 1

你可以在UnmarshalJSON中不能给一个值赋值,你必须使用指针或结构体,一种方法是:

  1. type MyTime struct {
  2. time.Time
  3. }
  4. func (t MyTime) String() string {
  5. when := time.Time(t.Time)
  6. return when.Format("2006-01-02 15:04:05")
  7. }
  8. func (t *MyTime) UnmarshalJSON(b []byte) error {
  9. ts, err := strconv.Atoi(string(b))
  10. if err != nil {
  11. return err
  12. }
  13. t.Time = time.Unix(int64(ts), 0)
  14. return nil
  15. }
英文:

You can't assign in UnmarshalJSON to a value, you have to use a pointer or a struct, one approach is:

  1. type MyTime struct {
  2. time.Time
  3. }
  4. func (t MyTime) String() string {
  5. when := time.Time(t.Time)
  6. return when.Format("2006-01-02 15:04:05")
  7. }
  8. func (t *MyTime) UnmarshalJSON(b []byte) error {
  9. ts, err := strconv.Atoi(string(b))
  10. if err != nil {
  11. return err
  12. }
  13. t.Time = time.Unix(int64(ts), 0)
  14. return nil
  15. }

huangapple
  • 本文由 发表于 2014年9月24日 09:48:41
  • 转载请务必保留本文链接:https://go.coder-hub.com/26007263.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定