|
1 | 1 | package parsetime |
2 | 2 |
|
| 3 | +import ( |
| 4 | + "strings" |
| 5 | +) |
| 6 | + |
3 | 7 | const ( |
4 | | - Date = "200612" |
5 | | - MMDDYYYY = "1/2/2006" |
6 | | - ShortTime = "15:4 PM" |
7 | | - LongTime = "15:4:5 PM" |
8 | | - ANSICAsctime = "Mon Jan 2 15:4:5 2006" |
9 | | - RFC850NoWeekday = "2-Jan-06 15:4:5 MST" |
10 | | - RFC850NoTime = "2-Jan-06" |
11 | | - BrokenRFC850 = "Monday, 2-Jan-2006 15:4:5 MST" |
12 | | - BrokenRFC850NoWeekday = "2-Jan-2006 15:4:5 MST" |
13 | | - BrokenRFC850NoTime = "2-Jan-2006" |
14 | | - CommonLog = "2/Jan/2006:15:4:5 -0700" |
15 | | - CommonLogNoTime = "2/Jan/2006" |
16 | | - LsDate = "Jan 2 2006" |
17 | | - LsTime = "Jan 2 15:4" |
18 | | - WindowsDir = "1-2-06 15:4PM" |
19 | | - ISO8601DateHour = "2006-1-2 15" |
20 | | - ISO8601DateHourMin = "2006-1-2 15:4" |
21 | | - ISO8601Datetime = "2006-1-2 15:4:5" |
22 | | - ISO8601DatetimeCompact = "200612 1545" |
23 | | - ISO8601DatetimeCompactUTC = "200612 1545Z" |
24 | | - ISO8601DatetimeOffset = "2006-1-2 15:4:5-07:00" |
25 | | - ISO8601DatetimeOffsetTZD = "2006-1-2 15:4:5-07:00 MST" |
26 | | - ISO8601DatetimeFracSecOffset = "2006-1-2 15:4:5.999999999-07:00" |
27 | | - ISO8601DatetimeOffset2 = "2006-1-2 15:4:5 -07:00" |
28 | | - ISO8601DatetimeOffsetTZD2 = "2006-1-2 15:4:5 -07:00 MST" |
29 | | - ISO8601DatetimeFracSecOffset2 = "2006-1-2 15:4:5.999999999 -07:00" |
30 | | - ISO8601DatetimeFracSecUTC = "2006-1-2 15:4:5.999999999Z" |
31 | | - ISO8601DatetimeFracSec = "2006-1-2 15:4:5.999999999" |
32 | | - ISO8601TDatetime = "2006-1-2T15:4:5" |
33 | | - ISO8601TDatetimeCompact = "200612T1545" |
34 | | - ISO8601TDatetimeCompactUTC = "200612T1545Z" |
35 | | - ISO8601TDateHour = "2006-1-2T15" |
36 | | - ISO8601TDateHourMin = "2006-1-2T15:4" |
37 | | - ISO8601TDatetimeOffset = "2006-1-2T15:4:5-07:00" |
38 | | - ISO8601TDatetimeOffsetTZD = "2006-1-2T15:4:5-07:00 MST" |
39 | | - ISO8601TDatetimeFracSecOffset = "2006-1-2T15:4:5.999999999-07:00" |
40 | | - ISO8601TDatetimeFracSecUTC = "2006-1-2T15:4:5.999999999Z" |
41 | | - ISO8601TDatetimeFracSec = "2006-1-2T15:4:5.999999999" |
42 | | - ISO8601Date = "2006-1-2" |
43 | | - ISO8601Time = "15:4:5" |
44 | | - ISO8601TimeOffset = "15:4:5-07:00" |
45 | | - MMDDYYYYDatetime = "1/2/2006 15:4:5" |
| 8 | + year = `(2[0-9]{3}|19[7-9][0-9])` |
| 9 | + month = `(1[012]|0?[1-9])` |
| 10 | + day = `([12][0-9]|3[01]|0?[1-9])` |
| 11 | + hour = `(2[0-3]|[01]?[0-9])` |
| 12 | + min = `([0-5]?[0-9])` |
| 13 | + sec = min |
| 14 | + nsec = `(?:[.])?([0-9]{1,9})?` |
| 15 | + weekday = `(?:Mon|Monday|Tue|Tuesday|Wed|Wednesday|Thu|Thursday|Fri|Friday|Sat|Saturday|Sun|Sunday)` |
| 16 | + monthAbbr = `(Jan|January|Feb|Februray|Mar|March|Apr|April|May|Jun|June|Jul|July|Aug|August|Sep|September|Oct|October|Nov|November|Dec|December|1[012]|0?[1-9])` |
| 17 | + offset = `(Z|[+-][01][1-9]:[0-9]{2})?` |
| 18 | + zone = `(?:[a-zA-Z0-9+-]{3,6})?` |
| 19 | + ymdSep = `[ /.-]?` |
| 20 | + hmsSep = `[ :.]?` |
| 21 | + t = `(?:t|T|\s*)?` |
| 22 | + s = `(?:\s*)?` |
| 23 | + ampm = `([aApP][mM])` |
| 24 | + ampmHour = `(1[01]|[0]?[0-9])` |
| 25 | + shortYear = `(2[0-9]{3}|19[7-9][0-9]|[0-9]{2})` |
| 26 | + offsetZone = `([+-][01][1-9]:[0-9]{2}|[a-zA-Z0-9+-]{3,6})?` |
| 27 | + usOffsetZone = `(?:[(])?([+-][01][1-9]:[0-9]{2}|[a-zA-Z0-9+-]{3,6})?(?:[)])?` |
| 28 | +) |
| 29 | + |
| 30 | +// Regular expressions |
| 31 | +var ( |
| 32 | + // ISO8601, RFC3339 |
| 33 | + ISO8601 = strings.Join([]string{ |
| 34 | + `(?:`, year, ymdSep, month, ymdSep, day, `)?`, t, |
| 35 | + `(?:`, hour, hmsSep, min, hmsSep, sec, `?`, nsec, `)?`, |
| 36 | + s, offset, s, zone, |
| 37 | + }, "") |
| 38 | + |
| 39 | + // RFC822, RFC850, RFC1123 |
| 40 | + RFC8xx1123 = strings.Join([]string{ |
| 41 | + `(?:`, weekday, `,?`, s, `)?`, day, ymdSep, monthAbbr, ymdSep, shortYear, |
| 42 | + hmsSep, `(?:`, hour, hmsSep, min, hmsSep, sec, `?`, nsec, `)?`, |
| 43 | + s, offsetZone, |
| 44 | + }, "") |
| 45 | + |
| 46 | + ANSIC = strings.Join([]string{ |
| 47 | + `(?:`, weekday, s, `)?`, monthAbbr, ymdSep, day, ymdSep, |
| 48 | + `(?:`, hour, hmsSep, min, hmsSep, sec, `?`, nsec, `)?`, |
| 49 | + s, `(?:`, offsetZone, s, year, `)?`, |
| 50 | + }, "") |
| 51 | + |
| 52 | + US = strings.Join([]string{ |
| 53 | + `(?:`, monthAbbr, ymdSep, day, `(?:,)?`, ymdSep, shortYear, `)?`, s, `(?:at)?`, s, |
| 54 | + `(?:`, hour, hmsSep, min, hmsSep, sec, `?`, nsec, `)?`, |
| 55 | + s, ampm, `?`, s, usOffsetZone, |
| 56 | + }, "") |
46 | 57 |
|
47 | | - // time/format.go |
48 | | - // ANSIC // "Mon Jan _2 15:04:05 2006" |
49 | | - // UnixDate // "Mon Jan _2 15:04:05 MST 2006" |
50 | | - // RubyDate // "Mon Jan 02 15:04:05 -0700 2006" |
51 | | - // RFC822 // "02 Jan 06 15:04 MST" |
52 | | - // RFC822Z // "02 Jan 06 15:04 -0700" // RFC822 with numeric zone |
53 | | - // RFC850 // "Monday, 02-Jan-06 15:04:05 MST" |
54 | | - // RFC1123 // "Mon, 02 Jan 2006 15:04:05 MST" |
55 | | - // RFC1123Z // "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone |
56 | | - // RFC3339 // "2006-01-02T15:04:05Z07:00" |
57 | | - // RFC3339Nano // "2006-01-02T15:04:05.999999999Z07:00" |
58 | | - // Kitchen // "3:04PM" |
59 | | - // Stamp // "Jan _2 15:04:05" |
60 | | - // StampMilli // "Jan _2 15:04:05.000" |
61 | | - // StampMicro // "Jan _2 15:04:05.000000" |
62 | | - // StampNano // "Jan _2 15:04:05.000000000" |
| 58 | + Months = map[string]int{ |
| 59 | + "Jan": 1, |
| 60 | + "January": 1, |
| 61 | + "Feb": 2, |
| 62 | + "Februray": 2, |
| 63 | + "Mar": 3, |
| 64 | + "March": 3, |
| 65 | + "Apr": 4, |
| 66 | + "April": 4, |
| 67 | + "May": 5, |
| 68 | + "Jun": 6, |
| 69 | + "June": 6, |
| 70 | + "Jul": 7, |
| 71 | + "July": 7, |
| 72 | + "Aug": 8, |
| 73 | + "August": 8, |
| 74 | + "Sep": 9, |
| 75 | + "September": 9, |
| 76 | + "Oct": 10, |
| 77 | + "October": 10, |
| 78 | + "Nov": 11, |
| 79 | + "November": 11, |
| 80 | + "Dec": 12, |
| 81 | + "December": 12, |
| 82 | + } |
63 | 83 | ) |
0 commit comments