解析日期时没有分隔符的“月份超出范围”

时间:2017-09-19 21:31:09

标签: date go time

如何让golang正确解析日期字符串,例如31916 我一直在月份超出范围错误。

date, err := time.Parse("1206", "31916")
fmt.Println(date, err)

当然我想将月份视为3而不是31就像它正在做的那样,但是我不确定如何在将分隔符添加到格式之外的时候强制它在3个月停止。

2 个答案:

答案 0 :(得分:5)

例如,

package main

import (
    "fmt"
    "time"
)

func parseDate(date string) (time.Time, error) {
    if len(date) == 5 {
        date = "0" + date
    }
    return time.Parse("010206", date)

}

func main() {
    date, err := parseDate("31916")
    fmt.Println(date, err)
    date, err = parseDate("031916")
    fmt.Println(date, err)
    date, err = parseDate("121916")
    fmt.Println(date, err)
}

输出:

2016-03-19 00:00:00 +0000 UTC <nil>
2016-03-19 00:00:00 +0000 UTC <nil>
2016-12-19 00:00:00 +0000 UTC <nil>

答案 1 :(得分:4)

你做不到。你传递的布局不是确定性的 - 没有办法让Go知道什么时候月份结束而且你的字符串中的一天开始 - 除了一个选项失败而另一个选项失败(想到<?php $MostRecentQuestionType = "SimplifyingFractions"; $MostRecentQuestionTypeExploded = preg_replace('/(?=[A-Z])/'," ",$MostRecentQuestionType); print($MostRecentQuestionTypeExploded); ) - 是"11106"1\11\06?)。最好的办法是编写一个包装器,使选择具有确定性:

11\1\06

在此测试:https://play.golang.org/p/u1QFPzehMj

或者只是使用不同的确定性布局,例如import ( "time" "strconv" ) func parseWeirdLayout(dateString string) (time.Time, error) { parsedString := "" if len(dateString) == 5 { month, err := strconv.Atoi(dateString[0:2]) if err != nil { return time.Now(), err } if month < 1 || month > 12 { parsedString = "0" + dateString } else { parsedString = dateString[:2] + "0" + dateString[2:] } } else if len(dateString) == 4 { parsedString = "0" + dateString[:1] + "0" + dateString[1:] } return time.Parse("010206", parsedString) }