解析格式为 HHMMSS00 的时间
Parsing a time with the format HHMMSS00
我正在处理来自多个来源的一些数据,其中一个来源是 Sage ERP 系统。
我正在尝试引用 Sage 中的两个文件,特别是审计日期和审计时间(AUDTDATE
和 AUDTTIME
)。
我需要解析它并将其作为 DATETIME 存储在 Microsoft SQL 服务器数据库中。
目前,我只是想找出解析它的最佳方法。
数据的示例如下:
+----------+----------+
| AUDTDATE | AUDTTIME |
+----------+----------+
| 20170228 | 5013756 |
+----------+----------+
AUDTDATE
是 yyyymmdd 格式,AUDTTIME
是 HHMMSS00。
所以我尝试了下面的测试:
func main() {
value := "20170228 5013756"
layout := "20060102 15040500"
t, _ := time.Parse(layout, value)
fmt.Println(t)
}
这不起作用,当 运行.
时 returns 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
):格式字符串使用了多种用于字符串替换的verbs
。 %s
是专门用来渲染一个字符串或者一个切片的。其他流行的动词包括 %d
表示以 10 为底的整数和 %f
表示浮点数,文档中有完整列表。 %v
动词非常有用,也可以在这里使用,因为它将呈现参数的默认值。
0
左填充:要0
左填充参数,请使用0
后跟动词中%
之后的长度数字。这将在参数前面加上长度数字中指定的最大数量 0
s。例如,%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/
我正在处理来自多个来源的一些数据,其中一个来源是 Sage ERP 系统。
我正在尝试引用 Sage 中的两个文件,特别是审计日期和审计时间(AUDTDATE
和 AUDTTIME
)。
我需要解析它并将其作为 DATETIME 存储在 Microsoft SQL 服务器数据库中。
目前,我只是想找出解析它的最佳方法。
数据的示例如下:
+----------+----------+
| AUDTDATE | AUDTTIME |
+----------+----------+
| 20170228 | 5013756 |
+----------+----------+
AUDTDATE
是 yyyymmdd 格式,AUDTTIME
是 HHMMSS00。
所以我尝试了下面的测试:
func main() {
value := "20170228 5013756"
layout := "20060102 15040500"
t, _ := time.Parse(layout, value)
fmt.Println(t)
}
这不起作用,当 运行.
时 returns0001-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
):格式字符串使用了多种用于字符串替换的verbs
。%s
是专门用来渲染一个字符串或者一个切片的。其他流行的动词包括%d
表示以 10 为底的整数和%f
表示浮点数,文档中有完整列表。%v
动词非常有用,也可以在这里使用,因为它将呈现参数的默认值。 0
左填充:要0
左填充参数,请使用0
后跟动词中%
之后的长度数字。这将在参数前面加上长度数字中指定的最大数量0
s。例如,%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/