diff options
author | Hanjun Kim <hallazzang@gmail.com> | 2017-11-20 14:23:06 +0900 |
---|---|---|
committer | Rob Pike <r@golang.org> | 2017-12-13 02:42:34 +0000 |
commit | 8776be153540cf450eafd847cf8efde0a01774dc (patch) | |
tree | d527333959dce291c183b86b3d23aa5f93e1896e /src/time/format.go | |
parent | 1206e974a1a6f1132c6ea5d746763a841d2d293a (diff) | |
download | go-8776be153540cf450eafd847cf8efde0a01774dc.tar.gz go-8776be153540cf450eafd847cf8efde0a01774dc.zip |
time: add space padding layout strings(using underscore) for not only day but others
As mentioned in #22802, only day component of layout string has space
padding(represented by one underscore before its placeholder). This
commit expands the rule for month, hour, minute and second.
Updates #22802 (maybe fixes it)
Change-Id: I886998380489862ab9a324a6774f2e4cf7124122
Reviewed-on: https://go-review.googlesource.com/78735
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
Diffstat (limited to 'src/time/format.go')
-rw-r--r-- | src/time/format.go | 72 |
1 files changed, 62 insertions, 10 deletions
diff --git a/src/time/format.go b/src/time/format.go index a60474f026..4f28e3be0c 100644 --- a/src/time/format.go +++ b/src/time/format.go @@ -90,6 +90,7 @@ const ( stdLongMonth = iota + stdNeedDate // "January" stdMonth // "Jan" stdNumMonth // "1" + stdUnderMonth // "_1" stdZeroMonth // "01" stdLongWeekDay // "Monday" stdWeekDay // "Mon" @@ -98,10 +99,13 @@ const ( stdZeroDay // "02" stdHour = iota + stdNeedClock // "15" stdHour12 // "3" + stdUnderHour12 // "_3" stdZeroHour12 // "03" stdMinute // "4" + stdUnderMinute // "_4" stdZeroMinute // "04" stdSecond // "5" + stdUnderSecond // "_5" stdZeroSecond // "05" stdLongYear = iota + stdNeedDate // "2006" stdYear // "06" @@ -187,13 +191,24 @@ func nextStdChunk(layout string) (prefix string, std int, suffix string) { } return layout[0:i], stdDay, layout[i+1:] - case '_': // _2, _2006 - if len(layout) >= i+2 && layout[i+1] == '2' { - //_2006 is really a literal _, followed by stdLongYear - if len(layout) >= i+5 && layout[i+1:i+5] == "2006" { - return layout[0 : i+1], stdLongYear, layout[i+5:] + case '_': // _1, _2, _2006, _3, _4, _5 + if len(layout) >= i+2 { + switch layout[i+1] { + case '1': + return layout[0:i], stdUnderMonth, layout[i+2:] + case '2': + //_2006 is really a literal _, followed by stdLongYear + if len(layout) >= i+5 && layout[i+1:i+5] == "2006" { + return layout[0 : i+1], stdLongYear, layout[i+5:] + } + return layout[0:i], stdUnderDay, layout[i+2:] + case '3': + return layout[0:i], stdUnderHour12, layout[i+2:] + case '4': + return layout[0:i], stdUnderMinute, layout[i+2:] + case '5': + return layout[0:i], stdUnderSecond, layout[i+2:] } - return layout[0:i], stdUnderDay, layout[i+2:] } case '3': @@ -544,6 +559,11 @@ func (t Time) AppendFormat(b []byte, layout string) []byte { b = append(b, m...) case stdNumMonth: b = appendInt(b, int(month), 0) + case stdUnderMonth: + if month < 10 { + b = append(b, ' ') + } + b = appendInt(b, int(month), 0) case stdZeroMonth: b = appendInt(b, int(month), 2) case stdWeekDay: @@ -569,6 +589,16 @@ func (t Time) AppendFormat(b []byte, layout string) []byte { hr = 12 } b = appendInt(b, hr, 0) + case stdUnderHour12: + // Noon is 12PM, midnight is 12AM. + hr := hour % 12 + if hr == 0 { + hr = 12 + } + if hr < 10 { + b = append(b, ' ') + } + b = appendInt(b, hr, 0) case stdZeroHour12: // Noon is 12PM, midnight is 12AM. hr := hour % 12 @@ -578,10 +608,20 @@ func (t Time) AppendFormat(b []byte, layout string) []byte { b = appendInt(b, hr, 2) case stdMinute: b = appendInt(b, min, 0) + case stdUnderMinute: + if min < 10 { + b = append(b, ' ') + } + b = appendInt(b, min, 0) case stdZeroMinute: b = appendInt(b, min, 2) case stdSecond: b = appendInt(b, sec, 0) + case stdUnderSecond: + if sec < 10 { + b = append(b, ' ') + } + b = appendInt(b, sec, 0) case stdZeroSecond: b = appendInt(b, sec, 2) case stdPM: @@ -846,7 +886,10 @@ func parse(layout, value string, defaultLocation, local *Location) (Time, error) case stdLongMonth: month, value, err = lookup(longMonthNames, value) month++ - case stdNumMonth, stdZeroMonth: + case stdNumMonth, stdUnderMonth, stdZeroMonth: + if std == stdUnderMonth && len(value) > 0 && value[0] == ' ' { + value = value[1:] + } month, value, err = getnum(value, std == stdZeroMonth) if month <= 0 || 12 < month { rangeErrString = "month" @@ -870,17 +913,26 @@ func parse(layout, value string, defaultLocation, local *Location) (Time, error) if hour < 0 || 24 <= hour { rangeErrString = "hour" } - case stdHour12, stdZeroHour12: + case stdHour12, stdUnderHour12, stdZeroHour12: + if std == stdUnderHour12 && len(value) > 0 && value[0] == ' ' { + value = value[1:] + } hour, value, err = getnum(value, std == stdZeroHour12) if hour < 0 || 12 < hour { rangeErrString = "hour" } - case stdMinute, stdZeroMinute: + case stdMinute, stdUnderMinute, stdZeroMinute: + if std == stdUnderMinute && len(value) > 0 && value[0] == ' ' { + value = value[1:] + } min, value, err = getnum(value, std == stdZeroMinute) if min < 0 || 60 <= min { rangeErrString = "minute" } - case stdSecond, stdZeroSecond: + case stdSecond, stdUnderSecond, stdZeroSecond: + if std == stdUnderSecond && len(value) > 0 && value[0] == ' ' { + value = value[1:] + } sec, value, err = getnum(value, std == stdZeroSecond) if sec < 0 || 60 <= sec { rangeErrString = "second" |