111 lines
2.0 KiB
Go
111 lines
2.0 KiB
Go
package goja
|
|
|
|
import (
|
|
"regexp"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
dateTimeLayout = "Mon Jan 02 2006 15:04:05 GMT-0700 (MST)"
|
|
isoDateTimeLayout = "2006-01-02T15:04:05.000Z"
|
|
dateLayout = "Mon Jan 02 2006"
|
|
timeLayout = "15:04:05 GMT-0700 (MST)"
|
|
datetimeLayout_en_GB = "01/02/2006, 15:04:05"
|
|
dateLayout_en_GB = "01/02/2006"
|
|
timeLayout_en_GB = "15:04:05"
|
|
)
|
|
|
|
type dateObject struct {
|
|
baseObject
|
|
time time.Time
|
|
isSet bool
|
|
}
|
|
|
|
var (
|
|
dateLayoutList = []string{
|
|
"2006",
|
|
"2006-01",
|
|
"2006-01-02",
|
|
|
|
"2006T15:04",
|
|
"2006-01T15:04",
|
|
"2006-01-02T15:04",
|
|
|
|
"2006T15:04:05",
|
|
"2006-01T15:04:05",
|
|
"2006-01-02T15:04:05",
|
|
|
|
"2006T15:04:05.000",
|
|
"2006-01T15:04:05.000",
|
|
"2006-01-02T15:04:05.000",
|
|
|
|
"2006T15:04-0700",
|
|
"2006-01T15:04-0700",
|
|
"2006-01-02T15:04-0700",
|
|
|
|
"2006T15:04:05-0700",
|
|
"2006-01T15:04:05-0700",
|
|
"2006-01-02T15:04:05-0700",
|
|
|
|
"2006T15:04:05.000-0700",
|
|
"2006-01T15:04:05.000-0700",
|
|
"2006-01-02T15:04:05.000-0700",
|
|
|
|
time.RFC1123,
|
|
dateTimeLayout,
|
|
}
|
|
matchDateTimeZone = regexp.MustCompile(`^(.*)(?:(Z)|([\+\-]\d{2}):(\d{2}))$`)
|
|
)
|
|
|
|
func dateParse(date string) (time.Time, bool) {
|
|
// YYYY-MM-DDTHH:mm:ss.sssZ
|
|
var t time.Time
|
|
var err error
|
|
{
|
|
date := date
|
|
if match := matchDateTimeZone.FindStringSubmatch(date); match != nil {
|
|
if match[2] == "Z" {
|
|
date = match[1] + "+0000"
|
|
} else {
|
|
date = match[1] + match[3] + match[4]
|
|
}
|
|
}
|
|
for _, layout := range dateLayoutList {
|
|
t, err = time.Parse(layout, date)
|
|
if err == nil {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
return t, err == nil
|
|
}
|
|
|
|
func (r *Runtime) newDateObject(t time.Time, isSet bool) *Object {
|
|
v := &Object{runtime: r}
|
|
d := &dateObject{}
|
|
v.self = d
|
|
d.val = v
|
|
d.class = classDate
|
|
d.prototype = r.global.DatePrototype
|
|
d.extensible = true
|
|
d.init()
|
|
d.time = t.In(time.Local)
|
|
d.isSet = isSet
|
|
return v
|
|
}
|
|
|
|
func dateFormat(t time.Time) string {
|
|
return t.Local().Format(dateTimeLayout)
|
|
}
|
|
|
|
func (d *dateObject) toPrimitive() Value {
|
|
return d.toPrimitiveString()
|
|
}
|
|
|
|
func (d *dateObject) export() interface{} {
|
|
if d.isSet {
|
|
return d.time
|
|
}
|
|
return nil
|
|
}
|