【问题标题】:"month out of range" when parsing date without separators解析没有分隔符的日期时出现“超出范围的月份”
【发布时间】:2017-09-19 21:31:08
【问题描述】:

任何想法如何让 golang 正确解析日期字符串,例如 31916 我不断收到 month out of range 错误。

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

当然,我想将月份视为 3 而不是 31,但我不知道如何强制它在该月份停止在 3 处,而不是在格式中添加分隔符。

【问题讨论】:

  • 抱歉,我没看懂你的格式。31916 是几号日期?你在尝试像 2016 年 3 月 19 日那样吗?
  • 一个疯狂的想法:您可能已将格式更改为 1 2 06 并生成带有空格的 31916 的所有排列。这将只有 16 种组合。然后检查每个。

标签: date go time


【解决方案1】:

例如,

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>

【讨论】:

    【解决方案2】:

    你不能。您传递的布局不是确定性的 - Go 无法知道字符串中的月份结束和日期开始时间 - 除了一个选项失败而另一个选项失败时(想想"11106" - 是@987654323 @ 或 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)
    }
    

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

    或者只是使用不同的确定性布局,例如"010206".

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 2017-07-29
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多