mirror of
https://gitee.com/johng/gf.git
synced 2024-12-01 11:48:09 +08:00
167 lines
4.2 KiB
Go
167 lines
4.2 KiB
Go
// Copyright 2018 gf Author(https://github.com/gogf/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://github.com/gogf/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,
|
||
}
|
||
}
|
||
|
||
// 从字符串转换为时间对象,复杂的时间字符串需要给定格式
|
||
func NewFromStr (str string) *Time {
|
||
if t, err := StrToTime(str); err == nil {
|
||
return t
|
||
}
|
||
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
|
||
}
|
||
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
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// 时间戳转换为时间对象,时间戳支持到纳秒的数值
|
||
func NewFromTimeStamp (timestamp int64) *Time {
|
||
if timestamp == 0 {
|
||
return &Time {}
|
||
}
|
||
for timestamp < 1e18 {
|
||
timestamp *= 10
|
||
}
|
||
return &Time {
|
||
time.Unix(int64(timestamp/1e9), timestamp%1e9),
|
||
}
|
||
}
|
||
|
||
// 秒数(时间戳)
|
||
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)
|
||
}
|
||
|
||
// 当前时间加上指定时间段
|
||
func (t *Time) Add(d time.Duration) *Time {
|
||
t.Time = t.Time.Add(d)
|
||
return t
|
||
}
|
||
|
||
// 时区转换为指定的时区(通过time.Location)
|
||
func (t *Time) ToLocation(location *time.Location) *Time {
|
||
t.Time = t.Time.In(location)
|
||
return t
|
||
}
|
||
|
||
// 时区转换为指定的时区(通过时区名称,如:Asia/Shanghai)
|
||
func (t *Time) ToZone(zone string) *Time {
|
||
if l, err := time.LoadLocation(zone); err == nil {
|
||
t.Time = t.Time.In(l)
|
||
return t
|
||
} else {
|
||
//panic(err)
|
||
return nil
|
||
}
|
||
}
|
||
|
||
// 时区转换为UTC时区
|
||
func (t *Time) UTC() *Time {
|
||
t.Time = t.Time.UTC()
|
||
return t
|
||
}
|
||
|
||
// 时区转换为当前设定的Local时区
|
||
func (t *Time) Local() *Time {
|
||
t.Time = t.Time.Local()
|
||
return t
|
||
}
|
||
|
||
// 时间日期计算
|
||
func (t *Time) AddDate(years int, months int, days int) *Time {
|
||
t.Time = t.Time.AddDate(years, months, days)
|
||
return t
|
||
}
|
||
|
||
// Round将舍入t的结果返回到d的最接近的倍数(从零时间开始)。
|
||
// 中间值的舍入行为是向上舍入。 如果d <= 0,Round返回t剥离任何单调时钟读数但不改变。
|
||
// Round作为零时间以来的绝对持续时间运行; 它不适用于当时的演示形式。
|
||
// 因此,Round(Hour)可能会返回非零分钟的时间,具体取决于时间的位置。
|
||
func (t *Time) Round(d time.Duration) *Time {
|
||
t.Time = t.Time.Round(d)
|
||
return t
|
||
}
|
||
|
||
// Truncate将舍入t的结果返回到d的倍数(从零时间开始)。 如果d <= 0,则Truncate返回t剥离任何单调时钟读数但不改变。
|
||
// 截断时间作为零时间以来的绝对持续时间运行; 它不适用于当时的演示形式。
|
||
// 因此,截断(小时)可能会返回非零分钟的时间,具体取决于时间的位置。
|
||
func (t *Time) Truncate(d time.Duration) *Time {
|
||
t.Time = t.Time.Truncate(d)
|
||
return t
|
||
} |