2019-02-02 16:18:25 +08:00
|
|
|
|
// Copyright 2018 gf Author(https://github.com/gogf/gf). All Rights Reserved.
|
2018-07-11 13:51:03 +08:00
|
|
|
|
//
|
|
|
|
|
// 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,
|
2019-02-02 16:18:25 +08:00
|
|
|
|
// You can obtain one at https://github.com/gogf/gf.
|
2018-07-11 13:51:03 +08:00
|
|
|
|
|
|
|
|
|
package gtime
|
|
|
|
|
|
|
|
|
|
import "time"
|
|
|
|
|
|
|
|
|
|
type Time struct {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
time.Time
|
2018-07-11 13:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 创建一个空的时间对象,参数可以是标准库时间对象,可选
|
2019-06-19 09:06:52 +08:00
|
|
|
|
func New(t ...time.Time) *Time {
|
|
|
|
|
if len(t) > 0 {
|
|
|
|
|
return NewFromTime(t[0])
|
|
|
|
|
}
|
|
|
|
|
return &Time{
|
|
|
|
|
time.Time{},
|
|
|
|
|
}
|
2018-07-11 13:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 当前时间对象
|
|
|
|
|
func Now() *Time {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
return &Time{
|
|
|
|
|
time.Now(),
|
|
|
|
|
}
|
2018-07-11 13:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 标准时间对象转换为自定义的时间对象
|
2019-05-29 11:25:11 +08:00
|
|
|
|
func NewFromTime(t time.Time) *Time {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
return &Time{
|
|
|
|
|
t,
|
|
|
|
|
}
|
2018-07-11 13:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 从字符串转换为时间对象,复杂的时间字符串需要给定格式
|
2019-05-29 11:25:11 +08:00
|
|
|
|
func NewFromStr(str string) *Time {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
if t, err := StrToTime(str); err == nil {
|
|
|
|
|
return t
|
|
|
|
|
}
|
|
|
|
|
return nil
|
2018-07-11 17:06:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 从字符串转换为时间对象,指定字符串时间格式,format格式形如:Y-m-d H:i:s
|
2019-05-29 11:25:11 +08:00
|
|
|
|
func NewFromStrFormat(str string, format string) *Time {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
if t, err := StrToTimeFormat(str, format); err == nil {
|
|
|
|
|
return t
|
|
|
|
|
}
|
|
|
|
|
return nil
|
2018-07-11 17:06:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 从字符串转换为时间对象,通过标准库layout格式进行解析,layout格式形如:2006-01-02 15:04:05
|
2019-05-29 11:25:11 +08:00
|
|
|
|
func NewFromStrLayout(str string, layout string) *Time {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
if t, err := StrToTimeLayout(str, layout); err == nil {
|
|
|
|
|
return t
|
|
|
|
|
}
|
|
|
|
|
return nil
|
2018-07-11 13:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
2018-08-08 20:37:15 +08:00
|
|
|
|
// 时间戳转换为时间对象,时间戳支持到纳秒的数值
|
2019-05-29 11:25:11 +08:00
|
|
|
|
func NewFromTimeStamp(timestamp int64) *Time {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
if timestamp == 0 {
|
|
|
|
|
return &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 17:59:16 +08:00
|
|
|
|
// 秒数(时间戳)
|
2018-07-11 13:51:03 +08:00
|
|
|
|
func (t *Time) Second() int64 {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
return t.UnixNano() / 1e9
|
2018-07-11 13:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 纳秒数
|
|
|
|
|
func (t *Time) Nanosecond() int64 {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
return t.UnixNano()
|
2018-07-11 13:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 微秒数
|
|
|
|
|
func (t *Time) Microsecond() int64 {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
return t.UnixNano() / 1e3
|
2018-07-11 13:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 毫秒数
|
|
|
|
|
func (t *Time) Millisecond() int64 {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
return t.UnixNano() / 1e6
|
2018-07-11 13:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 转换为字符串
|
|
|
|
|
func (t *Time) String() string {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
return t.Format("Y-m-d H:i:s")
|
2018-07-11 13:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-05-29 11:25:11 +08:00
|
|
|
|
// Deprecated.
|
|
|
|
|
// Directly use t.Time instead.
|
2018-07-11 13:51:03 +08:00
|
|
|
|
func (t *Time) ToTime() time.Time {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
return t.Time
|
2018-07-11 13:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 复制当前时间对象
|
|
|
|
|
func (t *Time) Clone() *Time {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
return New(t.Time)
|
2018-07-11 13:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 当前时间加上指定时间段
|
2018-07-20 18:16:51 +08:00
|
|
|
|
func (t *Time) Add(d time.Duration) *Time {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
t.Time = t.Time.Add(d)
|
|
|
|
|
return t
|
2018-07-11 13:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
2018-10-16 15:49:30 +08:00
|
|
|
|
// 时区转换为指定的时区(通过time.Location)
|
2018-07-20 18:16:51 +08:00
|
|
|
|
func (t *Time) ToLocation(location *time.Location) *Time {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
t.Time = t.Time.In(location)
|
|
|
|
|
return t
|
2018-07-11 13:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-01-16 13:02:59 +08:00
|
|
|
|
// 时区转换为指定的时区(通过时区名称,如:Asia/Shanghai)
|
2019-05-29 11:25:11 +08:00
|
|
|
|
func (t *Time) ToZone(zone string) (*Time, error) {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
if l, err := time.LoadLocation(zone); err == nil {
|
|
|
|
|
t.Time = t.Time.In(l)
|
|
|
|
|
return t, nil
|
|
|
|
|
} else {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
2018-10-16 15:49:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
2018-07-11 13:51:03 +08:00
|
|
|
|
// 时区转换为UTC时区
|
2018-07-20 18:16:51 +08:00
|
|
|
|
func (t *Time) UTC() *Time {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
t.Time = t.Time.UTC()
|
|
|
|
|
return t
|
2018-07-11 13:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 时区转换为当前设定的Local时区
|
2018-07-20 18:16:51 +08:00
|
|
|
|
func (t *Time) Local() *Time {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
t.Time = t.Time.Local()
|
|
|
|
|
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 {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
t.Time = t.Time.AddDate(years, months, days)
|
|
|
|
|
return t
|
2018-07-11 13:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Round将舍入t的结果返回到d的最接近的倍数(从零时间开始)。
|
|
|
|
|
// 中间值的舍入行为是向上舍入。 如果d <= 0,Round返回t剥离任何单调时钟读数但不改变。
|
|
|
|
|
// Round作为零时间以来的绝对持续时间运行; 它不适用于当时的演示形式。
|
|
|
|
|
// 因此,Round(Hour)可能会返回非零分钟的时间,具体取决于时间的位置。
|
2018-07-20 18:16:51 +08:00
|
|
|
|
func (t *Time) Round(d time.Duration) *Time {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
t.Time = t.Time.Round(d)
|
|
|
|
|
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 {
|
2019-06-19 09:06:52 +08:00
|
|
|
|
t.Time = t.Time.Truncate(d)
|
|
|
|
|
return t
|
|
|
|
|
}
|