golang 时间编程

编程离不开时间,时间管理,严格的说分成两块,一个是当前的时刻,对应的是一个点,还有是一段时间间隔。本文简单的讲讲go的时间相关的编程,比较简单,高手可以一笑而过。

golang对时间的支持,是package time做的事儿,里面有好多的函数,我就不一一举例学习,毕竟这是官方文档干的事情。我们初步的学习下常用的函数。

第一个是UNIX epoch time,确切的说就是自1970-01-01 00:00:00 GMT以来的秒数,不知道如何获取的,可以在shell下执行 date +%s

golang中一个很重要的表征时间的数据类型是Time,基本就是三个成员变量 sec ,nsec,Location,详细意思可以参看注释。

type Time struct {
           // sec gives the number of seconds elapsed since
            // January 1, year 1 00:00:00 UTC.
            sec int64
        
            // nsec specifies a non-negative nanosecond
            // offset within the second named by Seconds.
            // It must be in the range [0, 999999999].
            nsec int32
        
            // loc specifies the Location that should be used to
            // determine the minute, hour, month, day, and year
            // that correspond to this Time.
            // Only the zero Time has a nil Location.
            // In that case it is interpreted to mean UTC.
            loc *Location
        }

OK,如何取到UNIX epoch time.

now := time.Now()

用time package中Now()函数获取到当前的时间信息,Now()函数非常的重要,他是后面一切转换的起始点。从Now()我们获取到了Time,从Time类型我们从容的获取到UNIX epoch time ,自然获取到year ,month ,day,weekday, hour,minute,second,nanosecond.

获取UNIX epoch time:

var epoch_seconds int64 = now.Unix()

获取Year

func (t Time) Year() int

cur_year := now.Year()

获取Month

func (t Time) Month() Month

cur_month := now.Month()

if cur_month == time.November {
    ...
}

Month是int类型,fmt.Printf("%v") 或者fmt.Println可以打印出November来,同时Month type有String()函数,输出“November”这样的字符串

const (
        January Month = 1 + iota
        February
        March
        April
        May
        June
        July
        August
        September
        October
        November
        December
)

year mon day,这些都可以在Date函数中一并返回:

func (t Time) Date() (year int, month Month, day int)

year,mon,day = now.Date()

获取Hour 

func (t Time) Hour() int
  cur_hour := now.Hour()

Minute可以通过Minute()返回,second可以通过Second()返回。

time还提供了Clock()的同时返回 hour,minute,second = now.Clock().

package main

import "fmt"
import "time"

func main(){
    
    now := time.Now()
    year,mon,day := now.UTC().Date()
    hour,min,sec := now.UTC().Clock()
    zone,_ := now.UTC().Zone()
    fmt.Printf("UTC time is %d-%d-%d %02d:%02d:%02d %s\n",
                year,mon,day,hour,min,sec,zone)

    year,mon,day = now.Date()
    hour,min,sec = now.Clock()
    zone,_ = now.Zone()
    fmt.Printf("local time is %d-%d-%d %02d:%02d:%02d %s\n",
     year,mon,day,hour,min,sec,zone)
}
go版本的输出
---------------------
UTC   time is 2013-11-22 15:51:22 UTC
local time is 2013-11-22 23:51:22 CST

我们另一个关心的话题,是时间间隔,比如我们profile一个以非常耗时的function,我们会在函数开始前记下时刻值,函数结束后,再次记录下时刻值,然后两者的差值,就是函数运行时间。

这表明Time是可以相减的

start_time := time.Now()
expensive_function
end_time :=time.Now()

var duration Duration = end_time.Sub(start_time)

Duration是一种数据类型,其实是个int64类型,表征的是两个时刻之间的纳秒数。

type Duration int64

const (
        Nanosecond Duration = 1
        Microsecond = 1000 * Nanosecond
        Millisecond = 1000 * Microsecond
        Second = 1000 * Millisecond
        Minute = 60 * Second
        Hour = 60 * Minute
)

Duration类型有Minutes()/Second()/Nanoseconds(), 将duration折算成分钟/秒/纳秒。

now := time.Now()
    time.Sleep(3*time.Second);
    end_time := time.Now()

    var dur_time time.Duration = end_time.Sub(now)
    var elapsed_min float64 = dur_time.Minutes()
    var elapsed_sec float64 = dur_time.Seconds()
    var elapsed_nano int64 = dur_time.Nanoseconds()
    fmt.Printf("elasped %f minutes or \nelapsed %f seconds or \nelapsed %d nanoseconds\n",
                elapsed_min,elapsed_sec,elapsed_nano)

输出如下

elasped 0.050005 minutes or 
elapsed 3.000292 seconds or 
elapsed 3000292435 nanoseconds

Go中的time.Sleep一律是以纳秒为单位的,当然本质是Duration类型:

sleep 3秒可以写成

time.Sleep(3000000000)
time.Sleep(3*time.Second);
package main
 
import (
    "fmt"
    "time"
)
 
const (
    date        = "2006-01-02"
    shortdate   = "06-01-02"
    times       = "15:04:02"
    shorttime   = "15:04"
    datetime    = "2006-01-02 15:04:02"
    newdatetime = "2006/01/02 15~04~02"
    newtime     = "15~04~02"
)
 
