308 lines
6.1 KiB
Go
308 lines
6.1 KiB
Go
package utils
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/civet148/log"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
HEIGHTS_ON_DAY = 2880
|
|
SECONDS_ONE_DAY = 24 * 60 * 60
|
|
TIME_FORMAT_DATE = "2006-01-02"
|
|
TIME_FORMAT_DATETIME = "2006-01-02 15:04:05"
|
|
FILECOIN_GENESIS_TIME = 1598306400 //height is 0
|
|
FILECOIN_BLOCK_DURATION = 30 //30s create a new block
|
|
)
|
|
|
|
func Now() string {
|
|
return time.Now().Format(TIME_FORMAT_DATETIME)
|
|
}
|
|
|
|
func NowDate() string {
|
|
return time.Now().Format(TIME_FORMAT_DATE)
|
|
}
|
|
|
|
func FormatTimestampTZ(strTZ string) string {
|
|
var err error
|
|
var t time.Time
|
|
t, err = time.Parse(time.RFC3339, strTZ)
|
|
if err != nil {
|
|
log.Errorf("format timestamp [%s] error [%s]", err.Error())
|
|
return strTZ
|
|
}
|
|
return t.Format(TIME_FORMAT_DATETIME)
|
|
}
|
|
|
|
func NowRandom() string {
|
|
return time.Now().Format("20060102150405.000000000")
|
|
}
|
|
|
|
func NowHeight() int64 {
|
|
now64 := time.Now().Unix()
|
|
return UnixTimeToHeight(now64)
|
|
}
|
|
|
|
func Unix2DateTime(t64 uint64) string {
|
|
if t64 == 0 {
|
|
return ""
|
|
}
|
|
t := time.Unix(int64(t64), 0)
|
|
return t.Format(fmt.Sprintf("%s", TIME_FORMAT_DATETIME))
|
|
}
|
|
|
|
func Unix2Date(t64 uint64) string {
|
|
if t64 == 0 {
|
|
return ""
|
|
}
|
|
t := time.Unix(int64(t64), 0)
|
|
return t.Format(fmt.Sprintf("%s", TIME_FORMAT_DATE))
|
|
}
|
|
|
|
func Minute2Hour(minutes int) string {
|
|
if minutes <= 0 {
|
|
return "0h0m"
|
|
}
|
|
if minutes >= 60 {
|
|
return fmt.Sprintf("%dh%dm", minutes/60, minutes%60)
|
|
}
|
|
return fmt.Sprintf("0h%dm", minutes)
|
|
}
|
|
|
|
func Now64() int64 {
|
|
return time.Now().Unix()
|
|
}
|
|
|
|
func TodayZero() int64 {
|
|
now := time.Now()
|
|
t := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())
|
|
return t.Unix()
|
|
}
|
|
|
|
func YesterDay(cur64 int64) int64 {
|
|
t := time.Unix(cur64, 0)
|
|
d, err := time.ParseDuration("-24h")
|
|
if err != nil {
|
|
log.Errorf("parse duration error [%s]", err)
|
|
return 0
|
|
}
|
|
return t.Add(d).Unix()
|
|
}
|
|
|
|
func ISODateByUnix64(v int64) (t time.Time) {
|
|
return time.Unix(v, 0)
|
|
}
|
|
|
|
func DateTimeStr2Unix(strDateTime string, timeFmt ...interface{}) (unixTime int64) {
|
|
|
|
var t time.Time
|
|
var bNormal = true
|
|
|
|
if len(timeFmt) > 0 {
|
|
|
|
if timeFmt[0].(string) == "/" {
|
|
bNormal = false
|
|
}
|
|
} else {
|
|
if strings.Contains(strDateTime, "/") {
|
|
bNormal = false
|
|
}
|
|
}
|
|
|
|
if len(strDateTime) != 19 {
|
|
|
|
nIndex := strings.Index(strDateTime, " ")
|
|
if nIndex == -1 {
|
|
fmt.Println("error: DateTimeStr2Unix invalid datetime format")
|
|
return 0
|
|
}
|
|
|
|
sdt := strings.Split(strDateTime, " ")
|
|
if len(sdt) == 1 {
|
|
fmt.Println("error: DateTimeStr2Unix invalid datetime format")
|
|
return 0
|
|
}
|
|
|
|
ymd := sdt[0]
|
|
hms := sdt[1]
|
|
|
|
var s1, s2 []string
|
|
if bNormal {
|
|
s1 = strings.Split(ymd, "-")
|
|
|
|
} else {
|
|
s1 = strings.Split(ymd, "/")
|
|
}
|
|
|
|
s2 = strings.Split(hms, ":")
|
|
|
|
if len(s1) != 3 || len(s2) != 3 {
|
|
fmt.Println("error: DateTimeStr2Unix invalid datetime format, not match 'YYYY-MM-DD hh:mm:ss' or 'YYYY/MM/DD hh:mm:ss'")
|
|
return 0
|
|
}
|
|
year := s1[0]
|
|
month := s1[1]
|
|
day := s1[2]
|
|
hour := s2[0]
|
|
min := s2[1]
|
|
sec := s2[2]
|
|
if len(year) != 4 {
|
|
fmt.Println("error: DateTimeStr2Unix invalid year format, not match YYYY")
|
|
return 0
|
|
}
|
|
if len(month) == 1 {
|
|
month = "0" + month
|
|
}
|
|
if len(day) == 1 {
|
|
day = "0" + day
|
|
}
|
|
if len(hour) == 1 {
|
|
hour = "0" + hour
|
|
}
|
|
if len(min) == 1 {
|
|
min = "0" + min
|
|
}
|
|
if len(sec) == 1 {
|
|
sec = "0" + sec
|
|
}
|
|
|
|
if bNormal {
|
|
strDateTime = fmt.Sprintf("%v-%v-%v %v:%v:%v", year, month, day, hour, min, sec)
|
|
|
|
} else {
|
|
strDateTime = fmt.Sprintf("%v/%v/%v %v:%v:%v", year, month, day, hour, min, sec)
|
|
}
|
|
}
|
|
|
|
if strDateTime != "" {
|
|
|
|
loc, _ := time.LoadLocation("Local")
|
|
|
|
if bNormal {
|
|
t, _ = time.ParseInLocation("2006-01-02 15:04:05", strDateTime, loc)
|
|
} else {
|
|
t, _ = time.ParseInLocation("2006/01/02 15:04:05", strDateTime, loc)
|
|
}
|
|
|
|
unixTime = t.Unix()
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func GetDateBeginTime(strDate string) string {
|
|
return strDate + " 00:00:00"
|
|
}
|
|
|
|
func GetDateEndTime(strDate string) string {
|
|
return strDate + " 23:59:30"
|
|
}
|
|
|
|
func DateToEpochBeginTime64(strDate string) int64 {
|
|
strDateTime := GetDateBeginTime(strDate)
|
|
return DateTimeStr2Unix(strDateTime)
|
|
}
|
|
|
|
func DateToEpochEndTime64(strDate string) int64 {
|
|
strDateTime := GetDateEndTime(strDate)
|
|
return DateTimeStr2Unix(strDateTime)
|
|
}
|
|
|
|
func DateBeginHeight(strDate string) int64 {
|
|
strDateTime := GetDateBeginTime(strDate)
|
|
return DateTimeToHeight(strDateTime)
|
|
}
|
|
|
|
func DateEndHeight(strDate string) int64 {
|
|
strDateTime := GetDateEndTime(strDate)
|
|
return DateTimeToHeight(strDateTime)
|
|
}
|
|
|
|
func HeightToTimeUnix64(e int64) int64 {
|
|
return HeightToTime(e).Unix()
|
|
}
|
|
|
|
func HeightToTime(e int64) (t time.Time) {
|
|
unix64 := FILECOIN_GENESIS_TIME + (e * FILECOIN_BLOCK_DURATION)
|
|
return time.Unix(unix64, 0)
|
|
}
|
|
|
|
func HeightToDateTime(e int64) string {
|
|
return HeightToTime(e).Format(TIME_FORMAT_DATETIME)
|
|
}
|
|
|
|
func HeightToDate(e int64) string {
|
|
return HeightToTime(e).Format(TIME_FORMAT_DATE)
|
|
}
|
|
|
|
func UnixTimeToHeight(time64 int64) int64 {
|
|
|
|
d := time64 - FILECOIN_GENESIS_TIME
|
|
if d < 0 {
|
|
return 0
|
|
}
|
|
return d / FILECOIN_BLOCK_DURATION
|
|
}
|
|
|
|
func DateTimeToHeight(strDateTime string) int64 {
|
|
time64 := DateTimeStr2Unix(strDateTime)
|
|
return UnixTimeToHeight(time64)
|
|
}
|
|
|
|
func GetLatestHeight() int64 {
|
|
return UnixTimeToHeight(time.Now().Unix())
|
|
}
|
|
|
|
func TimestampToDate(t time.Time) string {
|
|
return t.Format(TIME_FORMAT_DATE)
|
|
}
|
|
|
|
func DateIsValid(strDate string) bool {
|
|
|
|
if strDate == "" || len(strDate) < 6 {
|
|
return false
|
|
}
|
|
if strDate[0] == '0' {
|
|
return false
|
|
}
|
|
strDate = strings.Replace(strDate, "-", "", -1)
|
|
strDate = strings.Replace(strDate, "/", "", -1)
|
|
if date, err := strconv.Atoi(strDate); err != nil {
|
|
return false
|
|
} else {
|
|
if len(strDate) == 6 {
|
|
if date >= 197011 {
|
|
return true
|
|
}
|
|
} else if len(strDate) == 8 {
|
|
if date >= 19700101 {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func DateStr2Unix(strDate string) int64 {
|
|
|
|
t, err := time.Parse(TIME_FORMAT_DATE, strDate)
|
|
if err != nil {
|
|
log.Errorf("date string [%s] parse error [%s]", strDate, err.Error())
|
|
return 0
|
|
}
|
|
return t.Unix()
|
|
}
|
|
|
|
func DateLessThan(strDate1, strDate2 string) bool {
|
|
d1 := DateStr2Unix(strDate1)
|
|
d2 := DateStr2Unix(strDate2)
|
|
return d1 < d2
|
|
}
|
|
|
|
func DateLessThanNow(strDate string) bool {
|
|
strNowDate := NowDate()
|
|
return DateLessThan(strDate, strNowDate)
|
|
}
|