cow_date.erl 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. %% Copyright (c) 2013-2014, Loïc Hoguin <essen@ninenines.eu>
  2. %%
  3. %% Permission to use, copy, modify, and/or distribute this software for any
  4. %% purpose with or without fee is hereby granted, provided that the above
  5. %% copyright notice and this permission notice appear in all copies.
  6. %%
  7. %% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  8. %% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  9. %% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  10. %% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  11. %% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  12. %% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  13. %% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  14. -module(cow_date).
  15. -export([rfc2109/1]).
  16. %% @doc Return the date formatted according to RFC2109.
  17. -spec rfc2109(calendar:datetime()) -> binary().
  18. rfc2109({Date = {Y, Mo, D}, {H, Mi, S}}) ->
  19. Wday = calendar:day_of_the_week(Date),
  20. << (weekday(Wday))/binary, ", ",
  21. (pad_int(D))/binary, "-",
  22. (month(Mo))/binary, "-",
  23. (year(Y))/binary, " ",
  24. (pad_int(H))/binary, ":",
  25. (pad_int(Mi))/binary, ":",
  26. (pad_int(S))/binary, " GMT" >>.
  27. -ifdef(TEST).
  28. rfc2109_test_() ->
  29. Tests = [
  30. {<<"Sat, 14-May-2011 14:25:33 GMT">>, {{2011, 5, 14}, {14, 25, 33}}},
  31. {<<"Sun, 01-Jan-2012 00:00:00 GMT">>, {{2012, 1, 1}, { 0, 0, 0}}}
  32. ],
  33. [{R, fun() -> R = rfc2109(D) end} || {R, D} <- Tests].
  34. -endif.
  35. -ifdef(PERF).
  36. horse_rfc2019_20130101_000000() ->
  37. horse:repeat(100000,
  38. rfc2109({{2013, 1, 1}, {0, 0, 0}})
  39. ).
  40. horse_rfc2019_20131231_235959() ->
  41. horse:repeat(100000,
  42. rfc2109({{2013, 12, 31}, {23, 59, 59}})
  43. ).
  44. horse_rfc2019_12340506_070809() ->
  45. horse:repeat(100000,
  46. rfc2109({{1234, 5, 6}, {7, 8, 9}})
  47. ).
  48. -endif.
  49. %% Internal.
  50. -spec pad_int(0..59) -> <<_:16>>.
  51. pad_int( 0) -> <<"00">>;
  52. pad_int( 1) -> <<"01">>;
  53. pad_int( 2) -> <<"02">>;
  54. pad_int( 3) -> <<"03">>;
  55. pad_int( 4) -> <<"04">>;
  56. pad_int( 5) -> <<"05">>;
  57. pad_int( 6) -> <<"06">>;
  58. pad_int( 7) -> <<"07">>;
  59. pad_int( 8) -> <<"08">>;
  60. pad_int( 9) -> <<"09">>;
  61. pad_int(10) -> <<"10">>;
  62. pad_int(11) -> <<"11">>;
  63. pad_int(12) -> <<"12">>;
  64. pad_int(13) -> <<"13">>;
  65. pad_int(14) -> <<"14">>;
  66. pad_int(15) -> <<"15">>;
  67. pad_int(16) -> <<"16">>;
  68. pad_int(17) -> <<"17">>;
  69. pad_int(18) -> <<"18">>;
  70. pad_int(19) -> <<"19">>;
  71. pad_int(20) -> <<"20">>;
  72. pad_int(21) -> <<"21">>;
  73. pad_int(22) -> <<"22">>;
  74. pad_int(23) -> <<"23">>;
  75. pad_int(24) -> <<"24">>;
  76. pad_int(25) -> <<"25">>;
  77. pad_int(26) -> <<"26">>;
  78. pad_int(27) -> <<"27">>;
  79. pad_int(28) -> <<"28">>;
  80. pad_int(29) -> <<"29">>;
  81. pad_int(30) -> <<"30">>;
  82. pad_int(31) -> <<"31">>;
  83. pad_int(32) -> <<"32">>;
  84. pad_int(33) -> <<"33">>;
  85. pad_int(34) -> <<"34">>;
  86. pad_int(35) -> <<"35">>;
  87. pad_int(36) -> <<"36">>;
  88. pad_int(37) -> <<"37">>;
  89. pad_int(38) -> <<"38">>;
  90. pad_int(39) -> <<"39">>;
  91. pad_int(40) -> <<"40">>;
  92. pad_int(41) -> <<"41">>;
  93. pad_int(42) -> <<"42">>;
  94. pad_int(43) -> <<"43">>;
  95. pad_int(44) -> <<"44">>;
  96. pad_int(45) -> <<"45">>;
  97. pad_int(46) -> <<"46">>;
  98. pad_int(47) -> <<"47">>;
  99. pad_int(48) -> <<"48">>;
  100. pad_int(49) -> <<"49">>;
  101. pad_int(50) -> <<"50">>;
  102. pad_int(51) -> <<"51">>;
  103. pad_int(52) -> <<"52">>;
  104. pad_int(53) -> <<"53">>;
  105. pad_int(54) -> <<"54">>;
  106. pad_int(55) -> <<"55">>;
  107. pad_int(56) -> <<"56">>;
  108. pad_int(57) -> <<"57">>;
  109. pad_int(58) -> <<"58">>;
  110. pad_int(59) -> <<"59">>.
  111. -spec weekday(1..7) -> <<_:24>>.
  112. weekday(1) -> <<"Mon">>;
  113. weekday(2) -> <<"Tue">>;
  114. weekday(3) -> <<"Wed">>;
  115. weekday(4) -> <<"Thu">>;
  116. weekday(5) -> <<"Fri">>;
  117. weekday(6) -> <<"Sat">>;
  118. weekday(7) -> <<"Sun">>.
  119. -spec month(1..12) -> <<_:24>>.
  120. month( 1) -> <<"Jan">>;
  121. month( 2) -> <<"Feb">>;
  122. month( 3) -> <<"Mar">>;
  123. month( 4) -> <<"Apr">>;
  124. month( 5) -> <<"May">>;
  125. month( 6) -> <<"Jun">>;
  126. month( 7) -> <<"Jul">>;
  127. month( 8) -> <<"Aug">>;
  128. month( 9) -> <<"Sep">>;
  129. month(10) -> <<"Oct">>;
  130. month(11) -> <<"Nov">>;
  131. month(12) -> <<"Dec">>.
  132. -spec year(pos_integer()) -> <<_:32>>.
  133. year(1970) -> <<"1970">>;
  134. year(1971) -> <<"1971">>;
  135. year(1972) -> <<"1972">>;
  136. year(1973) -> <<"1973">>;
  137. year(1974) -> <<"1974">>;
  138. year(1975) -> <<"1975">>;
  139. year(1976) -> <<"1976">>;
  140. year(1977) -> <<"1977">>;
  141. year(1978) -> <<"1978">>;
  142. year(1979) -> <<"1979">>;
  143. year(1980) -> <<"1980">>;
  144. year(1981) -> <<"1981">>;
  145. year(1982) -> <<"1982">>;
  146. year(1983) -> <<"1983">>;
  147. year(1984) -> <<"1984">>;
  148. year(1985) -> <<"1985">>;
  149. year(1986) -> <<"1986">>;
  150. year(1987) -> <<"1987">>;
  151. year(1988) -> <<"1988">>;
  152. year(1989) -> <<"1989">>;
  153. year(1990) -> <<"1990">>;
  154. year(1991) -> <<"1991">>;
  155. year(1992) -> <<"1992">>;
  156. year(1993) -> <<"1993">>;
  157. year(1994) -> <<"1994">>;
  158. year(1995) -> <<"1995">>;
  159. year(1996) -> <<"1996">>;
  160. year(1997) -> <<"1997">>;
  161. year(1998) -> <<"1998">>;
  162. year(1999) -> <<"1999">>;
  163. year(2000) -> <<"2000">>;
  164. year(2001) -> <<"2001">>;
  165. year(2002) -> <<"2002">>;
  166. year(2003) -> <<"2003">>;
  167. year(2004) -> <<"2004">>;
  168. year(2005) -> <<"2005">>;
  169. year(2006) -> <<"2006">>;
  170. year(2007) -> <<"2007">>;
  171. year(2008) -> <<"2008">>;
  172. year(2009) -> <<"2009">>;
  173. year(2010) -> <<"2010">>;
  174. year(2011) -> <<"2011">>;
  175. year(2012) -> <<"2012">>;
  176. year(2013) -> <<"2013">>;
  177. year(2014) -> <<"2014">>;
  178. year(2015) -> <<"2015">>;
  179. year(2016) -> <<"2016">>;
  180. year(2017) -> <<"2017">>;
  181. year(2018) -> <<"2018">>;
  182. year(2019) -> <<"2019">>;
  183. year(2020) -> <<"2020">>;
  184. year(2021) -> <<"2021">>;
  185. year(2022) -> <<"2022">>;
  186. year(2023) -> <<"2023">>;
  187. year(2024) -> <<"2024">>;
  188. year(2025) -> <<"2025">>;
  189. year(2026) -> <<"2026">>;
  190. year(2027) -> <<"2027">>;
  191. year(2028) -> <<"2028">>;
  192. year(2029) -> <<"2029">>;
  193. year(Year) -> list_to_binary(integer_to_list(Year)).