238 lines
6.5 KiB
Go
238 lines
6.5 KiB
Go
![]() |
package ccxt
|
||
|
|
||
|
import (
|
||
|
"math"
|
||
|
"reflect"
|
||
|
"strings"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
// milliseconds returns the current time in milliseconds since the Unix epoch.
|
||
|
func (this *Exchange) Milliseconds() int64 {
|
||
|
return time.Now().UnixNano() / int64(time.Millisecond)
|
||
|
}
|
||
|
|
||
|
func (this *Exchange) Seconds() int64 {
|
||
|
return this.Milliseconds() / 1000
|
||
|
}
|
||
|
|
||
|
// microseconds returns the current time in microseconds since the Unix epoch.
|
||
|
func (this *Exchange) Microseconds() int64 {
|
||
|
return time.Now().UnixNano() / int64(time.Microsecond)
|
||
|
}
|
||
|
|
||
|
// parseDate parses a date string and returns the timestamp in milliseconds since the Unix epoch.
|
||
|
// func (this *Exchange) ParseDate(datetime2 interface{}) interface{} {
|
||
|
// if datetime2 == nil || reflect.TypeOf(datetime2).Kind() != reflect.String {
|
||
|
// return nil
|
||
|
// }
|
||
|
// datetime := datetime2.(string)
|
||
|
// var timestamp int64
|
||
|
// t, err := time.Parse(time.RFC3339, datetime)
|
||
|
// if err != nil {
|
||
|
// return nil
|
||
|
// }
|
||
|
// timestamp = t.UnixNano() / int64(time.Millisecond)
|
||
|
// return timestamp
|
||
|
// }
|
||
|
|
||
|
func (this *Exchange) ParseDate(datetime2 interface{}) interface{} {
|
||
|
if datetime2 == nil || reflect.TypeOf(datetime2).Kind() != reflect.String {
|
||
|
return nil
|
||
|
}
|
||
|
datetime := datetime2.(string)
|
||
|
var timestamp int64
|
||
|
// Layouts for the two formats you want to support
|
||
|
layouts := []string{
|
||
|
"2006-01-02 15:04:05", // Layout for "1986-04-26 00:00:00"
|
||
|
time.RFC3339, // Layout for "1986-04-26T01:23:47.000Z"
|
||
|
}
|
||
|
|
||
|
var err error
|
||
|
var t time.Time
|
||
|
for _, layout := range layouts {
|
||
|
t, err = time.Parse(layout, datetime)
|
||
|
if err == nil {
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// If parsing fails for all layouts, return nil
|
||
|
if err != nil {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Convert the parsed time to milliseconds
|
||
|
timestamp = t.UnixNano() / int64(time.Millisecond)
|
||
|
return timestamp
|
||
|
}
|
||
|
|
||
|
// Iso8601 converts a timestamp to an ISO 8601 formatted string.
|
||
|
func Iso8601(ts2 interface{}) interface{} {
|
||
|
if ts2 == nil {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// if IsNumber(ts) {
|
||
|
ts := ParseInt(ts2)
|
||
|
|
||
|
if ts == math.MinInt64 {
|
||
|
return nil
|
||
|
}
|
||
|
// }
|
||
|
// startdatetime, err := strconv.ParseInt(fmt.Sprintf("%v", ts), 10, 64)
|
||
|
// if err != nil || startdatetime < 0 {
|
||
|
// return nil
|
||
|
// }
|
||
|
startdatetime := ts
|
||
|
|
||
|
if startdatetime < 0 {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Convert timestamp to time and set to UTC
|
||
|
date := time.Unix(0, startdatetime*int64(time.Millisecond)).UTC()
|
||
|
return date.Format("2006-01-02T15:04:05.000Z")
|
||
|
}
|
||
|
|
||
|
// iso8601 is a wrapper for Iso8601.
|
||
|
func (this *Exchange) Iso8601(ts interface{}) interface{} {
|
||
|
return Iso8601(ts)
|
||
|
}
|
||
|
|
||
|
// ymdhms converts a timestamp to a formatted date string "yyyy-MM-dd HH:mm:ss".
|
||
|
func (this *Exchange) Ymdhms(ts interface{}, args ...interface{}) string {
|
||
|
infix := GetArg(args, 0, nil)
|
||
|
if infix == nil {
|
||
|
infix = " "
|
||
|
}
|
||
|
if ts == nil {
|
||
|
return ""
|
||
|
}
|
||
|
startdatetime := ts.(int64)
|
||
|
date := time.Unix(0, startdatetime*int64(time.Millisecond))
|
||
|
return date.Format("2006-01-02" + infix.(string) + "15:04:05")
|
||
|
}
|
||
|
|
||
|
// yyyymmdd converts a timestamp to a formatted date string "yyyy-MM-dd".
|
||
|
func (this *Exchange) Yyyymmdd(ts interface{}, args ...interface{}) string {
|
||
|
infix := GetArg(args, 0, nil)
|
||
|
if infix == nil {
|
||
|
infix = "-"
|
||
|
}
|
||
|
if ts == nil {
|
||
|
return ""
|
||
|
}
|
||
|
startdatetime := ts.(int64)
|
||
|
date := time.Unix(0, startdatetime*int64(time.Millisecond))
|
||
|
return date.Format("2006" + infix.(string) + "01" + infix.(string) + "02")
|
||
|
}
|
||
|
|
||
|
// yymmdd converts a timestamp to a formatted date string "yy-MM-dd".
|
||
|
func (this *Exchange) Yymmdd(ts interface{}, args ...interface{}) string {
|
||
|
infix := GetArg(args, 0, nil)
|
||
|
if infix == nil {
|
||
|
infix = "-"
|
||
|
}
|
||
|
if ts == nil {
|
||
|
return ""
|
||
|
}
|
||
|
startdatetime := ts.(int64)
|
||
|
date := time.Unix(0, startdatetime*int64(time.Millisecond))
|
||
|
return date.Format("06" + infix.(string) + "01" + infix.(string) + "02")
|
||
|
}
|
||
|
|
||
|
// ymd converts a timestamp to a formatted date string "yyyy-MM-dd".
|
||
|
func (this *Exchange) Ymd(ts interface{}, args ...interface{}) string {
|
||
|
infix := GetArg(args, 1, nil)
|
||
|
if infix == nil {
|
||
|
infix = "-"
|
||
|
}
|
||
|
if ts == nil {
|
||
|
return ""
|
||
|
}
|
||
|
startdatetime := ts.(int64)
|
||
|
date := time.Unix(0, startdatetime*int64(time.Millisecond))
|
||
|
return date.Format("2006" + infix.(string) + "01" + infix.(string) + "02")
|
||
|
}
|
||
|
|
||
|
// parse8601 parses an ISO 8601 date string and returns the timestamp in milliseconds since the Unix epoch.
|
||
|
// func (this *Exchange) Parse8601(datetime2 interface{}) interface{} {
|
||
|
// if datetime2 == nil || reflect.TypeOf(datetime2).Kind() != reflect.String {
|
||
|
// return nil
|
||
|
// }
|
||
|
// datetime := datetime2.(string)
|
||
|
// if strings.Contains(datetime, "+0") {
|
||
|
// parts := strings.Split(datetime, "+")
|
||
|
// datetime = parts[0]
|
||
|
// }
|
||
|
// // Try to parse the datetime string as RFC3339 and convert to UTC
|
||
|
// t, err := time.Parse(time.RFC3339, datetime)
|
||
|
// if err != nil {
|
||
|
// return nil
|
||
|
// }
|
||
|
// // Ensure the time is in UTC
|
||
|
// t = t.UTC()
|
||
|
// timestamp := t.UnixNano() / int64(time.Millisecond)
|
||
|
// return timestamp
|
||
|
// }
|
||
|
|
||
|
// func (this *Exchange) Parse8601(datetime2 interface{}) interface{} {
|
||
|
// if datetime2 == nil || reflect.TypeOf(datetime2).Kind() != reflect.String {
|
||
|
// return nil
|
||
|
// }
|
||
|
// datetime := datetime2.(string)
|
||
|
// if strings.Contains(datetime, "+0") {
|
||
|
// parts := strings.Split(datetime, "+")
|
||
|
// datetime = parts[0]
|
||
|
// }
|
||
|
|
||
|
// // First, try to parse using RFC3339 format
|
||
|
// t, err := time.Parse(time.RFC3339, datetime)
|
||
|
// if err != nil {
|
||
|
// // If RFC3339 parsing fails, try the custom layout
|
||
|
// layout := "2006-01-02 15:04:05.999"
|
||
|
// t, err = time.Parse(layout, datetime)
|
||
|
// if err != nil {
|
||
|
// return nil // Return nil if both parsing attempts fail
|
||
|
// }
|
||
|
// }
|
||
|
|
||
|
// // Ensure the time is in UTC
|
||
|
// t = t.UTC()
|
||
|
// timestamp := t.UnixNano() / int64(time.Millisecond)
|
||
|
// return timestamp
|
||
|
// }
|
||
|
|
||
|
func (this *Exchange) Parse8601(datetime2 interface{}) interface{} {
|
||
|
if datetime2 == nil || reflect.TypeOf(datetime2).Kind() != reflect.String {
|
||
|
return nil
|
||
|
}
|
||
|
datetime := datetime2.(string)
|
||
|
if strings.Contains(datetime, "+0") {
|
||
|
parts := strings.Split(datetime, "+")
|
||
|
datetime = parts[0]
|
||
|
}
|
||
|
|
||
|
// First, try to parse using RFC3339 format
|
||
|
t, err := time.Parse(time.RFC3339, datetime)
|
||
|
if err != nil {
|
||
|
// Try parsing without timezone (e.g., "2024-07-18T04:10:33.389")
|
||
|
layoutWithoutTimezone := "2006-01-02T15:04:05.999"
|
||
|
t, err = time.Parse(layoutWithoutTimezone, datetime)
|
||
|
if err != nil {
|
||
|
// If that fails, try the custom layout with space separator (e.g., "2024-07-17 16:00:43.928")
|
||
|
layoutWithSpace := "2006-01-02 15:04:05.999"
|
||
|
t, err = time.Parse(layoutWithSpace, datetime)
|
||
|
if err != nil {
|
||
|
return nil // Return nil if all parsing attempts fail
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Ensure the time is in UTC
|
||
|
t = t.UTC()
|
||
|
timestamp := t.UnixNano() / int64(time.Millisecond)
|
||
|
return timestamp
|
||
|
}
|