Time 正在分析不是';标准&x27;格式
如何解析Go中的非标准日期/时间字符串。例如,如果我想将字符串Time 正在分析不是';标准&x27;格式,time,go,Time,Go,如何解析Go中的非标准日期/时间字符串。例如,如果我想将字符串10/15/1983转换为time.time?time.Parse()函数应该允许您指定格式 这导致了恐慌 panic:将时间“10/15/1983”解析为“10/15/1983”:无法将“”解析为“0/” 从逻辑上讲,这是有道理的,因为它应该如何知道哪一天和哪一个月 其他语言具有与以下类似的功能: parse(“mm/dd/yyyy”,“10/15/1983”) 我在Go文档中找不到这样的函数,这是我唯一的regex选择吗?tim
10/15/1983
转换为time.time
?time.Parse()
函数应该允许您指定格式
这导致了恐慌
panic:将时间“10/15/1983”解析为“10/15/1983”:无法将“”解析为“0/”
从逻辑上讲,这是有道理的,因为它应该如何知道哪一天和哪一个月
其他语言具有与以下类似的功能:
parse(“mm/dd/yyyy”,“10/15/1983”)
我在Go文档中找不到这样的函数,这是我唯一的regex选择吗?time.Parse正在寻找一些键值 通过改变:
test, err := time.Parse("10/15/1983", "10/15/1983")
到
解析器将识别它
这是我的建议
您可以利用文件中的常量列表创建自己的解析格式
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")
如果您记不起指定布局(“2006-01-02T15:04:05.000Z”)中的数字,可以使用我的简单日期格式库,该库使用MS Excel约定,如Y、M、D、h,并在内部将它们转换为数字格式:
package main
import (
"github.com/metakeule/fmtdate"
"fmt"
)
func main() {
test, err := fmtdate.Parse("MM/DD/YYYY", "10/15/1983")
if err != nil {
panic(err)
}
fmt.Println(test)
}
如果您正在寻找一个C风格的格式化函数:在查看了我选择的一些选项之后,因为它通常遵循strfmt(3)表示法 举个例子:
import (
"fmt"
"time"
"github.com/cactus/gostrftime"
)
func main() {
now := time.Now()
fmt.Println(gostrftime.Format("%Y-%m-%d", now))
}
如果C和Go都必须使用日期格式,并且不涉及C实现,那么就别无选择,只能在Go端进行调整。上述软件包满足了这一需求。如果您不想费心记住这些神奇的数字,您可以这样做:
package main
import (
"fmt"
"time"
)
func main() {
var (
y, d int
m time.Month
)
fmt.Sscanf("10/15/1983", "%v/%v/%v", &m, &d, &y)
t := time.Date(y, m, d, 0, 0, 0, 0, time.UTC)
fmt.Println(t) // 1983-10-15 00:00:00 +0000 UTC
}
您可能想看看Paul Smith,您的代码是否有效,但为什么?如果我将其更改为
time.Parse(“01/02/2005”、“10/15/1983”)
它将失败。。。与2005年、2004年、1990年等相比,2006年的神奇之处是什么?在重新阅读这些文件后,我认为这一点可以在其中更清楚地表达出来。我举了几个真实世界的例子来说明这一点。在我徒劳的尝试中,我尝试了诸如time.Parse(“stdLongMonth/stdLongDay/stdLongYear”,“10/15/83”)
=p.Wow,Go文档可能会提到你在日期格式中使用的数字实际上很重要。嗨,Nuncleon。你犯了两个错误。首先,您为您的格式选择了错误的常量:应该是stdzeromount/stdZeroDay/stdYear,其次,您需要使用此常量的值。因此,对于您的案例,您需要这样解析:time.parse(“01/02/06”、“10/15/83”)
这是一种多么狡猾的方法!谢谢你的解释+1对于记不住的人,1,2,3,4,5,6,7(01/02 03:04:05 PM'06-07)??至少strftime格式字符串支持更多内容,您的电子表格格式甚至没有12小时的am/pm支持,因此在几个方面是一种倒退。@DaveC我们德国人不认为am/pm格式,所以15到3是一种思维转变,您还必须记住顺序:天、月、小时/下午、分钟、秒、年、时区。今年的情况很奇怪。然而,我总是要查找它,我不是唯一一个。。。。另外,对于不熟悉go time格式的人来说,excel格式显然是一种格式,不能与真实日期混淆。@DaveC我已经更新了库以支持时区和AM/PM。少了什么?
package main
import (
"github.com/metakeule/fmtdate"
"fmt"
)
func main() {
test, err := fmtdate.Parse("MM/DD/YYYY", "10/15/1983")
if err != nil {
panic(err)
}
fmt.Println(test)
}
import (
"fmt"
"time"
"github.com/cactus/gostrftime"
)
func main() {
now := time.Now()
fmt.Println(gostrftime.Format("%Y-%m-%d", now))
}
package main
import (
"fmt"
"time"
)
func main() {
var (
y, d int
m time.Month
)
fmt.Sscanf("10/15/1983", "%v/%v/%v", &m, &d, &y)
t := time.Date(y, m, d, 0, 0, 0, 0, time.UTC)
fmt.Println(t) // 1983-10-15 00:00:00 +0000 UTC
}