【问题标题】:How to format date with default zone without the numeric offset如何使用没有数字偏移的默认区域格式化日期
【发布时间】:2020-01-06 07:24:43
【问题描述】:

如果我将数据库中的日期扫描到包含 time.Time 中的日期的结构中,默认情况下它将像这样打印:

"2019-11-27T16:38:55+07:00"

有没有办法像这样格式化它,而无需重新解析所有具有 time.Time 类型的内容?

"0001-01-01T00:00:00Z"

我可以手动重新格式化所有内容,但必须有更好的方法。因为我正在扫描一个切片,所以要重新格式化日期,我必须循环结果才能做到这一点。

有什么建议吗?

【问题讨论】:

  • 这种格式是什么意思?您是否只想转换为 UTC 时间并输入 "Z" 而不是数字偏移量?
  • 是的,但我想尽可能避免重新格式化它,因为默认情况下它有数字偏移量而不是 Z。
  • 我认为你必须重新格式化(如果我理解你的话),因为打印时间的方式首先只是格式化的事情,因为不同的查看时间实际上可能指的是同一瞬间。例如"2020-01-05T23:34:17-08:00"2020-01-06T07:34:17Z 是同一时间。

标签: date datetime go datetime-format


【解决方案1】:

您可以使用time.Time.UTC()方法获取UTC时区的时间值,然后将其重新格式化为字符串,然后您将获得与UTC等效的日期。

str1 := "2019-11-27T16:38:55+07:00"
tme1, _ := time.Parse(time.RFC3339, str1)

tme2 := tme1.UTC()
str2 := tme2.Format(time.RFC3339)

fmt.Println("str1", str1) // str1 2019-11-27T16:38:55+07:00
fmt.Println("str2", str2) // str2 2019-11-27T09:38:55Z

工作场所https://play.golang.org/p/7uRKDeRZBUx


这是一个将由前端应用程序使用的 API,它需要像这样格式化。

无论是使用 javascript、go 还是任何其他编程/脚本语言,在不同时区解析等效的日期字符串都会产生等效的日期。看看下面js中的例子:

console.log(new Date("2019-11-27T16:38:55+07:00").toString())
// "Wed Nov 27 2019 16:38:55 GMT+0700 (Western Indonesia Time)"

console.log(new Date("2019-11-27T09:38:55Z").toString())
// "Wed Nov 27 2019 16:38:55 GMT+0700 (Western Indonesia Time)"

看到两个日期解析操作在被解析转换成字符串后生成相同的字符串

【讨论】:

  • 从技术上讲,这是我想要避免的。我正在从数据库中扫描一段结构,这样我必须循环才能重新格式化日期。我想没有别的办法了。
  • 我很好奇为什么你需要它在 UTC 时区,因为两者是等价的。在进行选择条件操作或将其格式化为日期时间对象上的字符串时,您不会得到任何不同的结果
  • 这是一个将被前端应用程序使用的 API,它需要像这样格式化。
  • 即使在前端,如果 js 正确执行解析,无论是 UTC 还是其他时区格式 - 两个日期仍然是等效的
  • @RizkiHadiaturrasyid 我不确定您是否了解时区的工作原理。但请看看我更新的答案:)
猜你喜欢
  • 2013-06-29
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多