specifiers.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. package strftime
  2. import "strings"
  3. // https://strftime.org/
  4. func goLayout(spec, flag byte, parsing bool) string {
  5. switch spec {
  6. default:
  7. return ""
  8. case 'B':
  9. return "January"
  10. case 'b', 'h':
  11. return "Jan"
  12. case 'm':
  13. if flag == '-' || parsing {
  14. return "1"
  15. }
  16. return "01"
  17. case 'A':
  18. return "Monday"
  19. case 'a':
  20. return "Mon"
  21. case 'e':
  22. return "_2"
  23. case 'd':
  24. if flag == '-' || parsing {
  25. return "2"
  26. }
  27. return "02"
  28. case 'j':
  29. if flag == '-' {
  30. if parsing {
  31. return "__2"
  32. }
  33. return ""
  34. }
  35. return "002"
  36. case 'I':
  37. if flag == '-' || parsing {
  38. return "3"
  39. }
  40. return "03"
  41. case 'H':
  42. if flag == '-' && !parsing {
  43. return ""
  44. }
  45. return "15"
  46. case 'M':
  47. if flag == '-' || parsing {
  48. return "4"
  49. }
  50. return "04"
  51. case 'S':
  52. if flag == '-' || parsing {
  53. return "5"
  54. }
  55. return "05"
  56. case 'y':
  57. return "06"
  58. case 'Y':
  59. return "2006"
  60. case 'p':
  61. return "PM"
  62. case 'P':
  63. return "pm"
  64. case 'Z':
  65. return "MST"
  66. case 'z':
  67. if flag == ':' {
  68. if parsing {
  69. return "Z07:00"
  70. }
  71. return "-07:00"
  72. }
  73. if parsing {
  74. return "Z0700"
  75. }
  76. return "-0700"
  77. case '+':
  78. if parsing {
  79. return "Mon Jan _2 15:4:5 MST 2006"
  80. }
  81. return "Mon Jan _2 15:04:05 MST 2006"
  82. case 'c':
  83. if parsing {
  84. return "Mon Jan _2 15:4:5 2006"
  85. }
  86. return "Mon Jan _2 15:04:05 2006"
  87. case 'v':
  88. return "_2-Jan-2006"
  89. case 'F':
  90. if parsing {
  91. return "2006-1-2"
  92. }
  93. return "2006-01-02"
  94. case 'D', 'x':
  95. if parsing {
  96. return "1/2/06"
  97. }
  98. return "01/02/06"
  99. case 'r':
  100. if parsing {
  101. return "3:4:5 PM"
  102. }
  103. return "03:04:05 PM"
  104. case 'T', 'X':
  105. if parsing {
  106. return "15:4:5"
  107. }
  108. return "15:04:05"
  109. case 'R':
  110. if parsing {
  111. return "15:4"
  112. }
  113. return "15:04"
  114. case '%':
  115. return "%"
  116. case 't':
  117. return "\t"
  118. case 'n':
  119. return "\n"
  120. }
  121. }
  122. // https://nsdateformatter.com/
  123. func uts35Pattern(spec, flag byte) string {
  124. switch spec {
  125. default:
  126. return ""
  127. case 'B':
  128. return "MMMM"
  129. case 'b', 'h':
  130. return "MMM"
  131. case 'm':
  132. if flag == '-' {
  133. return "M"
  134. }
  135. return "MM"
  136. case 'A':
  137. return "EEEE"
  138. case 'a':
  139. return "E"
  140. case 'd':
  141. if flag == '-' {
  142. return "d"
  143. }
  144. return "dd"
  145. case 'j':
  146. if flag == '-' {
  147. return "D"
  148. }
  149. return "DDD"
  150. case 'I':
  151. if flag == '-' {
  152. return "h"
  153. }
  154. return "hh"
  155. case 'H':
  156. if flag == '-' {
  157. return "H"
  158. }
  159. return "HH"
  160. case 'M':
  161. if flag == '-' {
  162. return "m"
  163. }
  164. return "mm"
  165. case 'S':
  166. if flag == '-' {
  167. return "s"
  168. }
  169. return "ss"
  170. case 'y':
  171. return "yy"
  172. case 'Y':
  173. return "yyyy"
  174. case 'g':
  175. return "YY"
  176. case 'G':
  177. return "YYYY"
  178. case 'V':
  179. if flag == '-' {
  180. return "w"
  181. }
  182. return "ww"
  183. case 'p':
  184. return "a"
  185. case 'Z':
  186. return "zzz"
  187. case 'z':
  188. if flag == ':' {
  189. return "xxx"
  190. }
  191. return "xx"
  192. case 'L':
  193. return "SSS"
  194. case 'f':
  195. return "SSSSSS"
  196. case 'N':
  197. return "SSSSSSSSS"
  198. case '+':
  199. return "E MMM d HH:mm:ss zzz yyyy"
  200. case 'c':
  201. return "E MMM d HH:mm:ss yyyy"
  202. case 'v':
  203. return "d-MMM-yyyy"
  204. case 'F':
  205. return "yyyy-MM-dd"
  206. case 'D', 'x':
  207. return "MM/dd/yy"
  208. case 'r':
  209. return "hh:mm:ss a"
  210. case 'T', 'X':
  211. return "HH:mm:ss"
  212. case 'R':
  213. return "HH:mm"
  214. case '%':
  215. return "%"
  216. case 't':
  217. return "\t"
  218. case 'n':
  219. return "\n"
  220. }
  221. }
  222. // http://man.he.net/man3/strftime
  223. func okModifier(mod, spec byte) bool {
  224. if mod == 'E' {
  225. return strings.Contains("cCxXyY", string(spec))
  226. }
  227. if mod == 'O' {
  228. return strings.Contains("deHImMSuUVwWy", string(spec))
  229. }
  230. return false
  231. }