3

我正在处理来自多个来源的一些数据,其中一个来源是 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]
}

有没有办法在不经历上述情况的情况下做到这一点?也许本机与时间包?

4

1 回答 1

4

假设您要从数据库中拉回 2 个单独的值,您可以使用fmt.Sprintfto 0pad 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/

于 2017-08-22T05:03:03.847 回答