diff --git a/parse.go b/parse.go index 906b4bd..c1ad136 100644 --- a/parse.go +++ b/parse.go @@ -1,28 +1,32 @@ package timeutils // #include "approxidate.h" +// #include // #cgo LDFLAGS: -lm import "C" -import "time" -import "fmt" -// Takes a string and passes it through Approxidate +import ( + "fmt" + "time" + "unsafe" +) + +// ParseDateString takes a string and passes it through Approxidate // Parses into a time.Time -func ParseDateString(dt string) (t time.Time, err error) { +func ParseDateString(dt string) (time.Time, error) { date := C.struct_timeval{} - ok := C.approxidate(C.CString(dt), &date) + cStr := C.CString(dt) + ok := C.approxidate(cStr, &date) + C.free(unsafe.Pointer(cStr)) if int(ok) != 0 { - err = fmt.Errorf("Invlid Date Format %s", dt) - return + return time.Time{}, fmt.Errorf("Invlid Date Format %s", dt) } - t = time.Unix(int64(date.tv_sec), int64(date.tv_usec)*1000) - return + return time.Unix(int64(date.tv_sec), int64(date.tv_usec)*1000), nil } -// Parses a milliseconds-since-epoch time stamp to a time.Time -func ParseMillis(dt int64) (t time.Time, err error) { - t = time.Unix(0, dt*1000*1000) - return +// ParseMillis parses a milliseconds-since-epoch time stamp to a time.Time +func ParseMillis(dt int64) (time.Time, error) { + return time.Unix(0, dt*1000*1000), nil } diff --git a/parse_test.go b/parse_test.go new file mode 100644 index 0000000..dd26a7f --- /dev/null +++ b/parse_test.go @@ -0,0 +1,30 @@ +package timeutils + +import ( + "os" + "testing" +) + +var testData = []struct{ in, out string }{ + {"2014-12-05 09:51:20.939152 -0500", "2014-12-05 14:51:20.939152 +0000 UTC"}, + {"2014-12-05 09:51:20.939152 -0500 EST", "2014-12-05 14:51:20.939152 +0000 UTC"}, + {"2014-12-05 09:51:20.939152", "2014-12-05 09:51:20.939152 +0000 UTC"}, + {"2014/12/05 09:51:20.939152", "2014-12-05 09:51:20.939152 +0000 UTC"}, + {"2014.12.05 09:51:20.939152", "2014-12-05 09:51:20.939152 +0000 UTC"}, + {"09:51:20.939152 2014-31-12", "2014-12-31 09:51:20.939152 +0000 UTC"}, + {"09:51:20.939152am 2014-31-12", "2014-12-31 09:51:20.939152 +0000 UTC"}, + {"09:51:20.939152pm 2014-31-12", "2014-12-31 21:51:20.939152 +0000 UTC"}, +} + +func TestParseDateString(t *testing.T) { + defer os.Setenv("TZ", os.Getenv("TZ")) + os.Setenv("TZ", "UTC") + + for i, elem := range testData { + if tt, err := ParseDateString(elem.in); err != nil { + t.Error(err) + } else if elem.out != tt.String() { + t.Errorf("[%d] Unexpected parsed time.\nExpect:\t%s\nGot:\t%s\n", i, elem.out, tt) + } + } +}