我正在处理来自多个来源的一些数据,其中一个来源是 Sage ERP 系统。
我正在尝试特别引用 Sage 中的两个文件,审计日期和审计时间(AUDTDATE
和 AUDTTIME
)。
我需要解析它并将其作为 DATETIME 存储在 Microsoft SQL Server 数据库中。
目前,我只是想找出解析它的最佳方法。
数据的示例如下所示:
+----------+----------+
| AUDTDATE | AUDTTIME |
+----------+----------+
| 20170228 | 5013756 |
+----------+----------+
AUDTDATE
是 yyyymmdd 格式,AUDTTIME
是 HHMMSS00。
所以我尝试了下面的测试:
func main() {
value := "20170228 5013756"
layout := "20060102 15040500"
t, _ := time.Parse(layout, value)
fmt.Println(t)
}
这不起作用,它在运行时仅返回 0001-01-01 00:00:00 +0000 UTC
。
如果我将时间更改为此 050137
并将布局更改为 150405
那么这工作正常:
func main() {
value := "20170228 050137"
layout := "20060102 150405"
t, _ := time.Parse(layout, value)
fmt.Println(t)
}
我能想到的处理这个问题的一种方法是从末尾去掉毫秒,然后检查长度,如果需要的话,在开头添加一个零。
这似乎是一个非常丑陋的解决方案,并且涉及到做这样的事情:
func main() {
date := "20170228"
timeString := "5013756"
value := date + prepareTime(timeString)
layout := "20060102150405"
t, _ := time.Parse(layout, value)
fmt.Println(t)
}
func prepareTime(time string) string {
if len(time) == 7 {
time = "0" + time
}
return time[:6]
}
有没有办法不经过上述步骤就可以做到这一点?也许是原生的时间包?
最佳答案
假设您要从数据库中拉回 2 个单独的值,您可以使用 fmt.Sprintf
来 0
填充 timeString
。将它与 date
字符串结合使用,您可以使用以下内容:
value := fmt.Sprintf("%s %08s", date, timeString)[:15]
在您的代码中:
func main() {
date := "20170228"
timeString := "5013756"
value := fmt.Sprintf("%s %08s", date, timeString)[:15]
layout := "20060102 150405"
t, _ := time.Parse(layout, value)
fmt.Println(t)
}
结果:
2017-02-28 05:01:37 +0000 UTC
这种方法很有用,因为它还可以正确填充任何较短的时间值,例如13756
将转换为 00013756
。
fmt.Sprintf
函数可用于将参数格式化为字符串,使用格式字符串和参数列表 (...interface{}
)。格式字符串告诉函数如何呈现参数。
此格式字符串使用了两项注意事项:
- 字符串动词 (
%s
):格式字符串使用各种用于字符串替换的动词
。%s
是专门用来渲染字符串或者 slice 的。其他流行的动词包括用于 10 进制整数的%d
和用于 float 的%f
文档中有完整列表。%v
动词非常有用,也可以在这里使用,因为它将呈现参数的默认值。 0
左填充:要0
左填充参数,请使用0
后跟动词中的长度数字%
。这将在参数前面加上长度数字中指定的最大数量的0
。例如,%08s
将呈现一个带有最多 8 个前置零的字符串。这意味着字符串""
将是"00000000"
而字符串"1234567"
将导致"01234567"
。如果字符串比长度长,则不会添加任何内容。
来自文档:
%s the uninterpreted bytes of the string or slice
0 pad with leading zeros rather than spaces;
for numbers, this moves the padding after the sign
文档中提供了更多详细信息:https://golang.org/pkg/fmt/
关于go - 解析格式为 HHMMSS00 的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45808852/