Go语言中Time的用法[2]

103 篇文章 0 订阅
11 篇文章 0 订阅


Date函数:

定义:func Date(yearint, month Month, day, hour, min, sec, nsec int, loc *Location) Time

函数基于给定的Location返回一个“yyyy-mm-ddhh:mm:ss + nsec nanoseconds”形式的Time对象,month, day, hour, min, sec,  和nsec这些参数可以超出正常的取值范围,例如1月32日会转化为2月1日。

示例:

t := time.Date(2017, time.February, 16, 12, 0, 0, 0, time.Local)

fmt.Println(t)

输出:

2017-02-16 12:00:00 +0800 CST

 

Now函数:

定义:func Now() Time

Now函数返回当前本地时间

 

 

Parse函数:

定义:funcParse(layout, value string) (Time, error)

Parse函数根据layout指定的格式将string解析为Time类型并返回。layout格式与Format函数的使用类似,也可以使用time中定义的格式常量。string中并不一定要包含Time所有的属性(年月日时分秒…),任何省略掉的属性都默认赋为0。若不指定,默认解析得到的Time时区为UTC。

示例:

const longForm = "Jan 2, 2006 at 3:04pm (MST)"

t, _ := time.Parse(longForm, "Feb 3, 2013 at 7:54pm (PST)")

fmt.Println(t)

const shortForm = "2006-Jan-02"

t, _ = time.Parse(shortForm, "2013-Feb-03")

fmt.Println(t)

输出:

2013-02-03 19:54:00 +0000 PST

2013-02-03 00:00:00 +0000 UTC

 

ParseInLocation函数:

定义:funcParseInLocation(layout, value string, loc *Location) (Time, error)

与Parse方法类似,但是会按照loc参数指定的时区进行解析

 

Weekday类型:

常量定义:

type Weekday int

const (

    Sunday Weekday = iota

    Monday

    Tuesday

    Wednesday

    Thursday

    Friday

    Saturday

)

 

Weekday的String方法:

定义:func (d Weekday)String() string

返回例如“Sunday”,“Monday”的字符串

 

计算类方法:

Time的Add方法:

定义:func (t Time) Add(d Duration) Time

返回t+d

 

Time的Sub方法:

定义:func (t Time) Sub(u Time) Duration

返回time.Duration(t-u)

 

Time的AddDate方法:

定义:func (t Time) AddDate(years int, months int, days int) Time

在参数t的基础上加上years,months,days指定的值(可以是负值),和Date方法一样,当计算结果超出正常范围时,会换算(进位/借位)。

 

比较类方法:

Time的After方法:

定义:func (t Time) After(u Time) bool

判断t对应的时间是否晚于u

 

Time的Before方法:

定义:func (t Time) Before(u Time) bool

判断t对应的时间是否早于u

 

Time的Equal方法:

定义:func (t Time) Equal(u Time) bool

该方法判断t和u所代表的时间是否相等,即使两个不同时区的时间也有可能返回true,例如6:00 +0200 CEST和4:00 UTC就是相同的时间。该方法与t == u不同,==除了比较时间本身,还要比较两个时间的时区。

 

Time的IsZero方法:

定义:func (t Time) IsZero() bool

判断t是否为基准时间January 1, year 1, 00:00:00 UTC

 

获取属性:

Time的Clock方法:

定义:func (t Time) Clock() (hour, min, sec int)

返回t的hour,min,sec属性

 

Time的Date方法:

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

返回t的year,month,day属性

 

Time的YearDay方法:

定义:func (t Time) YearDay() int

返回t是当年的第几天,平年的取值范围是[1,365],闰年是[1,366]

 

Time的Year方法:

定义:func (t Time) Year() int

返回t的year属性

 

Time的Month方法:

定义:func (t Time) Month() Month

返回t的month属性

 

Time的Weekday方法:

定义:func (t Time) Weekday() Weekday

返回t对应的日期是星期几

 

Time的Day方法:

定义:func (t Time) Day() int

返回t的day属性

 

Time的Hour方法:

定义:func (t Time) Hour() int

返回t的hour属性,取值范围:[0, 23]

 

Time的Minute方法:

定义:func (t Time) Minute() int

回t的minute属性,取值范围:[0, 59]

 

Time的Second方法:

定义:func (t Time) Second() int

回t的second属性,取值范围:[0, 59]

 

Time的Nanosecond方法:

定义:func (t Time) Nanosecond() int

回t的nanosecond属性,取值范围:[0, 999999999]

 

Time的Location方法:

定义:func (t Time) Location() *Location

获取t的时区

 

Time的Zone方法:

定义:func (t Time) Zone() (name string, offset int)

返回t对应的时区名称以及相对UTC的偏移值(秒)

 

时区转换:

Time的Local方法:

定义:func (t Time) Local() Time

将t转换为本地时间

 

Time的In方法:

定义:func (t Time) In(loc *Location) Time

将t转换到loc对应的时区

 

