go - 解析格式为 HHMMSS00 的时间

标签 go time sage-erp

我正在处理来自多个来源的一些数据,其中一个来源是 Sage ERP 系统。

我正在尝试特别引用 Sage 中的两个文件,审计日期和审计时间(AUDTDATEAUDTTIME)。

我需要解析它并将其作为 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.Sprintf0 填充 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/

相关文章:

go - 使用 go get 安装 gozmq 时出现问题

google-app-engine - 在 app.yaml 上指定的环境变量,但未在 main.go 上获取

android - 如何在android中像时间轴一样转换日期和时间?

.net - ACCPAC 缺少方法异常

java - 您可以使用 Java 直接连接 "ODBC data source"吗?

function - 在对象 slice 内搜索关键属性的简洁 Golang 方式

go - 测试 Go http.Request.FormFile?

c - 打印给定日期的工作日,输入扫描时出现问题

python Pandas : getting session start and end time to calculate session length