如何解决如何使用时间包以“2nd Jan 2006”时间格式将时间格式化为字符串
我希望在 Go 中使用“2020 年 12 月 31 日”格式的日期。
time := 2020-12-31
wantedFormat := time.Format("2nd Jan 2006")
但是当我打印 wantFormat 时,它给出的值为 2020 年 12 月 31 日。我希望它是 31 日。我怎样才能得到我期待的答案?
解决方法
我同意 Lucas 的观点,您应该查看时间包和可用格式。
我还没有真正收到对我之前澄清的回复,但我想我可以尝试一下答案,假设您希望代码做最聪明的事情(即处理各种不同的日期)。
您可以从时间字符串中提取日期值,然后将其传递给开关以选择合适的后缀 st
、nd
、rd
或 th
。
myTime := "2020-12-10"
extractedDateFromMyTime := myTime[len(myTime) - 2 : len(myTime)]
dateInt,_ := strconv.Atoi(extractedDateFromMyTime)
suffix := ""
if Abs(dateInt) >= 10 && Abs(dateInt) <= 19 {
suffix = "th"
} else {
switch Abs(dateInt) % 10 {
case 1:
suffix = "st"
case 2:
suffix = "nd"
case 3:
suffix = "rd"
default:
suffix = "th"
}
}
myFormat := "2" + suffix + " Jan 2006"
t,_ := time.Parse(layoutISO,myTime)
上面的这段代码通过提取日期(从末尾开始的两个字符)后取绝对值来处理 2020-12-01
和 2020-12-1
(没有零)的情况。所以它假设这种格式将被维护并且不会像 2020 Dec 1
这样的东西。我没有展示绝对功能,但我认为这对你来说很容易实现(另见我共享的 golang 游乐场)
这是一个示例输出:
myTime: 2020-12-10
Extracted Date from myTime: 10
10th Dec 2020
myTime: 2020-12-31
Extracted Date from myTime: 31
31st Dec 2020
最后,这里是 go playground 链接:https://play.golang.org/p/7cBg55Vp0mm
,time
包不能对数字进行序号。
所以你应该做的是使用 time
包只格式化月份和年份部分,并自己处理日期排序(并连接结果)。
有序化并不难:
func Ordinalize(x int) string {
if x >= 10 && x < 19 {
return fmt.Sprint(x,"th")
}
switch x % 10 { // the last digit
case 1:
return fmt.Sprint(x,"st")
case 2:
return fmt.Sprint(x,"nd")
case 3:
return fmt.Sprint(x,"rd")
}
return fmt.Sprint(x,"th")
}
使用这个助手,你想要的格式是这样组合的:
s := Ordinalize(t.Day()) + t.Format(" Jan 2006")
在所有可能的日子里测试它:
for day := 1; day <= 31; day++ {
t := time.Date(2020,time.December,day,time.UTC)
s := Ordinalize(t.Day()) + t.Format(" Jan 2006")
fmt.Println(s)
}
输出(在 Go Playground 上尝试):
1st Dec 2020
2nd Dec 2020
3rd Dec 2020
4th Dec 2020
5th Dec 2020
6th Dec 2020
7th Dec 2020
8th Dec 2020
9th Dec 2020
10th Dec 2020
11th Dec 2020
12th Dec 2020
13th Dec 2020
14th Dec 2020
15th Dec 2020
16th Dec 2020
17th Dec 2020
18th Dec 2020
19th Dec 2020
20th Dec 2020
21st Dec 2020
22nd Dec 2020
23rd Dec 2020
24th Dec 2020
25th Dec 2020
26th Dec 2020
27th Dec 2020
28th Dec 2020
29th Dec 2020
30th Dec 2020
31st Dec 2020
,
正如 m_vemuri 所说,st
不是 go 任何标准格式的一部分。请从 Go 官方文档中查看此 example。
whole time package documentation
这是您应该如何处理它的示例:
package main
import (
"fmt"
"time"
)
func main() {
t,err := time.Parse(time.UnixDate,"Wed Feb 25 11:06:39 PST 2015")
if err != nil { // Always check errors even if they should not happen.
panic(err)
}
// time.Time's Stringer method is useful without any format.
fmt.Println("default format:",t)
// Predefined constants in the package implement common layouts.
fmt.Println("Unix format:",t.Format(time.UnixDate))
// The time zone attached to the time value affects its output.
fmt.Println("Same,in UTC:",t.UTC().Format(time.UnixDate))
}
以下是可用的 formats:
const (
ANSIC = "Mon Jan _2 15:04:05 2006"
UnixDate = "Mon Jan _2 15:04:05 MST 2006"
RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
RFC822 = "02 Jan 06 15:04 MST"
RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
RFC850 = "Monday,02-Jan-06 15:04:05 MST"
RFC1123 = "Mon,02 Jan 2006 15:04:05 MST"
RFC1123Z = "Mon,02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
RFC3339 = "2006-01-02T15:04:05Z07:00"
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Kitchen = "3:04PM"
// Handy time stamps.
Stamp = "Jan _2 15:04:05"
StampMilli = "Jan _2 15:04:05.000"
StampMicro = "Jan _2 15:04:05.000000"
StampNano = "Jan _2 15:04:05.000000000"
)
,
我建议您使用 goment library 因为它也支持 i18n,例如:
func main() {
g,err := goment.New(time.Date(2015,11,10,5,30,time.UTC))
if err != nil {
panic(err)
}
fmt.Println(g.Format("DD-MM-YYYY"))
fmt.Println(g.Format("Do"))
g.SetLocale("es")
fmt.Println(g.Format("Do"))
}
将输出:
10-11-2015
10th
10º
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。