提升编程技能:学习如何在Go语言中正确格式化时间

 更新时间:2024年01月16日 08:37:04   作者:白如意i  
想知道如何在Go语言中轻松地格式化时间吗?别再浪费时间了!本文将带你快速入门,让你的代码更加优雅高效,快来学习吧!

先来看一个简单的例子:

package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println(time.Now().Format("2006"))
}

我们会觉得这会输出什么呢?输出的是 2022,也就是当前年份。

另一个例子:

package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
}

输出:2022-08-04 09:43:56

如果之前写其他语言的,看到这个结果估计和我一样觉得百思不得其解,为什么不是 Y-m-d H:i:s 这种格式呢?而且那个参数看起来就是一个时间戳。

那个参数真的是时间戳吗?

答案我们可以点开 Format 的源码看看就知道了:

func (t Time) Format(layout string) string {
	// ... 省略,下面这个调用才是关键
	b = t.AppendFormat(b, layout)
	// ... 省略
}

我们看到 Format 里面具体处理逻辑在 AppendFormat 函数里面,再点开 AppendFormat 看看:

switch std & stdMask {
    case stdYear:
        y := year
        if y < 0 {
            y = -y
        }
        b = appendInt(b, y%100, 2)
    case stdLongYear:
        b = appendInt(b, year, 4)
    case stdMonth:
        b = append(b, month.String()[:3]...)
    case stdLongMonth:
        m := month.String()
        b = append(b, m...)
    // ... 省略其他 case
}

我们可以看到里面的 stdYearstdLongYear 之类的常量实际上就是我们传入到 Format 的参数里面的数字。

const (
	_                        = iota
	stdLongMonth             = iota + stdNeedDate  // "January"
	stdMonth                                       // "Jan"
	stdNumMonth                                    // "1"
	stdZeroMonth                                   // "01"
	stdLongWeekDay                                 // "Monday"
	stdWeekDay                                     // "Mon"
	stdDay                                         // "2"
	stdUnderDay                                    // "_2"
	stdZeroDay                                     // "02"
	stdUnderYearDay                                // "__2"
	stdZeroYearDay                                 // "002"
	stdHour                  = iota + stdNeedClock // "15"
	stdHour12                                      // "3"
	stdZeroHour12                                  // "03"
	stdMinute                                      // "4"
	stdZeroMinute                                  // "04"
	stdSecond                                      // "5"
	stdZeroSecond                                  // "05"
	stdLongYear              = iota + stdNeedDate  // "2006"
	stdYear                                        // "06"
	stdPM                    = iota + stdNeedClock // "PM"
	stdpm                                          // "pm"
	stdTZ                    = iota                // "MST"
	stdISO8601TZ                                   // "Z0700"  // prints Z for UTC
	stdISO8601SecondsTZ                            // "Z070000"
	stdISO8601ShortTZ                              // "Z07"
	stdISO8601ColonTZ                              // "Z07:00" // prints Z for UTC
	stdISO8601ColonSecondsTZ                       // "Z07:00:00"
	stdNumTZ                                       // "-0700"  // always numeric
	stdNumSecondsTz                                // "-070000"
	stdNumShortTZ                                  // "-07"    // always numeric
	stdNumColonTZ                                  // "-07:00" // always numeric
	stdNumColonSecondsTZ                           // "-07:00:00"
	stdFracSecond0                                 // ".0", ".00", ... , trailing zeros included
	stdFracSecond9                                 // ".9", ".99", ..., trailing zeros omitted

	stdNeedDate       = 1 << 8             // need month, day, year
	stdNeedClock      = 2 << 8             // need hour, minute, second
	stdArgShift       = 16                 // extra argument in high bits, above low stdArgShift
	stdSeparatorShift = 28                 // extra argument in high 4 bits for fractional second separators
	stdMask           = 1<<stdArgShift - 1 // mask out argument
)

所以,其实答案已经有了,我们对照一下我们的参数 2006-01-02 15:04:05,可以很简单在上述常量里面找到对应的常量:

  • 2006 => stdLongYear
  • 01 => stdZeroMonth
  • 02 => stdZeroDay
  • 15 => stdHour
  • 04 => stdZeroMinute
  • 05 => stdZeroSecond

而 layout 参数里面的 - 以及 : 都会原样输出。

根据给出的这些常量,我们就可以将时间格式化为我们想要的格式了。

到此这篇关于提升编程技能:学习如何在Go语言中正确格式化时间的文章就介绍到这了,更多相关go 格式化时间内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言实现请求超时处理的方法总结

    Go语言实现请求超时处理的方法总结

    这篇文章主要为大家详细介绍了Go语言中实现请求的超时控制的方法,主要是通过timer和timerCtx来实现请求的超时控制,希望对大家有所帮助
    2023-05-05
  • golang image图片处理示例

    golang image图片处理示例

    这篇文章主要介绍了golang image图片处理的方法,结合实例形式分析了Go语言针对图片的打开、读取、转换等相关操作技巧,需要的朋友可以参考下
    2016-07-07
  • GO中的条件变量sync.Cond详解

    GO中的条件变量sync.Cond详解

    条件变量是基于互斥锁的,它必须基于互斥锁才能发挥作用,条件变量的初始化离不开互斥锁,并且它的方法有点也是基于互斥锁的,这篇文章主要介绍了GO的条件变量sync.Cond,需要的朋友可以参考下
    2023-01-01
  • go-spew调试利器详解

    go-spew调试利器详解

    这篇文章主要介绍了调试利器 go-spew,go-spew 可以以一种非常友好的方式输出完整的数据结构信息,go-spew 支持一些自定义配置,可以通过 spew.Config 修改,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • Go Resiliency库中timeout实现原理及源码解析

    Go Resiliency库中timeout实现原理及源码解析

    Go-Resiliency库中的timeout是一种基于协程的超时机制,通过创建协程来执行任务并设置超时时间,若任务执行时间超时则中止协程并返回错误,需要详细了解可以参考下文
    2023-05-05
  • 一篇文章读懂Golang init函数执行顺序

    一篇文章读懂Golang init函数执行顺序

    init()函数会在包被初始化后自动执行,并且在main()函数之前执行,但是需要注意的是init()以及main()函数都是无法被显式调用的,下面这篇文章主要给大家介绍了关于如何通过一篇文章读懂Golang init函数执行顺序的相关资料,需要的朋友可以参考下
    2022-11-11
  • Go语言同步与异步执行多个任务封装详解(Runner和RunnerAsync)

    Go语言同步与异步执行多个任务封装详解(Runner和RunnerAsync)

    这篇文章主要给大家介绍了关于Go语言同步与异步执行多个任务封装(Runner和RunnerAsync)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • 关于go get 下载第三方包存储路径问题

    关于go get 下载第三方包存储路径问题

    这篇文章主要介绍了关于go get 下载第三方包存储路径问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Go使用协程批量获取数据加快接口返回速度

    Go使用协程批量获取数据加快接口返回速度

    这篇文章主要介绍了Go使用协程批量获取数据加快接口返回速度,使用Go语言后,可以并发获取,极大提升效率,需要的朋友可以参考下
    2023-02-02
  • 一文带你理解Golang中的Time结构

    一文带你理解Golang中的Time结构

    根据golang的time包的文档可以知道,golang的time结构中存储了两种时钟,一种是Wall Clocks,一种是Monotonic Clocks,下面我们就来简单了解一下这两种结构吧
    2023-09-09

最新评论