提升编程技能:学习如何在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语言中的recover()函数用法解读

    Go语言中的recover()函数用法解读

    Go语言recover()用于捕获panic,需与defer配合使用,在defer中调用时返回panic值,否则返回nil,Go1.21后panic(nil)触发runtime panic,recover返回*runtime.PanicNilError,应仅用于处理意外情况,注意作用域限制及性能影响
    2025-07-07
  • 从零封装Gin框架实现数据库初始化GORM

    从零封装Gin框架实现数据库初始化GORM

    这篇文章主要为大家介绍了从零封装Gin框架实现数据库初始化GORM,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Golang观察者模式优化订单处理系统实例探究

    Golang观察者模式优化订单处理系统实例探究

    当涉及到订单处理系统时,观察者设计模式可以用于实现订单状态的变化和通知,在这篇文章中,我们将介绍如何使用Golang来实现观察者设计模式,并提供一个基于订单处理系统的代码示例
    2024-01-01
  • Golang内存分配机制详解

    Golang内存分配机制详解

    Go 语言的内存分配机制是理解和优化 Go 程序性能的关键,在 Go 中,内存管理是自动进行的,这得益于 Go 的垃圾回收机制,了解内存如何分配和回收,可以帮助我们写出更高性能的代码,本文将深入讲解下 Go 内存分配机制,需要的朋友可以参考下
    2023-12-12
  • Go环境变量配置,及GOROOT、GOPATH的区别小结

    Go环境变量配置,及GOROOT、GOPATH的区别小结

    本文主要介绍了Go环境变量配置,及GOROOT、GOPATH的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-09-09
  • 在Go语言程序中使用gojson来解析JSON格式文件

    在Go语言程序中使用gojson来解析JSON格式文件

    这篇文章主要介绍了在Go语言程序中使用gojson来解析JSON格式文件的方法,Go是由Google开发的高人气新兴编程语言,需要的朋友可以参考下
    2015-10-10
  • Go设计模式之备忘录模式讲解和代码示例

    Go设计模式之备忘录模式讲解和代码示例

    备忘录是一种行为设计模式, 允许生成对象状态的快照并在以后将其还原,本文就通过代码示例给大家讲讲Go备忘录模式,感兴趣的小伙伴跟着小编一起来看看吧
    2023-08-08
  • golang语言中for循环语句用法实例

    golang语言中for循环语句用法实例

    这篇文章主要介绍了golang语言中for循环语句用法,实例分析了for循环遍历的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • go语言使用RocketMq的示例代码

    go语言使用RocketMq的示例代码

    这篇文章主要介绍了go语言使用RocketMq的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-01-01
  • 文字解说Golang Goroutine和线程的区别

    文字解说Golang Goroutine和线程的区别

    goroutine 是 Go语言中的轻量级线程实现,由 Go 运行时(runtime)管理,使用每一个 go 关键字将会额外开启一个新的协程 goroutine,今天通过本文给大家介绍下Golang Goroutine和线程的区别,感兴趣的朋友一起看看吧
    2022-03-03

最新评论