Time的UTC方法:

定义:func (t Time) UTC() Time

将t转换为UTC时间

 

Time的Round方法:

定义:func (t Time)Round(d Duration) Time

该方法为近似方法,用于将t根据给定的Duration取整(取到离其最近的整数倍),满足四舍五入。

示例:

t := time.Date(0, 0, 0, 12, 15, 30, 918273645, time.UTC)

round := []time.Duration{ time.Nanosecond, time.Microsecond, time.Millisecond, time.Second, 2 * time.Second, time.Minute, 10 * time.Minute, time.Hour, }

for _, d := range round {

    fmt.Printf("t.Round(%6s) = %s\n", d, t.Round(d).Format("15:04:05.999999999"))

}

输出:

t.Round(   1ns) = 12:15:30.918273645

t.Round(   1µs) = 12:15:30.918274

t.Round(   1ms) = 12:15:30.918

t.Round(    1s) = 12:15:31

t.Round(    2s) = 12:15:30

t.Round(  1m0s) = 12:16:00

t.Round( 10m0s) = 12:20:00

t.Round(1h0m0s) = 12:00:00

 

Time的Truncate方法:

定义:func (t Time)Truncate(d Duration) Time

与Round方法类似,区别是Truncate是“下取整”

示例:

t := time.Date(0, 0, 0, 12, 15, 30, 918273645, time.UTC)

trunc := []time.Duration{ time.Nanosecond, time.Microsecond, time.Millisecond, time.Second, 2 * time.Second, time.Minute, 10 * time.Minute, time.Hour, }

for _, d := range trunc {

    fmt.Printf("t.Truncate(%6s) = %s\n", d, t.Truncate(d).Format("15:04:05.999999999"))

}

输出:

t.Truncate(   1ns) = 12:15:30.918273645

t.Truncate(   1µs) = 12:15:30.918273

t.Truncate(   1ms) = 12:15:30.918

t.Truncate(    1s) = 12:15:30

t.Truncate(    2s) = 12:15:30

t.Truncate(  1m0s) = 12:15:00

t.Truncate( 10m0s) = 12:10:00

t.Truncate(1h0m0s) = 12:00:00

 

Time的String方法:

定义:func (t Time)String() string

返回格式如"2006-01-0215:04:05.999999999 -0700 MST"的t

 

Time的Format方法:

定义:func (t Time)Format(layout string) string

按照layout中定义的格式将Time转换为string

 

Timer类型:

Timer类型代表一个事件,当Timer的预设时间到了之后,会向对应的channel中发送当前时间,使用AfterFunc函数创建的Timer除外。需要使用NewTimer或AfterFunc函数创建Timer。

Timer定义:

type Timer struct {

    C <-chan Time

    // contains filtered or unexported fields

}

 

AfterFunc函数:

定义:func AfterFunc(dDuration, f func()) *Timer

该函数等待d限定的时间后,在自身goroutine中执行方法f,返回一个Timer指针,该指针可以调用Stop来停止Timer,从而不触发f函数

示例:

t := time.AfterFunc(time.Second * 10, func () { fmt.Println("test") })

time.Sleep(time.Second * 5)

if t.Stop() {

    fmt.Println("Timer stopped")

}

输出:

Timer stopped

 

NewTimer函数:

定义:func NewTimer(dDuration) *Timer

创建一个Timer,当等待d限定的时间后,会向Timer对应的channel中发送一个当前时间的Time对象

 

Timer的Reset方法:

定义:func (t *Timer)Reset(d Duration) bool

将t的Duration修改为d,如果t已经过期了或者被Stop了,则返回false,如果t是active的,则返回true,Reset一个Timer之前,务必使用Stop检测其状态:

if !t.Stop() {

    <-t.C

}

t.Reset(d)

 

Timer的Stop方法:

定义:func (t *Timer)Stop() bool

停止Timer,如果t已经过期了或者被Stop了,则返回false,如果t是active的,则返回true,Stop不会关闭Timer的channel,关闭后,检查返回值,如果未能成功关闭,将Timer的channel中的Time对象取出:

if !t.Stop() {

        <-t.C

}

 

Timer的一个例子:

t := time.NewTimer(time.Second * 5)

t1 := time.NewTimer(time.Second * 20)

c := make(chan int)

go func() {

    for i := 0; i < 17; i++{

        c <- i;

        time.Sleep(time.Second * 1)

    }

} ()

for {

    select {

        case x := <- c:

            fmt.Println(x, "received")

        case <- t.C:

            fmt.Println("Timer fired")

            t.Reset(time.Second * 5)

        case <- t1.C:

            fmt.Println("Exit")

            t.Stop()

            t1.Stop()

            return

    }

}

输出:

0 received

1 received

2 received

3 received

4 received

Timer fired

5 received

6 received

7 received

8 received

9 received

Timer fired

10 received

11 received

12 received

13 received

14 received

Timer fired

15 received

16 received

Exit



  • 62
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值