Date &引用;“月超出范围”;分析不带分隔符的日期时
如何让golang正确解析日期字符串(如Date &引用;“月超出范围”;分析不带分隔符的日期时,date,go,time,Date,Go,Time,如何让golang正确解析日期字符串(如31916 我不断收到超出范围的个月的错误 date, err := time.Parse("1206", "31916") fmt.Println(date, err) 当然,我希望将月份视为3,而不是31,但我不确定如何强制它在向格式添加分隔符之外的月份停止在3 package main import ( "fmt" "time" ) func parseDate(date string) (time.Time, error) {
31916
我不断收到超出范围的个月的错误
date, err := time.Parse("1206", "31916")
fmt.Println(date, err)
当然,我希望将月份视为3,而不是31,但我不确定如何强制它在向格式添加分隔符之外的月份停止在3
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>
2016-03-19 00:00:00+0000 UTC
2016-03-19 00:00:00+0000 UTC
2016-12-19 00:00:00+0000 UTC
你不能。您传递的布局是不确定的-无法知道字符串中的月结束和日开始时间-此外,当一个选项失败而另一个选项没有失败时(想想“11106”
-就是1\11\06
或11\1\06
?)。您最好编写一个包装器,使选择具有确定性:
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)
}
导入(
“时间”
“strconv”
)
func parseWeirdLayout(日期字符串)(time.time,错误){
解析字符串:=“”
如果len(dateString)==5{
月份,错误:=strconv.Atoi(日期字符串[0:2])
如果错误!=零{
返回时间.Now(),错误
}
如果月份<1 | |月份>12{
parsedString=“0”+日期字符串
}否则{
parsedString=dateString[:2]+“0”+日期字符串[2:]
}
}如果len(dateString)==4,则为else{
parsedString=“0”+日期字符串[:1]+“0”+日期字符串[1:]
}
返回time.Parse(“010206”,parsedString)
}
在此处测试:
或者简单地使用不同的确定性布局,例如
“010206”
对不起,我不了解您的格式。。什么日期是31916?您是否像2016年3月19日那样尝试?这是一个疯狂的想法:您可能已将格式更改为1 2 06
,并使用空格生成31916
的所有排列。只有16种组合。然后逐一检查。