github.com/zhongdalu/gf@v1.0.0/g/os/gtime/gtime_time.go (about)

     1  // Copyright 2018 gf Author(https://github.com/zhongdalu/gf). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with this file,
     5  // You can obtain one at https://github.com/zhongdalu/gf.
     6  
     7  package gtime
     8  
     9  import (
    10  	"time"
    11  )
    12  
    13  type Time struct {
    14  	time.Time
    15  }
    16  
    17  // 创建一个空的时间对象,参数可以是标准库时间对象,可选
    18  func New(t ...time.Time) *Time {
    19  	if len(t) > 0 {
    20  		return NewFromTime(t[0])
    21  	}
    22  	return &Time{
    23  		time.Time{},
    24  	}
    25  }
    26  
    27  // 当前时间对象
    28  func Now() *Time {
    29  	return &Time{
    30  		time.Now(),
    31  	}
    32  }
    33  
    34  // 标准时间对象转换为自定义的时间对象
    35  func NewFromTime(t time.Time) *Time {
    36  	return &Time{
    37  		t,
    38  	}
    39  }
    40  
    41  // 从字符串转换为时间对象,复杂的时间字符串需要给定格式
    42  func NewFromStr(str string) *Time {
    43  	if t, err := StrToTime(str); err == nil {
    44  		return t
    45  	}
    46  	return nil
    47  }
    48  
    49  // 从字符串转换为时间对象,指定字符串时间格式,format格式形如:Y-m-d H:i:s
    50  func NewFromStrFormat(str string, format string) *Time {
    51  	if t, err := StrToTimeFormat(str, format); err == nil {
    52  		return t
    53  	}
    54  	return nil
    55  }
    56  
    57  // 从字符串转换为时间对象,通过标准库layout格式进行解析,layout格式形如:2006-01-02 15:04:05
    58  func NewFromStrLayout(str string, layout string) *Time {
    59  	if t, err := StrToTimeLayout(str, layout); err == nil {
    60  		return t
    61  	}
    62  	return nil
    63  }
    64  
    65  // 时间戳转换为时间对象,时间戳支持到纳秒的数值
    66  func NewFromTimeStamp(timestamp int64) *Time {
    67  	if timestamp == 0 {
    68  		return &Time{}
    69  	}
    70  	for timestamp < 1e18 {
    71  		timestamp *= 10
    72  	}
    73  	return &Time{
    74  		time.Unix(int64(timestamp/1e9), timestamp%1e9),
    75  	}
    76  }
    77  
    78  // 秒数(时间戳)
    79  func (t *Time) Second() int64 {
    80  	return t.UnixNano() / 1e9
    81  }
    82  
    83  // 纳秒数
    84  func (t *Time) Nanosecond() int64 {
    85  	return t.UnixNano()
    86  }
    87  
    88  // 微秒数
    89  func (t *Time) Microsecond() int64 {
    90  	return t.UnixNano() / 1e3
    91  }
    92  
    93  // 毫秒数
    94  func (t *Time) Millisecond() int64 {
    95  	return t.UnixNano() / 1e6
    96  }
    97  
    98  // 转换为字符串
    99  func (t *Time) String() string {
   100  	return t.Format("Y-m-d H:i:s")
   101  }
   102  
   103  // Deprecated.
   104  // Directly use t.Time instead.
   105  func (t *Time) ToTime() time.Time {
   106  	return t.Time
   107  }
   108  
   109  // 复制当前时间对象
   110  func (t *Time) Clone() *Time {
   111  	return New(t.Time)
   112  }
   113  
   114  // 当前时间加上指定时间段
   115  func (t *Time) Add(d time.Duration) *Time {
   116  	t.Time = t.Time.Add(d)
   117  	return t
   118  }
   119  
   120  // 当前时间加上指定时间段(使用字符串格式)
   121  func (t *Time) AddStr(duration string) error {
   122  	if d, err := time.ParseDuration(duration); err != nil {
   123  		return err
   124  	} else {
   125  		t.Time = t.Time.Add(d)
   126  	}
   127  	return nil
   128  }
   129  
   130  // 时区转换为指定的时区(通过time.Location)
   131  func (t *Time) ToLocation(location *time.Location) *Time {
   132  	t.Time = t.Time.In(location)
   133  	return t
   134  }
   135  
   136  // 时区转换为指定的时区(通过时区名称,如:Asia/Shanghai)
   137  func (t *Time) ToZone(zone string) (*Time, error) {
   138  	if l, err := time.LoadLocation(zone); err == nil {
   139  		t.Time = t.Time.In(l)
   140  		return t, nil
   141  	} else {
   142  		return nil, err
   143  	}
   144  }
   145  
   146  // 时区转换为UTC时区
   147  func (t *Time) UTC() *Time {
   148  	t.Time = t.Time.UTC()
   149  	return t
   150  }
   151  
   152  // 时区转换为当前设定的Local时区
   153  func (t *Time) Local() *Time {
   154  	t.Time = t.Time.Local()
   155  	return t
   156  }
   157  
   158  // 时间日期计算
   159  func (t *Time) AddDate(years int, months int, days int) *Time {
   160  	t.Time = t.Time.AddDate(years, months, days)
   161  	return t
   162  }
   163  
   164  // Round将舍入t的结果返回到d的最接近的倍数(从零时间开始)。
   165  // 中间值的舍入行为是向上舍入。 如果d <= 0,Round返回t剥离任何单调时钟读数但不改变。
   166  // Round作为零时间以来的绝对持续时间运行; 它不适用于当时的演示形式。
   167  // 因此,Round(Hour)可能会返回非零分钟的时间,具体取决于时间的位置。
   168  func (t *Time) Round(d time.Duration) *Time {
   169  	t.Time = t.Time.Round(d)
   170  	return t
   171  }
   172  
   173  // Truncate将舍入t的结果返回到d的倍数(从零时间开始)。 如果d <= 0,则Truncate返回t剥离任何单调时钟读数但不改变。
   174  // 截断时间作为零时间以来的绝对持续时间运行; 它不适用于当时的演示形式。
   175  // 因此,截断(小时)可能会返回非零分钟的时间,具体取决于时间的位置。
   176  func (t *Time) Truncate(d time.Duration) *Time {
   177  	t.Time = t.Time.Truncate(d)
   178  	return t
   179  }
   180  
   181  // MarshalJSON implements the interface MarshalJSON for json.Marshal.
   182  func (t *Time) MarshalJSON() ([]byte, error) {
   183  	return []byte(`"` + t.String() + `"`), nil
   184  }