当前位置: 首页 > 面试题库 >

解析非“标准”格式的日期/时间字符串

左仰岳
2023-03-14
问题内容

如何在Go中解析非标准的日期/时间字符串。例如,如果我想将字符串10/15/1983转换为time.Time?该time.Parse()功能应该允许您指定格式。

http://play.golang.org/p/v5DbowXt1x

package main

import "fmt"
import "time"

func main() {
    test, err := time.Parse("10/15/1983", "10/15/1983")
    if err != nil {
        panic(err)
    }

    fmt.Println(test)
}

这导致了恐慌。

panic: parsing time "10/15/1983" as "10/15/1983": cannot parse "" as "0/"

逻辑上讲这是有道理的,因为它应该如何知道哪一天和哪一个月。

其他语言具有类似于以下功能:

parse("mm/dd/yyyy", "10/15/1983")

我在Go文档中找不到这样的功能,我唯一选择正则表达式吗?


问题答案:

time.Parse正在寻找一些关键值。

通过更改:

test, err := time.Parse("10/15/1983", "10/15/1983")

test, err := time.Parse("01/02/2006", "10/15/1983")

解析器将识别出它。

这是操场上修改后的代码。

package main

import "fmt"
import "time"

func main() {
    test, err := time.Parse("01/02/2006", "10/15/1983")
    if err != nil {
        panic(err)
    }

    fmt.Println(test)
}

您可以利用src / pkg / time /
format.go
文件中的常量列表来创建自己的解析格式。

const (
    stdLongMonth      = "January"
    stdMonth          = "Jan"
    stdNumMonth       = "1"
    stdZeroMonth      = "01"
    stdLongWeekDay    = "Monday"
    stdWeekDay        = "Mon"
    stdDay            = "2"
    stdUnderDay       = "_2"
    stdZeroDay        = "02"
    stdHour           = "15"
    stdHour12         = "3"
    stdZeroHour12     = "03"
    stdMinute         = "4"
    stdZeroMinute     = "04"
    stdSecond         = "5"
    stdZeroSecond     = "05"
    stdLongYear       = "2006"
    stdYear           = "06"
    stdPM             = "PM"
    stdpm             = "pm"
    stdTZ             = "MST"
    stdISO8601TZ      = "Z0700"  // prints Z for UTC
    stdISO8601ColonTZ = "Z07:00" // prints Z for UTC
    stdNumTZ          = "-0700"  // always numeric
    stdNumShortTZ     = "-07"    // always numeric
    stdNumColonTZ     = "-07:00" // always numeric
)

因此,只要您的格式指定年份,就应使用“ 06”或“ 2006”完成,用“ 05”或“ 5”指定秒,并在“ MST”,“ Z0700”,“
Z07:00”中指定时区”,“-0700”,“-07”或“ -07:00”。如果您引用常量列表,则可以将需要解析的任何标准格式组合在一起。

例如,如果要以“
通用日志格式”(Apache的日志文件)格式解析日期/时间,可以通过将以下字符串time.Parse()作为
布局 参数传递来实现。

"02/Jan/2006:15:04:05 -0700"

“ 02”表示月份的日期字段,“ Jan”表示月份的名称字段,“ 2006”表示年份的字段,“ 15”表示24小时格式的一天中的小时字段,“
04”表示分钟的字段, “ 05”表示秒字段,“-0700”表示时区字段。

该格式将解析当前的PST时间: 31/Dec/2012:15:32:25 -0800

因此,time.Parse()调用将如下所示:

test, err := time.Parse("02/Jan/2006:15:04:05 -0700", "31/Dec/2012:15:32:25 -0800")


 类似资料:
  • 我有一个文件,可以有日期修改值与日期或日期时间的格式。我曾将该值解析为: 现在,字符串也可以是

  • 问题内容: 可以说我有以下json 我想将其解码为以下结构 像这样 这给了我错误 如果我要手动解析它,我会这样做 但是,当时间值来自json字符串时 ,我如何使解码器以上述格式解析它? 问题答案: 在这种情况下,您需要实现自定义编组和非编组功能。 通过遵循json包的Golang文档中的示例,您将获得以下内容:

  • 本实例演示了如何通过DateFormat类的parse方法根据不同的本地环境解析日期/时间字符串,并将其转换成Date对象。在最后还演示了parse方法如何解析不符合日期/时间逻辑的字符串。 例子 : 解析日期/时间字符串 实例的代码如下: package chapter8; import java.text.DateFormat; import java.util.Date; import ja

  • 我有一个格式化的字符串日期 2020/04/16 (年/月/日) 我想把这个字符串解析成日期时间 显然不起作用,没有正确的日期格式。 有人知道把这个字符串解析成日期时间的最好方法是什么吗?

  • 我有一个变量,它包含以下值: 我目前正在使用以下代码将其格式化为字符串:.使用此代码,我得到以下值: 我需要这个更准确。我想要得到的精确值在以下精度范围内: 我在以下链接上做了一些研究:http://www.w3.org/TR/NOTE-datetime 以下是我的发现: 此配置文件没有指定可以使用多少位数来表示每秒的小数部分。允许分数秒的采用标准必须规定最小位数(大于或等于一的数字)和最大位数(

  • 问题内容: 我有一个日期字符串,格式为“ 2020年2月15日星期一”。我想将格式更改为。我怎样才能做到这一点? 问题答案: 模块可以帮助你: 对于特定示例,你可以执行