2017-12-11 07:37:04 +03:00
// Copyright 2017 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2017-12-11 07:37:04 +03:00
2019-08-15 17:46:21 +03:00
package timeutil
2017-12-11 07:37:04 +03:00
2017-12-14 02:45:31 +03:00
import (
"time"
"code.gitea.io/gitea/modules/setting"
)
2017-12-11 07:37:04 +03:00
// TimeStamp defines a timestamp
type TimeStamp int64
2022-12-20 05:04:55 +03:00
var (
2023-12-28 13:09:57 +03:00
// mockNow is NOT concurrency-safe!!
mockNow time . Time
2022-12-20 05:04:55 +03:00
// Used for IsZero, to check if timestamp is the zero time instant.
timeZeroUnix = time . Time { } . Unix ( )
)
2021-10-18 23:12:26 +03:00
2023-12-28 13:09:57 +03:00
// MockSet sets the time to a mocked time.Time
func MockSet ( now time . Time ) {
mockNow = now
2021-10-18 23:12:26 +03:00
}
2023-12-28 13:09:57 +03:00
// MockUnset will unset the mocked time.Time
func MockUnset ( ) {
mockNow = time . Time { }
2021-10-18 23:12:26 +03:00
}
2017-12-11 07:37:04 +03:00
// TimeStampNow returns now int64
func TimeStampNow ( ) TimeStamp {
2023-12-28 13:09:57 +03:00
if ! mockNow . IsZero ( ) {
return TimeStamp ( mockNow . Unix ( ) )
2021-10-18 23:12:26 +03:00
}
2017-12-11 07:37:04 +03: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 17:46:21 +03:00
return ts . AsTimeInLocation ( setting . DefaultUILocation )
}
2022-08-25 19:05:21 +03: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 17:46:21 +03: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 07:37:04 +03:00
}
// AsTimePtr convert timestamp as *time.Time in Local locale
func ( ts TimeStamp ) AsTimePtr ( ) * time . Time {
2019-08-15 17:46:21 +03: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 07:37:04 +03:00
return & tm
}
2019-08-15 17:46:21 +03:00
// Format formats timestamp as given format
2017-12-11 07:37:04 +03:00
func ( ts TimeStamp ) Format ( f string ) string {
2019-08-15 17:46:21 +03: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 07:37:04 +03:00
}
2023-12-28 13:09:57 +03:00
// FormatDate formats a date in YYYY-MM-DD
2020-06-06 01:51:10 +03:00
func ( ts TimeStamp ) FormatDate ( ) string {
2023-12-28 13:09:57 +03:00
return ts . Format ( "2006-01-02" )
2020-06-06 01:51:10 +03:00
}
2018-02-26 13:25:45 +03:00
// IsZero is zero time
func ( ts TimeStamp ) IsZero ( ) bool {
2022-12-20 05:04:55 +03:00
return int64 ( ts ) == 0 || int64 ( ts ) == timeZeroUnix
2018-02-26 13:25:45 +03:00
}