【发布时间】:2019-12-10 05:13:22
【问题描述】:
我有一个日期格式为 dd.mm.yyyy 的文件(例如 31.12.2019)。 我想转换成格式 yyyy-mm-dd(例如 2019-12-31)。
在 Notepad++ 中,我可以使用反向引用对这些字符串进行搜索和替换:
搜索:
(\d{2}).(\d{2}).(\d{4})
替换:
\3-\2-\1
我将如何使用 Go 执行此操作?
【问题讨论】:
我有一个日期格式为 dd.mm.yyyy 的文件(例如 31.12.2019)。 我想转换成格式 yyyy-mm-dd(例如 2019-12-31)。
在 Notepad++ 中,我可以使用反向引用对这些字符串进行搜索和替换:
搜索:
(\d{2}).(\d{2}).(\d{4})
替换:
\3-\2-\1
我将如何使用 Go 执行此操作?
【问题讨论】:
你可以通过分割你的输入字符串,并以不同的顺序组装部件来做到这一点:
func transform(s string) string {
d, m, y := s[:2], s[3:5], s[6:]
return y + "-" + m + "-" + d
}
注意:上述函数不会验证输入,如果输入短于 6 个字节,它可能会崩溃。
如果您需要输入验证(包括日期验证),您可以使用time 包来解析日期,并将其格式化为您的预期输出:
func transform2(s string) (string, error) {
t, err := time.Parse("02.01.2006", s)
if err != nil {
return "", err
}
return t.Format("2006-01-02"), nil
}
测试上述功能:
fmt.Println(transform("31.12.2019"))
fmt.Println(transform2("31.12.2019"))
输出(在 Go Playground 上尝试):
2019-12-31
2019-12-31 <nil>
【讨论】:
strings.Split() 拆分行,然后您将获得日期。然后,您可以使用此处介绍的转换。您也可以使用encoding/csv 将文件作为 CSV 读取/处理,然后通过读取行来获得“单元格”。
正则表达式可能是矫枉过正,因为您有如此明确的输入。这个怎么样:
var dmy = strings.Split("31.12.2019",".")
var mdy = []string{dmy[1],dmy[0],dmy[2]}
fmt.Println(strings.Join(mdy, "-"))
【讨论】: