英文:
Error parsing time in Go with variable number of microseconds
问题
我正在尝试将一个字符串解析为时间对象。问题在于微秒部分的数字位数会发生变化,这会导致解析失败。例如,下面的代码可以正常工作:
package main
import (
"fmt"
"time"
)
func main() {
timeText := "2017-03-25T10:01:02.1234567Z"
layout := "2006-01-02T15:04:05.0000000Z"
t, _ := time.Parse(layout, timeText)
fmt.Println(t)
}
但是下面的代码会导致错误,因为微秒的数字位数与格式不匹配:
package main
import (
"fmt"
"time"
)
func main() {
timeText := "2017-03-25T10:01:02.123Z" // 注意这里只有3位微秒数字
layout := "2006-01-02T15:04:05.0000000Z"
t, _ := time.Parse(layout, timeText)
fmt.Println(t)
}
如何修复这个问题,使得微秒部分仍然可以解析,而不管有多少位数字呢?
英文:
I'm trying to parse a string into a time object. The issue is that the number of digits in the microseconds term changes, which breaks the parsing. For example, this works fine:
package main
import (
"fmt"
"time"
)
func main() {
timeText := "2017-03-25T10:01:02.1234567Z"
layout := "2006-01-02T15:04:05.0000000Z"
t, _ := time.Parse(layout, timeText)
fmt.Println(t)
}
But this causes an error, because the number of microseconds digits doesn't match the layout:
package main
import (
"fmt"
"time"
)
func main() {
timeText := "2017-03-25T10:01:02.123Z" // notice only 3 microseconds digits here
layout := "2006-01-02T15:04:05.0000000Z"
t, _ := time.Parse(layout, timeText)
fmt.Println(t)
}
How do I fix this so that the microseconds term is still parsed, but it doesn't matter how many digits there are?
答案1
得分: 13
在子秒格式中,使用9代替零,例如:
timeText := "2017-03-25T10:01:02.1234567Z"
layout := "2006-01-02T15:04:05.99Z"
t, _ := time.Parse(layout, timeText)
fmt.Println(t) //输出:2017-03-25 10:01:02.1234567 +0000 UTC
根据文档:
// 可以通过在布局字符串中的秒值的小数点后添加一串0或9来打印小数秒。
// 如果布局数字是0,则小数秒的宽度是指定的。注意输出有一个尾随的零。
do("小数部分为0s", "15:04:05.00000", "11:06:39.12340")
// 如果布局中的小数部分是9s,则尾随的零会被省略。
do("小数部分为9s", "15:04:05.99999999", "11:06:39.1234")
英文:
Use 9s instead of zeros in the subsecond format, for example:
timeText := "2017-03-25T10:01:02.1234567Z"
layout := "2006-01-02T15:04:05.99Z"
t, _ := time.Parse(layout, timeText)
fmt.Println(t) //prints 2017-03-25 10:01:02.1234567 +0000 UTC
From the docs:
// Fractional seconds can be printed by adding a run of 0s or 9s after
// a decimal point in the seconds value in the layout string.
// If the layout digits are 0s, the fractional second is of the specified
// width. Note that the output has a trailing zero.
do("0s for fraction", "15:04:05.00000", "11:06:39.12340")
// If the fraction in the layout is 9s, trailing zeros are dropped.
do("9s for fraction", "15:04:05.99999999", "11:06:39.1234")
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论