date.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package goja
  2. import (
  3. "regexp"
  4. "time"
  5. )
  6. const (
  7. dateTimeLayout = "Mon Jan 02 2006 15:04:05 GMT-0700 (MST)"
  8. isoDateTimeLayout = "2006-01-02T15:04:05.000Z"
  9. dateLayout = "Mon Jan 02 2006"
  10. timeLayout = "15:04:05 GMT-0700 (MST)"
  11. datetimeLayout_en_GB = "01/02/2006, 15:04:05"
  12. dateLayout_en_GB = "01/02/2006"
  13. timeLayout_en_GB = "15:04:05"
  14. )
  15. type dateObject struct {
  16. baseObject
  17. time time.Time
  18. isSet bool
  19. }
  20. var (
  21. dateLayoutList = []string{
  22. "2006",
  23. "2006-01",
  24. "2006-01-02",
  25. "2006T15:04",
  26. "2006-01T15:04",
  27. "2006-01-02T15:04",
  28. "2006T15:04:05",
  29. "2006-01T15:04:05",
  30. "2006-01-02T15:04:05",
  31. "2006T15:04:05.000",
  32. "2006-01T15:04:05.000",
  33. "2006-01-02T15:04:05.000",
  34. "2006T15:04-0700",
  35. "2006-01T15:04-0700",
  36. "2006-01-02T15:04-0700",
  37. "2006T15:04:05-0700",
  38. "2006-01T15:04:05-0700",
  39. "2006-01-02T15:04:05-0700",
  40. "2006T15:04:05.000-0700",
  41. "2006-01T15:04:05.000-0700",
  42. "2006-01-02T15:04:05.000-0700",
  43. time.RFC1123,
  44. dateTimeLayout,
  45. }
  46. matchDateTimeZone = regexp.MustCompile(`^(.*)(?:(Z)|([\+\-]\d{2}):(\d{2}))$`)
  47. )
  48. func dateParse(date string) (time.Time, bool) {
  49. // YYYY-MM-DDTHH:mm:ss.sssZ
  50. var t time.Time
  51. var err error
  52. {
  53. date := date
  54. if match := matchDateTimeZone.FindStringSubmatch(date); match != nil {
  55. if match[2] == "Z" {
  56. date = match[1] + "+0000"
  57. } else {
  58. date = match[1] + match[3] + match[4]
  59. }
  60. }
  61. for _, layout := range dateLayoutList {
  62. t, err = time.Parse(layout, date)
  63. if err == nil {
  64. break
  65. }
  66. }
  67. }
  68. return t, err == nil
  69. }
  70. func (r *Runtime) newDateObject(t time.Time, isSet bool) *Object {
  71. v := &Object{runtime: r}
  72. d := &dateObject{}
  73. v.self = d
  74. d.val = v
  75. d.class = classDate
  76. d.prototype = r.global.DatePrototype
  77. d.extensible = true
  78. d.init()
  79. d.time = t.In(time.Local)
  80. d.isSet = isSet
  81. return v
  82. }
  83. func dateFormat(t time.Time) string {
  84. return t.Local().Format(dateTimeLayout)
  85. }
  86. func (d *dateObject) toPrimitive() Value {
  87. return d.toPrimitiveString()
  88. }
  89. func (d *dateObject) export() interface{} {
  90. if d.isSet {
  91. return d.time
  92. }
  93. return nil
  94. }