func main() {
    thisdate := "2014-03-17 14:55:06"
    timeformatdate, _ := time.Parse(datetime, thisdate)
    fmt.Println(timeformatdate)
    convdate := timeformatdate.Format(date)
    convshortdate := timeformatdate.Format(shortdate)
    convtime := timeformatdate.Format(times)
    convshorttime := timeformatdate.Format(shorttime)
    convnewdatetime := timeformatdate.Format(newdatetime)
    convnewtime := timeformatdate.Format(newtime)
    fmt.Println(convdate)
    fmt.Println(convshortdate)
    fmt.Println(convtime)
    fmt.Println(convshorttime)
    fmt.Println(convnewdatetime)
    fmt.Println(convnewtime)
}
时间: 2024-12-09 20:27:48

golang 时间编程的相关文章

golang并发编程

golang并发编程 引子 golang提供了goroutine快速实现并发编程,在实际环境中,如果goroutine中的代码要消耗大量资源时(CPU.内存.带宽等),我们就需要对程序限速,以防止goroutine将资源耗尽.以下面伪代码为例,看看goroutine如何拖垮一台DB.假设userList长度为10000,先从数据库中查询userList中的user是否在数据库中存在,存在则忽略,不存在则创建. //不使用goroutine,程序运行时间长,但数据库压力不大 for _,v:=ra

linux应用开发-时间编程

linux应用开发-时间编程 一 时间类型 世界标准时间:格林威治时间 日历时间:从1970-1-1起的秒数 二 时间函数 1 获取日历时间 函数名 time 函数原形 time_t time(time_t *t) 函数功能 从1970年1月1日的时间,单位为秒 所属头文件 #include<time.h> 返回值 成功返回时间的秒速 失败返回-1 参数说明 保存返回值 2 获取格林威治时间 函数名 gmtime 函数原形 struct tm *gmtime(const time_t *tim

Golang时间格式化

PHP中格式化时间很方便,只需要一个函数就搞定: date("Y-m-d H:i:s") 而在Golang中,用的是"2006-01-02 15:04:05"这样的layout string: time.Now().Format("2006-01-02 15:04:05") 2006表示year 01表示month 02表示day 15表示hour 04表示minute 05表示seconds 只能用以上这几个数字来格式化时间,假如把这里的200

浅析 Linux 中的时间编程和实现原理一—— Linux 应用层的时间编程【转】

本文转载自:http://www.cnblogs.com/qingchen1984/p/7007631.html 本篇文章主要介绍了"浅析 Linux 中的时间编程和实现原理一—— Linux 应用层的时间编程",主要涉及到浅析 Linux 中的时间编程和实现原理一—— Linux 应用层的时间编程方面的内容,对于浅析 Linux 中的时间编程和实现原理一—— Linux 应用层的时间编程感兴趣的同学可以参考一下. 简介: 本文试图完整地描述 Linux 系统中 C 语言编程中的时间问

时间编程

使用Linux时间编程相关函数,编写程序,通过实现与函数asctime相同功能的函数获取本地时间,以格式字符串方式显示 概念:日历时间,通过time_t数据类型来表示,从一个时间点(通常是1970年1月1日0时0分0秒)到此时的秒数. 格林威治时间:由英国皇家格林尼治天文台提供的标准时间. 本地时间:根据格林威治时间和本地时区计算出的时间. 1.获取当前的系统时间--time 头文件:#include<time.h> 函数原型:time_t time(time_t *timer) 参数说明:t

Golang Web编程的Get和Post请求发送与解析

本文的是一篇入门文章,通过一个简单的例子介绍Golang的Web编程主要用到的技术. 文章结构包括: Client-Get 请求 Client-Post 请求 Server 处理 Get 和 Post 数据 在数据的封装中,我们部分采用了json,因而本文也涉及到Golang中json的编码和解码. 一.Client-Get package main import ( "fmt" "net/url" "net/http" "io/iou

Linux 下的时间编程总结

在嵌入式编程中中,经常需要输出系统的当前时间.计算程序的执行时间.使用计时器等.最近也做了不少关于时间的操作,今天就认真总结一下,部分内容是在网上看到的.自己经过验证总结出来. 1.时间的类型 1.格林威治标准时间 coordinated universal time(UTC)是世界标准时间,即常说的格林威治标准时间(greenwich mean time,GMT). 2.日历时间 日历时间(calendar time)是用"一个标准时间点(如1970年1月1日0点)到此时经过的秒数"

golang -- 时间日期总结

golang时间处理 相关包 "time" 时间戳 当前时间戳 ? 1 2 fmt.Println( time .Now().Unix()) # 1389058332 str格式化时间 当前格式化时间 ? 1 2 fmt.Println( time .Now().Format( "2006-01-02 15:04:05" ))   // 这是个奇葩,必须是这个时间点, 据说是go诞生之日, 记忆方法:6-1-2-3-4-5 # 2014-01-07 09:42:20

Golang语言编程规范

Golang语言编程规范 一.说明 编程规范好,可避免语言陷阱,可有利团队协作,有利项目维护. 正常的Go编程规范有两种:编译器强制的(必须的),gofmt格式化非强制的(非必须). Go宣告支持驼峰命名法,排斥下划线法. 自定义原则: a.统一工作区间,避免目录及文件名随意 b.规范变量/结构体/方法及接口名 c.规范注释 d.单元测试/程序效率等建议 两个等级: (S)建议,(M)必须.以下是细节. 二.代码组织结构 (M)一个目录只包含一个包,模块复杂拆分子模块/子目录 (S)内部项目GO