parser.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  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, 02 Jan 2006, 15:04",
  72. "Mon, 2 Jan 2006, 15:04",
  73. "Mon,2 Jan 2006",
  74. "Mon, 2 Jan 2006",
  75. "Mon, 2 Jan 15:04:05 MST",
  76. "Mon, 2 Jan 06 15:04:05 MST",
  77. "Mon, 2 Jan 06 15:04:05 -0700",
  78. "Mon, 2006-01-02 15:04",
  79. "Mon,02 January 2006 14:04:05 MST",
  80. "Mon, 02 January 2006",
  81. "Mon, 02 Jan 2006 3:04:05 PM MST",
  82. "Mon, 02 Jan 2006 15 -0700",
  83. "Mon,02 Jan 2006 15:04 MST",
  84. "Mon, 02 Jan 2006 15:04 MST",
  85. "Mon, 02 Jan 2006 15:04 -0700",
  86. "Mon, 02 Jan 2006 15:04:05 Z",
  87. "Mon, 02 Jan 2006 15:04:05 UT",
  88. "Mon, 02 Jan 2006 15:04:05 MST-07:00",
  89. "Mon, 02 Jan 2006 15:04:05 MST -0700",
  90. "Mon, 02 Jan 2006, 15:04:05 MST",
  91. "Mon, 02 Jan 2006 15:04:05MST",
  92. "Mon, 02 Jan 2006 15:04:05 MST",
  93. "Mon , 02 Jan 2006 15:04:05 MST",
  94. "Mon, 02 Jan 2006 15:04:05 GMT-0700",
  95. "Mon,02 Jan 2006 15:04:05 -0700",
  96. "Mon, 02 Jan 2006 15:04:05 -0700",
  97. "Mon, 02 Jan 2006 15:04:05 -07:00",
  98. "Mon, 02 Jan 2006 15:04:05 --0700",
  99. "Mon 02 Jan 2006 15:04:05 -0700",
  100. "Mon, 02 Jan 2006 15:04:05 -07",
  101. "Mon, 02 Jan 2006 15:04:05 00",
  102. "Mon, 02 Jan 2006 15:04:05",
  103. "Mon, 02 Jan 2006",
  104. "Mon, 02 Jan 06 15:04:05 MST",
  105. "Mon, 02 Jan 2006 3:04 PM MST",
  106. "January 2, 2006 3:04 PM",
  107. "January 2, 2006, 3:04 p.m.",
  108. "January 2, 2006 15:04:05 MST",
  109. "January 2, 2006 15:04:05",
  110. "January 2, 2006 03:04 PM",
  111. "January 2, 2006",
  112. "January 02, 2006 15:04:05 MST",
  113. "January 02, 2006 15:04",
  114. "January 02, 2006 03:04 PM",
  115. "January 02, 2006",
  116. "Jan 2, 2006 3:04:05 PM MST",
  117. "Jan 2, 2006 3:04:05 PM",
  118. "Jan 2, 2006 15:04:05 MST",
  119. "Jan 2, 2006",
  120. "Jan 02 2006 03:04:05PM",
  121. "Jan 02, 2006",
  122. "6/1/2 15:04",
  123. "6-1-2 15:04",
  124. "2 January 2006 15:04:05 MST",
  125. "2 January 2006 15:04:05 -0700",
  126. "2 January 2006",
  127. "2 Jan 2006 15:04:05 Z",
  128. "2 Jan 2006 15:04:05 MST",
  129. "2 Jan 2006 15:04:05 -0700",
  130. "2 Jan 2006",
  131. "2 Jan 2006 15:04 MST",
  132. "2.1.2006 15:04:05",
  133. "2/1/2006",
  134. "2-1-2006",
  135. "2006 January 02",
  136. "2006-1-2T15:04:05Z",
  137. "2006-1-2 15:04:05",
  138. "2006-1-2",
  139. "2006-1-02T15:04:05Z",
  140. "2006-01-02T15:04Z",
  141. "2006-01-02T15:04-07:00",
  142. "2006-01-02T15:04:05Z",
  143. "2006-01-02T15:04:05-07:00:00",
  144. "2006-01-02T15:04:05:-0700",
  145. "2006-01-02T15:04:05-0700",
  146. "2006-01-02T15:04:05-07:00",
  147. "2006-01-02T15:04:05 -0700",
  148. "2006-01-02T15:04:05:00",
  149. "2006-01-02T15:04:05",
  150. "2006-01-02 at 15:04:05",
  151. "2006-01-02 15:04:05Z",
  152. "2006-01-02 15:04:05 MST",
  153. "2006-01-02 15:04:05-0700",
  154. "2006-01-02 15:04:05-07:00",
  155. "2006-01-02 15:04:05 -0700",
  156. "2006-01-02 15:04",
  157. "2006-01-02 00:00:00.0 15:04:05.0 -0700",
  158. "2006/01/02",
  159. "2006-01-02",
  160. "15:04 02.01.2006 -0700",
  161. "1/2/2006 3:04 PM MST",
  162. "1/2/2006 3:04:05 PM MST",
  163. "1/2/2006 3:04:05 PM",
  164. "1/2/2006 15:04:05 MST",
  165. "1/2/2006",
  166. "06/1/2 15:04",
  167. "06-1-2 15:04",
  168. "02 Monday, Jan 2006 15:04",
  169. "02 Jan 2006 15:04 MST",
  170. "02 Jan 2006 15:04:05 UT",
  171. "02 Jan 2006 15:04:05 MST",
  172. "02 Jan 2006 15:04:05 -0700",
  173. "02 Jan 2006 15:04:05",
  174. "02 Jan 2006",
  175. "02/01/2006 15:04 MST",
  176. "02-01-2006 15:04:05 MST",
  177. "02.01.2006 15:04:05",
  178. "02/01/2006 15:04:05",
  179. "02.01.2006 15:04",
  180. "02/01/2006 - 15:04",
  181. "02.01.2006 -0700",
  182. "02/01/2006",
  183. "02-01-2006",
  184. "01/02/2006 3:04 PM",
  185. "01/02/2006 15:04:05 MST",
  186. "01/02/2006 - 15:04",
  187. "01/02/2006",
  188. "01-02-2006",
  189. }
  190. // Parse parses a given date string using a large
  191. // list of commonly found feed date formats.
  192. func Parse(ds string) (t time.Time, err error) {
  193. ds = replaceNonEnglishWords(ds)
  194. d := strings.TrimSpace(ds)
  195. if d == "" {
  196. return t, errors.New("date parser: empty value")
  197. }
  198. for _, f := range dateFormats {
  199. if t, err = time.Parse(f, d); err == nil {
  200. return
  201. }
  202. }
  203. lastSpace := strings.LastIndex(ds, " ")
  204. if lastSpace > 0 {
  205. return Parse(ds[0:lastSpace])
  206. }
  207. err = fmt.Errorf(`date parser: failed to parse date "%s"`, ds)
  208. return
  209. }
  210. // Replace German and French dates to English.
  211. func replaceNonEnglishWords(ds string) string {
  212. r := strings.NewReplacer(
  213. "Mo,", "Mon,",
  214. "Di,", "Tue,",
  215. "Mi,", "Wed,",
  216. "Do,", "Thu,",
  217. "Fr,", "Fri,",
  218. "Sa,", "Sat,",
  219. "So,", "Sun,",
  220. "Mär ", "Mar ",
  221. "Mai ", "May ",
  222. "Okt ", "Oct ",
  223. "Dez ", "Dec ",
  224. "lun,", "Mon,",
  225. "mar,", "Tue,",
  226. "mer,", "Wed,",
  227. "jeu,", "Thu,",
  228. "ven,", "Fri,",
  229. "sam,", "Sat,",
  230. "dim,", "Sun,",
  231. "avr ", "Apr ",
  232. "mai ", "May ",
  233. "jui ", "Jun ",
  234. )
  235. return r.Replace(ds)
  236. }