gf/g/os/gtime/gtime_time.go

164 lines
4.2 KiB
Go
Raw Normal View History

2018-07-11 13:51:03 +08:00
// Copyright 2018 gf Author(https://gitee.com/johng/gf). All Rights Reserved.
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://gitee.com/johng/gf.
package gtime
import "time"
type Time struct {
time.Time
}
// 创建一个空的时间对象,参数可以是标准库时间对象,可选
func New (t...time.Time) *Time {
if len(t) > 0 {
return NewFromTime(t[0])
}
return &Time{
time.Time{},
}
}
// 当前时间对象
func Now() *Time {
return &Time{
time.Now(),
}
}
// 标准时间对象转换为自定义的时间对象
func NewFromTime (t time.Time) *Time {
return &Time{
t,
}
}
// 从字符串转换为时间对象,复杂的时间字符串需要给定格式
2018-07-11 17:06:47 +08:00
func NewFromStr (str string) *Time {
if t, err := StrToTime(str); err == nil {
return t
2018-07-11 17:06:47 +08:00
}
return nil
}
// 从字符串转换为时间对象指定字符串时间格式format格式形如Y-m-d H:i:s
func NewFromStrFormat (str string, format string) *Time {
if t, err := StrToTimeFormat(str, format); err == nil {
return t
2018-07-11 17:06:47 +08:00
}
return nil
}
// 从字符串转换为时间对象通过标准库layout格式进行解析layout格式形如2006-01-02 15:04:05
func NewFromStrLayout (str string, layout string) *Time {
if t, err := StrToTimeLayout(str, layout); err == nil {
return t
2018-07-11 13:51:03 +08:00
}
return nil
}
// 时间戳转换为时间对象,时间戳支持到纳秒的数值
2018-07-11 13:51:03 +08:00
func NewFromTimeStamp (timestamp int64) *Time {
for timestamp < 1e18 {
timestamp *= 10
}
return &Time {
time.Unix(int64(timestamp/1e9), timestamp%1e9),
2018-07-11 13:51:03 +08:00
}
}
// 秒数(时间戳)
2018-07-11 13:51:03 +08:00
func (t *Time) Second() int64 {
return t.UnixNano()/1e9
}
// 纳秒数
func (t *Time) Nanosecond() int64 {
return t.UnixNano()
}
// 微秒数
func (t *Time) Microsecond() int64 {
return t.UnixNano()/1e3
}
// 毫秒数
func (t *Time) Millisecond() int64 {
return t.UnixNano()/1e6
}
// 转换为字符串
func (t *Time) String() string {
return t.Format("Y-m-d H:i:s")
}
// 转换为标准库日期对象
func (t *Time) ToTime() time.Time {
return t.Time
}
// 复制当前时间对象
func (t *Time) Clone() *Time {
return New(t.Time)
}
// 当前时间加上指定时间段
2018-07-20 18:16:51 +08:00
func (t *Time) Add(d time.Duration) *Time {
2018-07-11 13:51:03 +08:00
t.Time = t.Time.Add(d)
2018-07-20 18:16:51 +08:00
return t
2018-07-11 13:51:03 +08:00
}
// 时区转换为指定的时区(通过time.Location)
2018-07-20 18:16:51 +08:00
func (t *Time) ToLocation(location *time.Location) *Time {
2018-07-11 13:51:03 +08:00
t.Time = t.Time.In(location)
2018-07-20 18:16:51 +08:00
return t
2018-07-11 13:51:03 +08:00
}
// 时区转换为指定的时区(通过时区名称AsiaShanghai)
func (t *Time) ToZone(zone string) *Time {
if l, err := time.LoadLocation(zone); err == nil {
t.Time = t.Time.In(l)
return t
} else {
2018-12-17 13:02:18 +08:00
//panic(err)
return nil
}
}
2018-07-11 13:51:03 +08:00
// 时区转换为UTC时区
2018-07-20 18:16:51 +08:00
func (t *Time) UTC() *Time {
2018-07-11 13:51:03 +08:00
t.Time = t.Time.UTC()
2018-07-20 18:16:51 +08:00
return t
2018-07-11 13:51:03 +08:00
}
// 时区转换为当前设定的Local时区
2018-07-20 18:16:51 +08:00
func (t *Time) Local() *Time {
2018-07-11 13:51:03 +08:00
t.Time = t.Time.Local()
2018-07-20 18:16:51 +08:00
return t
2018-07-11 13:51:03 +08:00
}
// 时间日期计算
2018-07-20 18:16:51 +08:00
func (t *Time) AddDate(years int, months int, days int) *Time {
2018-07-11 13:51:03 +08:00
t.Time = t.Time.AddDate(years, months, days)
2018-07-20 18:16:51 +08:00
return t
2018-07-11 13:51:03 +08:00
}
// Round将舍入t的结果返回到d的最接近的倍数(从零时间开始)。
// 中间值的舍入行为是向上舍入。 如果d <= 0Round返回t剥离任何单调时钟读数但不改变。
// Round作为零时间以来的绝对持续时间运行; 它不适用于当时的演示形式。
// 因此Round(Hour)可能会返回非零分钟的时间,具体取决于时间的位置。
2018-07-20 18:16:51 +08:00
func (t *Time) Round(d time.Duration) *Time {
2018-07-11 13:51:03 +08:00
t.Time = t.Time.Round(d)
2018-07-20 18:16:51 +08:00
return t
2018-07-11 13:51:03 +08:00
}
// Truncate将舍入t的结果返回到d的倍数(从零时间开始)。 如果d <= 0则Truncate返回t剥离任何单调时钟读数但不改变。
// 截断时间作为零时间以来的绝对持续时间运行; 它不适用于当时的演示形式。
// 因此,截断(小时)可能会返回非零分钟的时间,具体取决于时间的位置。
2018-07-20 18:16:51 +08:00
func (t *Time) Truncate(d time.Duration) *Time {
2018-07-11 13:51:03 +08:00
t.Time = t.Time.Truncate(d)
2018-07-20 18:16:51 +08:00
return t
2018-07-11 13:51:03 +08:00
}