parser.go 5.4 KB

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