4
0

parser.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. // Copyright 2017 Frédéric Guillot. All rights reserved.
  2. // Use of this source code is governed by the Apache 2.0
  3. // license that can be found in the LICENSE file.
  4. package date
  5. import (
  6. "errors"
  7. "fmt"
  8. "strings"
  9. "time"
  10. )
  11. // DateFormats taken from github.com/mjibson/goread
  12. var dateFormats = []string{
  13. time.RFC822, // RSS
  14. time.RFC822Z, // RSS
  15. time.RFC3339, // Atom
  16. time.UnixDate,
  17. time.RubyDate,
  18. time.RFC850,
  19. time.RFC1123Z,
  20. time.RFC1123,
  21. time.ANSIC,
  22. "Mon, January 2 2006 15:04:05 -0700",
  23. "Mon, January 02, 2006, 15:04:05 MST",
  24. "Mon, January 02, 2006 15:04:05 MST",
  25. "Mon, Jan 2, 2006 15:04 MST",
  26. "Mon, Jan 2 2006 15:04 MST",
  27. "Mon, Jan 2, 2006 15:04:05 MST",
  28. "Mon, Jan 2 2006 15:04:05 -700",
  29. "Mon, Jan 2 2006 15:04:05 -0700",
  30. "Mon Jan 2 15:04 2006",
  31. "Mon Jan 2 15:04:05 2006 MST",
  32. "Mon Jan 02, 2006 3:04 pm",
  33. "Mon, Jan 02,2006 15:04:05 MST",
  34. "Mon Jan 02 2006 15:04:05 -0700",
  35. "Monday, January 2, 2006 15:04:05 MST",
  36. "Monday, January 2, 2006 03:04 PM",
  37. "Monday, January 2, 2006",
  38. "Monday, January 02, 2006",
  39. "Monday, 2 January 2006 15:04:05 MST",
  40. "Monday, 2 January 2006 15:04:05 -0700",
  41. "Monday, 2 Jan 2006 15:04:05 MST",
  42. "Monday, 2 Jan 2006 15:04:05 -0700",
  43. "Monday, 02 January 2006 15:04:05 MST",
  44. "Monday, 02 January 2006 15:04:05 -0700",
  45. "Monday, 02 January 2006 15:04:05",
  46. "Monday, January 02, 2006 - 3:04pm",
  47. "Monday, January 2, 2006 - 3:04pm",
  48. "Mon, 2 January 2006 15:04 MST",
  49. "Mon, 2 January 2006, 15:04 -0700",
  50. "Mon, 2 January 2006, 15:04:05 MST",
  51. "Mon, 2 January 2006 15:04:05 MST",
  52. "Mon, 2 January 2006 15:04:05 -0700",
  53. "Mon, 2 January 2006",
  54. "Mon, 2 Jan 2006 3:04:05 PM -0700",
  55. "Mon, 2 Jan 2006 15:4:5 MST",
  56. "Mon, 2 Jan 2006 15:4:5 -0700 GMT",
  57. "Mon, 2, Jan 2006 15:4",
  58. "Mon, 2 Jan 2006 15:04 MST",
  59. "Mon, 2 Jan 2006, 15:04 -0700",
  60. "Mon, 2 Jan 2006 15:04 -0700",
  61. "Mon, 2 Jan 2006 15:04:05 UT",
  62. "Mon, 2 Jan 2006 15:04:05MST",
  63. "Mon, 2 Jan 2006 15:04:05 MST",
  64. "Mon 2 Jan 2006 15:04:05 MST",
  65. "mon,2 Jan 2006 15:04:05 MST",
  66. "Mon, 2 Jan 2006 15:04:05 -0700 MST",
  67. "Mon, 2 Jan 2006 15:04:05-0700",
  68. "Mon, 2 Jan 2006 15:04:05 -0700",
  69. "Mon, 2 Jan 2006 15:04:05",
  70. "Mon, 2 Jan 2006 15:04",
  71. "Mon,2 Jan 2006",
  72. "Mon, 2 Jan 2006",
  73. "Mon, 2 Jan 15:04:05 MST",
  74. "Mon, 2 Jan 06 15:04:05 MST",
  75. "Mon, 2 Jan 06 15:04:05 -0700",
  76. "Mon, 2006-01-02 15:04",
  77. "Mon,02 January 2006 14:04:05 MST",
  78. "Mon, 02 January 2006",
  79. "Mon, 02 Jan 2006 3:04:05 PM MST",
  80. "Mon, 02 Jan 2006 15 -0700",
  81. "Mon,02 Jan 2006 15:04 MST",
  82. "Mon, 02 Jan 2006 15:04 MST",
  83. "Mon, 02 Jan 2006 15:04 -0700",
  84. "Mon, 02 Jan 2006 15:04:05 Z",
  85. "Mon, 02 Jan 2006 15:04:05 UT",
  86. "Mon, 02 Jan 2006 15:04:05 MST-07:00",
  87. "Mon, 02 Jan 2006 15:04:05 MST -0700",
  88. "Mon, 02 Jan 2006, 15:04:05 MST",
  89. "Mon, 02 Jan 2006 15:04:05MST",
  90. "Mon, 02 Jan 2006 15:04:05 MST",
  91. "Mon , 02 Jan 2006 15:04:05 MST",
  92. "Mon, 02 Jan 2006 15:04:05 GMT-0700",
  93. "Mon,02 Jan 2006 15:04:05 -0700",
  94. "Mon, 02 Jan 2006 15:04:05 -0700",
  95. "Mon, 02 Jan 2006 15:04:05 -07:00",
  96. "Mon, 02 Jan 2006 15:04:05 --0700",
  97. "Mon 02 Jan 2006 15:04:05 -0700",
  98. "Mon, 02 Jan 2006 15:04:05 -07",
  99. "Mon, 02 Jan 2006 15:04:05 00",
  100. "Mon, 02 Jan 2006 15:04:05",
  101. "Mon, 02 Jan 2006",
  102. "Mon, 02 Jan 06 15:04:05 MST",
  103. "Mon, 02 Jan 2006 3:04 PM MST",
  104. "January 2, 2006 3:04 PM",
  105. "January 2, 2006, 3:04 p.m.",
  106. "January 2, 2006 15:04:05 MST",
  107. "January 2, 2006 15:04:05",
  108. "January 2, 2006 03:04 PM",
  109. "January 2, 2006",
  110. "January 02, 2006 15:04:05 MST",
  111. "January 02, 2006 15:04",
  112. "January 02, 2006 03:04 PM",
  113. "January 02, 2006",
  114. "Jan 2, 2006 3:04:05 PM MST",
  115. "Jan 2, 2006 3:04:05 PM",
  116. "Jan 2, 2006 15:04:05 MST",
  117. "Jan 2, 2006",
  118. "Jan 02 2006 03:04:05PM",
  119. "Jan 02, 2006",
  120. "6/1/2 15:04",
  121. "6-1-2 15:04",
  122. "2 January 2006 15:04:05 MST",
  123. "2 January 2006 15:04:05 -0700",
  124. "2 January 2006",
  125. "2 Jan 2006 15:04:05 Z",
  126. "2 Jan 2006 15:04:05 MST",
  127. "2 Jan 2006 15:04:05 -0700",
  128. "2 Jan 2006",
  129. "2 Jan 2006 15:04 MST",
  130. "2.1.2006 15:04:05",
  131. "2/1/2006",
  132. "2-1-2006",
  133. "2006 January 02",
  134. "2006-1-2T15:04:05Z",
  135. "2006-1-2 15:04:05",
  136. "2006-1-2",
  137. "2006-1-02T15:04:05Z",
  138. "2006-01-02T15:04Z",
  139. "2006-01-02T15:04-07:00",
  140. "2006-01-02T15:04:05Z",
  141. "2006-01-02T15:04:05-07:00:00",
  142. "2006-01-02T15:04:05:-0700",
  143. "2006-01-02T15:04:05-0700",
  144. "2006-01-02T15:04:05-07:00",
  145. "2006-01-02T15:04:05 -0700",
  146. "2006-01-02T15:04:05:00",
  147. "2006-01-02T15:04:05",
  148. "2006-01-02 at 15:04:05",
  149. "2006-01-02 15:04:05Z",
  150. "2006-01-02 15:04:05 MST",
  151. "2006-01-02 15:04:05-0700",
  152. "2006-01-02 15:04:05-07:00",
  153. "2006-01-02 15:04:05 -0700",
  154. "2006-01-02 15:04",
  155. "2006-01-02 00:00:00.0 15:04:05.0 -0700",
  156. "2006/01/02",
  157. "2006-01-02",
  158. "15:04 02.01.2006 -0700",
  159. "1/2/2006 3:04 PM MST",
  160. "1/2/2006 3:04:05 PM MST",
  161. "1/2/2006 3:04:05 PM",
  162. "1/2/2006 15:04:05 MST",
  163. "1/2/2006",
  164. "06/1/2 15:04",
  165. "06-1-2 15:04",
  166. "02 Monday, Jan 2006 15:04",
  167. "02 Jan 2006 15:04 MST",
  168. "02 Jan 2006 15:04:05 UT",
  169. "02 Jan 2006 15:04:05 MST",
  170. "02 Jan 2006 15:04:05 -0700",
  171. "02 Jan 2006 15:04:05",
  172. "02 Jan 2006",
  173. "02/01/2006 15:04 MST",
  174. "02-01-2006 15:04:05 MST",
  175. "02.01.2006 15:04:05",
  176. "02/01/2006 15:04:05",
  177. "02.01.2006 15:04",
  178. "02/01/2006 - 15:04",
  179. "02.01.2006 -0700",
  180. "02/01/2006",
  181. "02-01-2006",
  182. "01/02/2006 3:04 PM",
  183. "01/02/2006 15:04:05 MST",
  184. "01/02/2006 - 15:04",
  185. "01/02/2006",
  186. "01-02-2006",
  187. }
  188. // Parse parses a given date string using a large
  189. // list of commonly found feed date formats.
  190. func Parse(ds string) (t time.Time, err error) {
  191. d := strings.TrimSpace(ds)
  192. if d == "" {
  193. return t, errors.New("date parser: empty value")
  194. }
  195. for _, f := range dateFormats {
  196. if t, err = time.Parse(f, d); err == nil {
  197. return
  198. }
  199. }
  200. err = fmt.Errorf(`date parser: failed to parse date "%s"`, ds)
  201. return
  202. }