Golang解析带逗号的日期字符串
Golang解析带逗号的日期字符串 我正在尝试解析一个格式如下的日期字符串:2019-08-09T01:02:03,444,但似乎无法使用标准格式创建包含逗号的布局,例如"2006-01-02T15:04:05,000"。我似乎只能使用点号(".")来分隔秒和毫秒。如果我在布局中使用点号,并通过strings.Replace()将时间字符串中的逗号替换为点号,一切都能正常工作。
我是不是遗漏了什么?
谢谢
不,你并没有遗漏什么。Go语言无法处理使用逗号而非点号的小数。这个例子很简单,但如果是123,456呢?在瑞典这可能表示带三位小数的小数,而在美国可能表示六位数的整数。
func main() {
fmt.Println("hello world")
}
更多关于Golang解析带逗号的日期字符串的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你好约翰,
是的,我在德国生活过,所以看到像 123.456,789 这样的数字并不会让我困扰。我想我的问题在于我习惯了 Python 中的 strptime() 函数,它允许使用格式化。所以对我来说,不能直接说"嘿,用逗号来分隔秒和毫秒部分"似乎有点奇怪。目前,我猜我会直接把逗号替换成句号然后就这样处理。
谢谢,
罗伯
在Go语言中,时间解析的布局必须严格匹配输入字符串的格式。对于包含逗号作为小数秒分隔符的日期字符串(如"2019-08-09T01:02:03,444"),确实需要将逗号替换为点号才能正确解析,因为Go的time包在布局中只识别点号(.)作为小数秒的分隔符。
以下是示例代码,展示如何解析这种格式的日期字符串:
package main
import (
"fmt"
"strings"
"time"
)
func main() {
dateStr := "2019-08-09T01:02:03,444"
// 将逗号替换为点号
normalizedStr := strings.Replace(dateStr, ",", ".", 1)
// 使用标准布局解析,布局中小数秒使用点号
layout := "2006-01-02T15:04:05.000"
t, err := time.Parse(layout, normalizedStr)
if err != nil {
fmt.Printf("解析错误: %v\n", err)
return
}
fmt.Printf("解析成功: %v\n", t)
// 输出: 解析成功: 2019-08-09 01:02:03.444 +0000 UTC
}
如果必须保留原始字符串中的逗号而不进行替换,可以手动解析日期部分和小数秒部分,然后组合成time.Time对象:
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
func main() {
dateStr := "2019-08-09T01:02:03,444"
// 分割日期部分和小数秒部分
parts := strings.Split(dateStr, ",")
if len(parts) != 2 {
fmt.Println("无效的日期格式")
return
}
// 解析日期和时间部分(不含小数秒)
layout := "2006-01-02T15:04:05"
t, err := time.Parse(layout, parts[0])
if err != nil {
fmt.Printf("解析日期部分错误: %v\n", err)
return
}
// 解析毫秒部分
millis, err := strconv.Atoi(parts[1])
if err != nil {
fmt.Printf("解析毫秒部分错误: %v\n", err)
return
}
// 添加毫秒到时间对象
t = t.Add(time.Duration(millis) * time.Millisecond)
fmt.Printf("解析成功: %v\n", t)
// 输出: 解析成功: 2019-08-09 01:02:03.444 +0000 UTC
}
第一种方法更简洁,推荐使用。Go的time包设计如此,布局中的小数点固定为点号,因此预处理输入字符串是标准做法。

