Parse 'Z' as valid timezone if offset is expected
This commit is contained in:
parent
0587a57807
commit
434c27343e
2 changed files with 19 additions and 3 deletions
|
|
@ -1090,29 +1090,42 @@ proc parseToken(info: var TimeInfo; token, value: string; j: var int) =
|
||||||
info.year = value[j..j+3].parseInt()
|
info.year = value[j..j+3].parseInt()
|
||||||
j += 4
|
j += 4
|
||||||
of "z":
|
of "z":
|
||||||
|
info.isDST = false
|
||||||
if value[j] == '+':
|
if value[j] == '+':
|
||||||
info.timezone = 0 - parseInt($value[j+1]) * secondsInHour
|
info.timezone = 0 - parseInt($value[j+1]) * secondsInHour
|
||||||
elif value[j] == '-':
|
elif value[j] == '-':
|
||||||
info.timezone = parseInt($value[j+1]) * secondsInHour
|
info.timezone = parseInt($value[j+1]) * secondsInHour
|
||||||
|
elif value[j] == 'Z':
|
||||||
|
info.timezone = 0
|
||||||
|
j += 1
|
||||||
|
return
|
||||||
else:
|
else:
|
||||||
raise newException(ValueError,
|
raise newException(ValueError,
|
||||||
"Couldn't parse timezone offset (z), got: " & value[j])
|
"Couldn't parse timezone offset (z), got: " & value[j])
|
||||||
info.isDST = false
|
|
||||||
j += 2
|
j += 2
|
||||||
of "zz":
|
of "zz":
|
||||||
|
info.isDST = false
|
||||||
if value[j] == '+':
|
if value[j] == '+':
|
||||||
info.timezone = 0 - value[j+1..j+2].parseInt() * secondsInHour
|
info.timezone = 0 - value[j+1..j+2].parseInt() * secondsInHour
|
||||||
elif value[j] == '-':
|
elif value[j] == '-':
|
||||||
info.timezone = value[j+1..j+2].parseInt() * secondsInHour
|
info.timezone = value[j+1..j+2].parseInt() * secondsInHour
|
||||||
|
elif value[j] == 'Z':
|
||||||
|
info.timezone = 0
|
||||||
|
j += 1
|
||||||
|
return
|
||||||
else:
|
else:
|
||||||
raise newException(ValueError,
|
raise newException(ValueError,
|
||||||
"Couldn't parse timezone offset (zz), got: " & value[j])
|
"Couldn't parse timezone offset (zz), got: " & value[j])
|
||||||
info.isDST = false
|
|
||||||
j += 3
|
j += 3
|
||||||
of "zzz":
|
of "zzz":
|
||||||
|
info.isDST = false
|
||||||
var factor = 0
|
var factor = 0
|
||||||
if value[j] == '+': factor = -1
|
if value[j] == '+': factor = -1
|
||||||
elif value[j] == '-': factor = 1
|
elif value[j] == '-': factor = 1
|
||||||
|
elif value[j] == 'Z':
|
||||||
|
info.timezone = 0
|
||||||
|
j += 1
|
||||||
|
return
|
||||||
else:
|
else:
|
||||||
raise newException(ValueError,
|
raise newException(ValueError,
|
||||||
"Couldn't parse timezone offset (zzz), got: " & value[j])
|
"Couldn't parse timezone offset (zzz), got: " & value[j])
|
||||||
|
|
@ -1120,7 +1133,6 @@ proc parseToken(info: var TimeInfo; token, value: string; j: var int) =
|
||||||
j += 4
|
j += 4
|
||||||
info.timezone += factor * value[j..j+1].parseInt() * 60
|
info.timezone += factor * value[j..j+1].parseInt() * 60
|
||||||
j += 2
|
j += 2
|
||||||
info.isDST = false
|
|
||||||
else:
|
else:
|
||||||
# Ignore the token and move forward in the value string by the same length
|
# Ignore the token and move forward in the value string by the same length
|
||||||
j += token.len
|
j += token.len
|
||||||
|
|
|
||||||
|
|
@ -96,6 +96,10 @@ parseTest("2006-01-12T15:04:05Z-07:00", "yyyy-MM-dd'T'HH:mm:ss'Z'zzz",
|
||||||
# RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
|
# RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
|
||||||
parseTest("2006-01-12T15:04:05.999999999Z-07:00",
|
parseTest("2006-01-12T15:04:05.999999999Z-07:00",
|
||||||
"yyyy-MM-ddTHH:mm:ss.999999999Zzzz", "2006-01-12T22:04:05+00:00", 11)
|
"yyyy-MM-ddTHH:mm:ss.999999999Zzzz", "2006-01-12T22:04:05+00:00", 11)
|
||||||
|
for tzFormat in ["z", "zz", "zzz"]:
|
||||||
|
# formatting timezone as 'Z' for UTC
|
||||||
|
parseTest("2001-01-12T22:04:05Z", "yyyy-MM-dd'T'HH:mm:ss" & tzFormat,
|
||||||
|
"2001-01-12T22:04:05+00:00", 11)
|
||||||
# Kitchen = "3:04PM"
|
# Kitchen = "3:04PM"
|
||||||
parseTestTimeOnly("3:04PM", "h:mmtt", "15:04:00")
|
parseTestTimeOnly("3:04PM", "h:mmtt", "15:04:00")
|
||||||
#when not defined(testing):
|
#when not defined(testing):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue