huandu/facebook

Facebook changed time formatting

robbiet480 opened this issue · 4 comments

Seems that Facebook has changed the timestamp formatting on at least some routes, such as /<post_id>, to something resembling ISO8601. I have this code to parse it, I would submit a PR but not sure if its outside the scope of the project or if we should attempt to parse this new format in the existing code as part of decodeField/decode like we do for standard time.Time already:

type FacebookISO8601 time.Time

func (it FacebookISO8601) MarshalJSON() ([]byte, error) {
	return []byte(time.Time(it).Format(`"2006-01-02T15:04:05-0700"`)), nil
}

func (it *FacebookISO8601) UnmarshalJSON(data []byte) error {
	t, err := time.ParseInLocation(`"2006-01-02T15:04:05-0700"`, string(data), time.UTC)
	if err == nil {
		*it = FacebookISO8601(t)
	}

	return err
}

I think it should be out of scope of this package. You can do what you show in the issue to decode the field as expected. There is no special time format related parser in this package right now.

I am still studying me from Indonesia my name is Sofyan.

I recently discovered a somewhat hidden feature of the Graph API. You can provide a param, date_format with a PHP compatible date() format string. Doing this allows me to make every request use time.RFC3339 (date_format=Y-m-d\TH:i:sP). I'm thinking about adding a new flag to Session or maybe a global flag like Version to allow setting the "default" date_format param for all requests. That way, you could set it to RFC3339 and use the native time.Time instead of having to use a custom implementation like mine above.

Thoughts on this @huandu? Default params to send on every request, the first and only one to start being date_format?

LGTM.