2017-12-11 12:37:04 +08:00
// Copyright 2017 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2017-12-11 12:37:04 +08:00
2019-08-15 22:46:21 +08:00
package timeutil
2017-12-11 12:37:04 +08:00
2017-12-14 07:45:31 +08:00
import (
"time"
"code.gitea.io/gitea/modules/setting"
)
2017-12-11 12:37:04 +08:00
// TimeStamp defines a timestamp
type TimeStamp int64
2022-12-20 03:04:55 +01:00
var (
// mock is NOT concurrency-safe!!
mock time . Time
// Used for IsZero, to check if timestamp is the zero time instant.
timeZeroUnix = time . Time { } . Unix ( )
)
2021-10-18 15:12:26 -05:00
// Set sets the time to a mocked time.Time
func Set ( now time . Time ) {
mock = now
}
// Unset will unset the mocked time.Time
func Unset ( ) {
mock = time . Time { }
}
2017-12-11 12:37:04 +08:00
// TimeStampNow returns now int64
func TimeStampNow ( ) TimeStamp {
2021-10-18 15:12:26 -05:00
if ! mock . IsZero ( ) {
return TimeStamp ( mock . Unix ( ) )
}
2017-12-11 12:37:04 +08:00
return TimeStamp ( time . Now ( ) . Unix ( ) )
}
// Add adds seconds and return sum
func ( ts TimeStamp ) Add ( seconds int64 ) TimeStamp {
return ts + TimeStamp ( seconds )
}
// AddDuration adds time.Duration and return sum
func ( ts TimeStamp ) AddDuration ( interval time . Duration ) TimeStamp {
return ts + TimeStamp ( interval / time . Second )
}
// Year returns the time's year
func ( ts TimeStamp ) Year ( ) int {
return ts . AsTime ( ) . Year ( )
}
// AsTime convert timestamp as time.Time in Local locale
func ( ts TimeStamp ) AsTime ( ) ( tm time . Time ) {
2019-08-15 22:46:21 +08:00
return ts . AsTimeInLocation ( setting . DefaultUILocation )
}
2022-08-25 18:05:21 +02:00
// AsLocalTime convert timestamp as time.Time in local location
func ( ts TimeStamp ) AsLocalTime ( ) time . Time {
return time . Unix ( int64 ( ts ) , 0 )
}
2019-08-15 22:46:21 +08:00
// AsTimeInLocation convert timestamp as time.Time in Local locale
2023-04-11 02:01:20 +03:00
func ( ts TimeStamp ) AsTimeInLocation ( loc * time . Location ) time . Time {
return time . Unix ( int64 ( ts ) , 0 ) . In ( loc )
2017-12-11 12:37:04 +08:00
}
// AsTimePtr convert timestamp as *time.Time in Local locale
func ( ts TimeStamp ) AsTimePtr ( ) * time . Time {
2019-08-15 22:46:21 +08:00
return ts . AsTimePtrInLocation ( setting . DefaultUILocation )
}
// AsTimePtrInLocation convert timestamp as *time.Time in customize location
func ( ts TimeStamp ) AsTimePtrInLocation ( loc * time . Location ) * time . Time {
tm := time . Unix ( int64 ( ts ) , 0 ) . In ( loc )
2017-12-11 12:37:04 +08:00
return & tm
}
2019-08-15 22:46:21 +08:00
// Format formats timestamp as given format
2017-12-11 12:37:04 +08:00
func ( ts TimeStamp ) Format ( f string ) string {
2019-08-15 22:46:21 +08:00
return ts . FormatInLocation ( f , setting . DefaultUILocation )
}
// FormatInLocation formats timestamp as given format with spiecific location
func ( ts TimeStamp ) FormatInLocation ( f string , loc * time . Location ) string {
return ts . AsTimeInLocation ( loc ) . Format ( f )
2017-12-11 12:37:04 +08:00
}
// FormatLong formats as RFC1123Z
func ( ts TimeStamp ) FormatLong ( ) string {
return ts . Format ( time . RFC1123Z )
}
// FormatShort formats as short
func ( ts TimeStamp ) FormatShort ( ) string {
return ts . Format ( "Jan 02, 2006" )
}
2018-02-26 18:25:45 +08:00
2020-06-06 00:51:10 +02:00
// FormatDate formats a date in YYYY-MM-DD server time zone
func ( ts TimeStamp ) FormatDate ( ) string {
return time . Unix ( int64 ( ts ) , 0 ) . String ( ) [ : 10 ]
}
2018-02-26 18:25:45 +08:00
// IsZero is zero time
func ( ts TimeStamp ) IsZero ( ) bool {
2022-12-20 03:04:55 +01:00
return int64 ( ts ) == 0 || int64 ( ts ) == timeZeroUnix
2018-02-26 18:25:45 +08:00
}