| package datetime |
|
|
| import ( |
| "errors" |
| "strings" |
| "time" |
| ) |
|
|
| |
| func Parse(value string) (DateTime, error) { |
| if value == "" { |
| return DateTime{}, NewDateTimeParseError(value) |
| } |
|
|
| |
| i := strings.LastIndexByte(value, '[') |
| if i == -1 || !strings.HasSuffix(value, "]") { |
| |
| layouts := []string{ |
| time.RFC3339, |
| time.RFC3339Nano, |
| ISO8601Layout, |
| ISO8601MilliLayout, |
| ISO8601MicroLayout, |
| ISO8601NanoLayout, |
| ISO8601ZuluLayout, |
| ISO8601ZuluMilliLayout, |
| ISO8601ZuluMicroLayout, |
| ISO8601ZuluNanoLayout, |
| } |
|
|
| for _, layout := range layouts { |
| if t, err := time.Parse(layout, value); err == nil { |
| return DateTime{t}, nil |
| } |
| } |
|
|
| return DateTime{}, NewDateTimeParseError(value) |
| } |
|
|
| |
| timestamp := value[:i] |
| timezone := value[i+1 : len(value)-1] |
|
|
| |
| if timezone == "" { |
| return DateTime{}, NewInvalidTimezoneError(timezone, errors.New("timezone identifier is empty")) |
| } |
|
|
| |
| loc, err := time.LoadLocation(timezone) |
| if err != nil { |
| return DateTime{}, NewInvalidTimezoneError(timezone, err) |
| } |
|
|
| |
| layouts := []string{ |
| time.RFC3339, |
| time.RFC3339Nano, |
| ISO8601ZuluLayout, |
| ISO8601ZuluMilliLayout, |
| ISO8601ZuluMicroLayout, |
| ISO8601ZuluNanoLayout, |
| } |
|
|
| for _, layout := range layouts { |
| if t, err := time.Parse(layout, timestamp); err == nil { |
| |
| return DateTime{t.In(loc)}, nil |
| } |
| } |
|
|
| return DateTime{}, NewDateTimeParseError(value) |
| } |
|
|