Guest User

Untitled

a guest
Jul 19th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.11 KB | None | 0 0
  1. use strict;
  2. use warnings;
  3. use 5.010;
  4.  
  5. use DateTime;
  6.  
  7. my $now = DateTime->now(time_zone => 'local');
  8. my $five_weeks = DateTime::Duration->new(weeks => 5);
  9. my $five_weeks_ago = $now - $five_weeks;
  10.  
  11. say "Five weeks ago now it was $five_weeks_ago";
  12.  
  13. use strict;
  14. use warnings;
  15.  
  16. my $date = shift || '7/19/2011';
  17. my $days_ago = shift || 7*5;
  18.  
  19. $date =~ s#^([0-9]+)/([0-9]+)/([0-9]+)z#@{[sprintf"%.2d",$1]}/@{[sprintf"%.2d",$2]}/$3/$days_ago#;
  20. until ( $date =~ s#^([0-9]+)/([0-9]+)/([0-9]+)/0z#@{[$1+0]}/@{[$2+0]}/$3# ) {
  21. $date =~ s#([0-9]+)/([0-9]+)/([0-9]+)/([0-9]+)#@{[$2==1?sprintf"%.2d",$1-1||12:$1]}/@{[sprintf"%.2d",$2-1||31]}/@{[$1==1 && $2==1?$3-1:$3]}/@{[$4-1]}#;
  22. $date =~ s#([0-9]+)z#@{[$1+1]}# unless $date =~ m#^(?:0[1-9]|1[012])/(?:0[1-9]|1[0-9]|2[0-8]|(?<!0[2469]/|11/)31|(?<!02/)30|(?<!02/(?=...(?:..(?:[02468][1235679]|[13579][01345789])|(?:[02468][1235679]|[13579][01345789])00)))29)/#;
  23. }
  24. print $date, "n";
  25.  
  26. use strict;
  27. use warnings;
  28. use Date::Calc qw/Add_Delta_Days Today/;
  29.  
  30. my $offset_weeks = -5;
  31. my $offset_days = $offset_weeks * 7;
  32.  
  33. # Year, Month, Day
  34. my @delta_date = Add_Delta_Days(
  35. Today( [ localtime ] ),
  36. $offset_days
  37. );
  38.  
  39. printf "%2d/%2d/%4dn", @delta_date[1,2,0];
  40.  
  41. #!/usr/bin/perl
  42.  
  43. use strict;
  44. use warnings;
  45.  
  46. use POSIX qw/strftime/;
  47.  
  48. my @date = localtime;
  49.  
  50. print strftime "today is %Y-%m-%dn", @date;
  51.  
  52. $date[3] -= 5 * 7;
  53.  
  54. print strftime "five weeks ago was %Y-%m-%dn", @date;
  55.  
  56. #!/usr/bin/perl
  57.  
  58. use strict;
  59. use warnings;
  60.  
  61. use Benchmark;
  62.  
  63. use Date::Manip qw/UnixDate/;
  64. use Date::Simple qw/today/;
  65. use Date::Calc qw/Add_Delta_Days Today/;
  66. use DateTime;
  67. use POSIX qw/strftime/;
  68. use Class::Date;
  69.  
  70. my %subs = (
  71. cd => sub {
  72. (Class::Date::now - [0, 0, 5 * 7])->strftime("%Y-%m-%d");
  73. },
  74. dc => sub {
  75. sprintf "%d-%02s-%02d", Add_Delta_Days Today, -5 * 7;
  76. },
  77. dm => sub {
  78. UnixDate("5 weeks ago", "%Y-%m-%d");
  79. },
  80. ds => sub {
  81. (today() - 5 * 7)->strftime("%Y-%m-%d");
  82. },
  83. dt => sub {
  84. my $now = DateTime->from_epoch(epoch => time, time_zone => "local");
  85. my $five_weeks = DateTime::Duration->new(weeks => 5);
  86. ($now - $five_weeks)->ymd('-');
  87. },
  88. p => sub {
  89. my @date = localtime;
  90. $date[3] -= 5 * 7;
  91. strftime "%Y-%m-%d", @date;
  92. },
  93. y => sub {
  94. my ($d, $m, $y) = (localtime)[3..5];
  95. my $date = join "/", $m+1, $d, $y+1900;
  96. my $days_ago = 7*5;
  97.  
  98. $date =~ s#^([0-9]+)/([0-9]+)/([0-9]+)z#@{[sprintf"%.2d",$1]}/@{[sprintf"%.2d",$2]}/$3/$days_ago#;
  99. until ( $date =~ s#^([0-9]+)/([0-9]+)/([0-9]+)/0z#@{[$1+0]}/@{[$2+0]}/$3# ) {
  100. $date =~ s#([0-9]+)/([0-9]+)/([0-9]+)/([0-9]+)#@{[$2==1?sprintf"%.2d",$1-1||12:$1]}/@{[sprintf"%.2d",$2-1||31]}/@{[$1==1 && $2==1?$3-1:$3]}/@{[$4-1]}#;
  101. $date =~ s#([0-9]+)z#@{[$1+1]}# unless $date =~ m#^(?:0[1-9]|1[012])/(?:0[1-9]|1[0-9]|2[0-8]|(?<!0[2469]/|11/)31|(?<!02/)30|(?<!02/(?=...(?:..(?:[02468][1235679]|[13579][01345789])|(?:[02468][1235679]|[13579][01345789])00)))29)/#;
  102. }
  103. return $date;
  104. },
  105. );
  106.  
  107. print "$_: ", $subs{$_}(), "n" for keys %subs;
  108.  
  109. Benchmark::cmpthese -1, %subs;
  110.  
  111. y: 6/14/2011
  112. dm: 2011-06-14
  113. p: 2011-06-14
  114. dc: 2011-06-14
  115. cd: 2011-06-14
  116. dt: 2011-06-15
  117. ds: 2011-06-14
  118. Rate dt dm y ds cd dc p
  119. dt 1345/s -- -5% -28% -77% -82% -96% -98%
  120. dm 1408/s 5% -- -24% -75% -81% -96% -98%
  121. y 1862/s 38% 32% -- -68% -75% -95% -97%
  122. ds 5743/s 327% 308% 208% -- -24% -84% -90%
  123. cd 7529/s 460% 435% 304% 31% -- -78% -87%
  124. dc 34909/s 2495% 2378% 1775% 508% 364% -- -39%
  125. p 56775/s 4121% 3931% 2949% 889% 654% 63% --
  126.  
  127. #!/usr/bin/perl
  128.  
  129. use strict;
  130. use warnings;
  131.  
  132. use Time::Mock;
  133. use Date::Manip qw/UnixDate/;
  134. use Date::Simple qw/today/;
  135. use Date::Calc qw/Add_Delta_Days Today/;
  136. use DateTime;
  137. use POSIX qw/strftime mktime/;
  138. use Class::Date;
  139.  
  140. sub target {
  141. my @date = localtime;
  142. $date[3] -= 5 * 7;
  143. strftime "%Y-%m-%d", @date;
  144. }
  145.  
  146. my %subs = (
  147. cd => sub {
  148. (Class::Date::now - [0, 0, 5 * 7])->strftime("%Y-%m-%d");
  149. },
  150. dc => sub { sprintf "%d-%02s-%02d", Add_Delta_Days Today, -5 * 7;
  151. },
  152. dm => sub {
  153. UnixDate("5 weeks ago", "%Y-%m-%d");
  154. },
  155. ds => sub {
  156. (today() - 5 * 7)->strftime("%Y-%m-%d");
  157. },
  158. dt => sub {
  159. my $now = DateTime->from_epoch( epoch => time, time_zone => 'local' );
  160. my $five_weeks = DateTime::Duration->new(weeks => 5);
  161. ($now - $five_weeks)->ymd('-');
  162. },
  163. y => sub {
  164. my ($d, $m, $y) = (localtime)[3..5];
  165. my $date = join "/", $m+1, $d, $y+1900;
  166. my $days_ago = 7*5;
  167.  
  168. $date =~ s#^([0-9]+)/([0-9]+)/([0-9]+)z#@{[sprintf"%.2d",$1]}/@{[sprintf"%.2d",$2]}/$3/$days_ago#;
  169. until ( $date =~ s#^([0-9]+)/([0-9]+)/([0-9]+)/0z#@{[$1+0]}/@{[$2+0]}/$3# ) {
  170. $date =~ s#([0-9]+)/([0-9]+)/([0-9]+)/([0-9]+)#@{[$2==1?sprintf"%.2d",$1-1||12:$1]}/@{[sprintf"%.2d",$2-1||31]}/@{[$1==1 && $2==1?$3-1:$3]}/@{[$4-1]}#;
  171. $date =~ s#([0-9]+)z#@{[$1+1]}# unless $date =~ m#^(?:0[1-9]|1[012])/(?:0[1-9]|1[0-9]|2[0-8]|(?<!0[2469]/|11/)31|(?<!02/)30|(?<!02/(?=...(?:..(?:[02468][1235679]|[13579][01345789])|(?:[02468][1235679]|[13579][01345789])00)))29)/#;
  172. }
  173. return join "-", map { sprintf "%02d", $_ }
  174. (split "/", $date)[2,0,1];
  175. },
  176. );
  177.  
  178. my $time = mktime 0, 0, 0, 13, 2, 111; #2011-03-13 00:00:00, DST in US
  179.  
  180. for my $offset (map { $_ * 60 * 60 } 1 .. 24) {
  181. print strftime "%Y-%m-%d %H:%M:%Sn", (localtime $time + $offset);
  182. Time::Mock->set($time + $offset);
  183. my $target = target;
  184.  
  185. for my $sub (sort keys %subs) {
  186. my $result = $subs{$sub}();
  187. if ($result ne $target) {
  188. print "$sub disagrees: ",
  189. "time $time target $target result $resultn";
  190. }
  191. }
  192. }
  193.  
  194. say POSIX::strftime(
  195. '%m/%d/%Y' # format string -> mm/dd/YYYY
  196. , 0 # no seconds
  197. , 0 # no minutes
  198. , 0 # no hours
  199. , 19 - ( 5 * 7 ) # current day - numweeks * 7
  200. , 7 - 1 # month - 1
  201. , 2011 - 1900 # YYYY year - 1900
  202. );
  203.  
  204. use POSIX qw/strftime/;
  205. say strftime('%Y-%m-%d', localtime(time - 5 * 7 * 86400));
Add Comment
Please, Sign In to add comment