3
0
mirror of https://github.com/ergochat/ergo.git synced 2024-11-24 21:09:30 +01:00

use exact integer parsing for znc.in/playback

This commit is contained in:
Shivaram Lingamneni 2022-02-15 10:39:38 -05:00
parent cba3a2fc10
commit 197a9d4b5e
2 changed files with 15 additions and 3 deletions

View File

@ -12,6 +12,11 @@ func TestZncTimestampParser(t *testing.T) {
assertEqual(zncWireTimeToTime("1558338348.988"), time.Unix(1558338348, 988000000).UTC(), t)
assertEqual(zncWireTimeToTime("1558338348.9"), time.Unix(1558338348, 900000000).UTC(), t)
assertEqual(zncWireTimeToTime("1558338348"), time.Unix(1558338348, 0).UTC(), t)
assertEqual(zncWireTimeToTime("1558338348.99999999999999999999999999999"), time.Unix(1558338348, 999999999).UTC(), t)
assertEqual(zncWireTimeToTime("1558338348.999999999111111111"), time.Unix(1558338348, 999999999).UTC(), t)
assertEqual(zncWireTimeToTime("1558338348.999999991111111111"), time.Unix(1558338348, 999999991).UTC(), t)
assertEqual(zncWireTimeToTime(".988"), time.Unix(0, 988000000).UTC(), t)
assertEqual(zncWireTimeToTime("0"), time.Unix(0, 0).UTC(), t)
assertEqual(zncWireTimeToTime("garbage"), time.Unix(0, 0).UTC(), t)
assertEqual(zncWireTimeToTime(""), time.Unix(0, 0).UTC(), t)
}

View File

@ -51,11 +51,18 @@ func zncWireTimeToTime(str string) (result time.Time) {
secondsPortion = str
} else {
secondsPortion = str[:dot]
fracPortion = str[dot:]
fracPortion = str[dot+1:]
}
seconds, _ := strconv.ParseInt(secondsPortion, 10, 64)
fraction, _ := strconv.ParseFloat(fracPortion, 64)
return time.Unix(seconds, int64(fraction*1000000000)).UTC()
// truncate to nanosecond resolution if necessary
if len(fracPortion) > 9 {
fracPortion = fracPortion[:9]
}
fracSeconds, _ := strconv.ParseInt(fracPortion, 10, 64)
for i := 0; i < (9 - len(fracPortion)); i++ {
fracSeconds *= 10
}
return time.Unix(seconds, fracSeconds).UTC()
}
func timeToZncWireTime(t time.Time) (result string) {