gf/g/os/gtime/gtime_time.go

168 lines
4.0 KiB
Go
Raw Normal View History

// 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,
// 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
}
// 标准时间对象转换为自定义的时间对象
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
}
// 从字符串转换为时间对象,复杂的时间字符串需要给定格式
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
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
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
}
// 时间戳转换为时间对象,时间戳支持到纳秒的数值
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 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
}
// 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
}
// 时区转换为指定的时区(通过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)
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-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 <= 0Round返回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
}