184 lines
4.1 KiB
Go
184 lines
4.1 KiB
Go
// Copyright (C) INFINI Labs & INFINI LIMITED.
|
|
//
|
|
// The INFINI Console is offered under the GNU Affero General Public License v3.0
|
|
// and as commercial software.
|
|
//
|
|
// For commercial licensing, contact us at:
|
|
// - Website: infinilabs.com
|
|
// - Email: hello@infini.ltd
|
|
//
|
|
// Open Source licensed under AGPL V3:
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Affero General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Affero General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
/* Copyright © INFINI Ltd. All rights reserved.
|
|
* web: https://infinilabs.com
|
|
* mail: hello#infini.ltd */
|
|
|
|
package funcs
|
|
|
|
import (
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
func datetimeInZone(zone string, date interface{}) string {
|
|
return _dateInZone("2006-01-02 15:04:05", date, zone)
|
|
}
|
|
func datetime(date interface{}) string {
|
|
return _dateInZone("2006-01-02 15:04:05", date, "Local")
|
|
}
|
|
|
|
func date(date interface{}) string {
|
|
return _dateInZone("2006-01-02", date, "Local")
|
|
}
|
|
|
|
func dateInZone(zone string, date interface{}) string {
|
|
return _dateInZone("2006-01-02", date, zone)
|
|
}
|
|
|
|
func _dateInZone(fmt string, date interface{}, zone string) string {
|
|
var t time.Time
|
|
switch date := date.(type) {
|
|
default:
|
|
t = time.Now()
|
|
case time.Time:
|
|
t = date
|
|
case *time.Time:
|
|
t = *date
|
|
case int64:
|
|
if date > 1e12 {
|
|
date = date / 1000
|
|
}
|
|
t = time.Unix(date, 0)
|
|
case int:
|
|
t = time.Unix(int64(date), 0)
|
|
|
|
case int32:
|
|
t = time.Unix(int64(date), 0)
|
|
case string:
|
|
return date
|
|
}
|
|
|
|
loc, err := time.LoadLocation(zone)
|
|
if err != nil {
|
|
loc, _ = time.LoadLocation("UTC")
|
|
}
|
|
|
|
return t.In(loc).Format(fmt)
|
|
}
|
|
|
|
func dateModify(fmt string, date time.Time) time.Time {
|
|
d, err := time.ParseDuration(fmt)
|
|
if err != nil {
|
|
return date
|
|
}
|
|
return date.Add(d)
|
|
}
|
|
|
|
func mustDateModify(fmt string, date time.Time) (time.Time, error) {
|
|
d, err := time.ParseDuration(fmt)
|
|
if err != nil {
|
|
return time.Time{}, err
|
|
}
|
|
return date.Add(d), nil
|
|
}
|
|
|
|
func dateAgo(date interface{}) string {
|
|
var t time.Time
|
|
|
|
switch date := date.(type) {
|
|
default:
|
|
t = time.Now()
|
|
case time.Time:
|
|
t = date
|
|
case int64:
|
|
t = time.Unix(date, 0)
|
|
case int:
|
|
t = time.Unix(int64(date), 0)
|
|
}
|
|
// Drop resolution to seconds
|
|
duration := time.Since(t).Round(time.Second)
|
|
return duration.String()
|
|
}
|
|
|
|
func duration(sec interface{}) string {
|
|
var n int64
|
|
switch value := sec.(type) {
|
|
default:
|
|
n = 0
|
|
case string:
|
|
n, _ = strconv.ParseInt(value, 10, 64)
|
|
case int64:
|
|
n = value
|
|
}
|
|
return (time.Duration(n) * time.Second).String()
|
|
}
|
|
|
|
func durationRound(duration interface{}) string {
|
|
var d time.Duration
|
|
switch duration := duration.(type) {
|
|
default:
|
|
d = 0
|
|
case string:
|
|
d, _ = time.ParseDuration(duration)
|
|
case int64:
|
|
d = time.Duration(duration)
|
|
case time.Time:
|
|
d = time.Since(duration)
|
|
}
|
|
|
|
u := uint64(d)
|
|
neg := d < 0
|
|
if neg {
|
|
u = -u
|
|
}
|
|
|
|
var (
|
|
year = uint64(time.Hour) * 24 * 365
|
|
month = uint64(time.Hour) * 24 * 30
|
|
day = uint64(time.Hour) * 24
|
|
hour = uint64(time.Hour)
|
|
minute = uint64(time.Minute)
|
|
second = uint64(time.Second)
|
|
)
|
|
switch {
|
|
case u > year:
|
|
return strconv.FormatUint(u/year, 10) + "y"
|
|
case u > month:
|
|
return strconv.FormatUint(u/month, 10) + "mo"
|
|
case u > day:
|
|
return strconv.FormatUint(u/day, 10) + "d"
|
|
case u > hour:
|
|
return strconv.FormatUint(u/hour, 10) + "h"
|
|
case u > minute:
|
|
return strconv.FormatUint(u/minute, 10) + "m"
|
|
case u > second:
|
|
return strconv.FormatUint(u/second, 10) + "s"
|
|
}
|
|
return "0s"
|
|
}
|
|
|
|
func toDate(fmt, str string) time.Time {
|
|
t, _ := time.ParseInLocation(fmt, str, time.Local)
|
|
return t
|
|
}
|
|
|
|
func mustToDate(fmt, str string) (time.Time, error) {
|
|
return time.ParseInLocation(fmt, str, time.Local)
|
|
}
|
|
|
|
func unixEpoch(date time.Time) string {
|
|
return strconv.FormatInt(date.Unix(), 10)
|
|
}
|