<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: dates code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sat, 26 Jul 2008 05:05:55 GMT</pubDate>
    <description>DZone Snippets: dates code</description>
    <item>
      <title>Display the number of characters in the name of each month</title>
      <link>http://snippets.dzone.com/posts/show/4401</link>
      <description>&lt;code&gt;&lt;br /&gt;months = %w(January February March April May June July August September October November December)&lt;br /&gt;months.each { |m| print  m, " (", m.length, ")\n" }&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 08 Aug 2007 01:59:52 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4401</guid>
      <author>logankoester (Logan Koester)</author>
    </item>
    <item>
      <title>Rewrite Apache logs that have incorrect dates</title>
      <link>http://snippets.dzone.com/posts/show/4090</link>
      <description>// Rewrite Apache logs that have incorrect dates&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;&lt;br /&gt;# $Id$&lt;br /&gt;&lt;br /&gt;# Rewrite Apache logs that have incorrect dates.&lt;br /&gt;# Example usage: $0 '28/May/2006:01:17:14 +0200' '19/Jan/2007:08:49:14 +0100' \&lt;br /&gt;#                access_log.* error_log.*&lt;br /&gt;&lt;br /&gt;use strict;&lt;br /&gt;use warnings;&lt;br /&gt;&lt;br /&gt;## no critic (ValuesAndExpressions::RequireInterpolationOfMetachars)&lt;br /&gt;our ($VERSION) = '$Revision$' =~ m{ \$Revision: \s+ (\S+) }xms;&lt;br /&gt;## use critic&lt;br /&gt;&lt;br /&gt;use HTTP::Date;&lt;br /&gt;&lt;br /&gt;my @DAYS   = qw(Sun Mon Tue Wed Thu Fri Sat);&lt;br /&gt;my @MONTHS = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);&lt;br /&gt;&lt;br /&gt;my $wrong_datetime = shift @ARGV;&lt;br /&gt;my $right_datetime = shift @ARGV;&lt;br /&gt;&lt;br /&gt;my ($timezone) = $right_datetime =~ m/ ([+-]\d\d\d\d)\z/xms;&lt;br /&gt;&lt;br /&gt;my $seconds_diff = str2time($right_datetime) - str2time($wrong_datetime);&lt;br /&gt;&lt;br /&gt;foreach my $file (@ARGV) {&lt;br /&gt;    print "Rewriting $file\n";&lt;br /&gt;    open my $IN,  '&lt;', $file&lt;br /&gt;        or die "Can't open $file: $!\n";&lt;br /&gt;    open my $OUT, '&gt;', "$file.rewritten"&lt;br /&gt;        or die "Can't write to $file.rewritten: $!\n";&lt;br /&gt;    while (&lt;$IN&gt;) {&lt;br /&gt;        if (m{&lt;br /&gt;               \A&lt;br /&gt;               (.+\s+) # Before date and time (if any)&lt;br /&gt;               \[&lt;br /&gt;               (&lt;br /&gt;                   \d\d/\w\w\w/\d\d\d\d # Date&lt;br /&gt;                   :\d\d:\d\d:\d\d      # Time&lt;br /&gt;                   \s&lt;br /&gt;                   [\+\-]\d\d\d\d       # Time zone&lt;br /&gt;               )&lt;br /&gt;               \]&lt;br /&gt;               (\s+.+) # After date and time&lt;br /&gt;               \z&lt;br /&gt;             }xms) {&lt;br /&gt;            print {$OUT} &lt;br /&gt;              $1, q{[},&lt;br /&gt;              rewrite_access_datetime($2, $seconds_diff, $timezone),&lt;br /&gt;              q{]}, $3;&lt;br /&gt;        }&lt;br /&gt;        elsif (m{&lt;br /&gt;               \A&lt;br /&gt;               \[&lt;br /&gt;               (&lt;br /&gt;                   \w\w\w \s \w\w\w \s \d\d \s # Date&lt;br /&gt;                   \d\d:\d\d:\d\d \s           # Time&lt;br /&gt;                   \d\d\d\d                    # Year&lt;br /&gt;               )&lt;br /&gt;               \]&lt;br /&gt;               (\s+.+) # After date and time&lt;br /&gt;               \z&lt;br /&gt;             }xms) {&lt;br /&gt;            print {$OUT} &lt;br /&gt;              q{[},&lt;br /&gt;              rewrite_error_datetime($1, $seconds_diff),&lt;br /&gt;              q{]}, $2;&lt;br /&gt;        }&lt;br /&gt;        else {&lt;br /&gt;            print {$OUT} $_;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub rewrite_access_datetime {&lt;br /&gt;    my ($datetime, $seconds_diff, $timezone) = @_;&lt;br /&gt;    &lt;br /&gt;    my ($sign, $hours, $minutes) = $timezone =~ m/\A([+-])(\d\d)(\d\d)\z/xms;&lt;br /&gt;    my $seconds_offset = ($hours * 60 + $minutes) * 60;&lt;br /&gt;    &lt;br /&gt;    $datetime = str2time($datetime) + $seconds_diff;&lt;br /&gt;    if    ($sign eq q{+}) {&lt;br /&gt;        $datetime = $datetime + $seconds_offset;&lt;br /&gt;    }&lt;br /&gt;    elsif ($sign eq q{-}) {&lt;br /&gt;        $datetime = $datetime - $seconds_offset;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    my ($sec, $min, $hour, $mday, $mon, $year) = gmtime $datetime;&lt;br /&gt;    return sprintf '%02d/%s/%04d:%02d:%02d:%02d %s',&lt;br /&gt;        $mday, $MONTHS[$mon], $year + 1900, $hour, $min, $sec, $timezone;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sub rewrite_error_datetime {&lt;br /&gt;    my ($datetime, $seconds_diff) = @_;&lt;br /&gt;    &lt;br /&gt;    $datetime = str2time($datetime) + $seconds_diff;&lt;br /&gt;    &lt;br /&gt;    my ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime $datetime;&lt;br /&gt;    return sprintf '%s %s %02d %02d:%02d:%02d %04d',&lt;br /&gt;        $DAYS[$wday], $MONTHS[$mon], $mday, $hour, $min, $sec, $year + 1900;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 02 Jun 2007 07:26:38 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4090</guid>
      <author>iansealy (Ian Sealy)</author>
    </item>
    <item>
      <title>Date.distance_to method for Ruby</title>
      <link>http://snippets.dzone.com/posts/show/2109</link>
      <description>Gives years, months, and days between two dates (like a human would expect)&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class Date&lt;br /&gt;  def distance_to(end_date)&lt;br /&gt;    years = end_date.year - year&lt;br /&gt;    months = end_date.month - month&lt;br /&gt;    days = end_date.day - day&lt;br /&gt;    if days &lt; 0&lt;br /&gt;      days += 30&lt;br /&gt;      months -= 1&lt;br /&gt;    end&lt;br /&gt;    if months &lt; 0&lt;br /&gt;      months += 12&lt;br /&gt;      years -= 1&lt;br /&gt;    end&lt;br /&gt;    {:years =&gt; years, :months =&gt; months, :days =&gt; days}&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 27 May 2006 00:58:55 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2109</guid>
      <author>timmorgan (Tim Morgan)</author>
    </item>
    <item>
      <title>Turn a date range into SQL conditions</title>
      <link>http://snippets.dzone.com/posts/show/1328</link>
      <description>From &lt;a href="http://project.ioni.st/post/592#post-592"&gt;here&lt;/a&gt; on Project.ioni.st.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;(6.months.ago.to_date..1.year.ago.to_date).to_s(:db)&lt;br /&gt;=&gt; "BETWEEN '2005-07-27' AND '2005-01-22'"&lt;/code&gt;</description>
      <pubDate>Wed, 01 Feb 2006 04:48:09 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/1328</guid>
      <author>peter (Peter Cooperx)</author>
    </item>
    <item>
      <title>work days between two dates without cycling through dates</title>
      <link>http://snippets.dzone.com/posts/show/808</link>
      <description>I was thinking about how to optimize figuring out the work days between two dates and came up with this function.  It doesn't take into account holidays.  You would have to take out the workdays for holidays from the number if you want to take into account holidays, but that should be easy enough.&lt;br /&gt;&lt;br /&gt;4GL Version&lt;br /&gt;&lt;code&gt; &lt;br /&gt;# workdays&lt;br /&gt;# returns the number of working days between two dates&lt;br /&gt;FUNCTION workdays( dt_begin, dt_end )&lt;br /&gt;&lt;br /&gt;DEFINE&lt;br /&gt;   dt_begin             DATE,&lt;br /&gt;   dt_end               DATE,&lt;br /&gt;   dt_first_sunday      DATE,&lt;br /&gt;   dt_last_saturday     DATE,&lt;br /&gt;   int_workdays         INTEGER&lt;br /&gt;&lt;br /&gt;   # get first sunday&lt;br /&gt;   LET dt_first_sunday = dt_begin + ((7 - WEEKDAY(dt_begin)) MOD 7)&lt;br /&gt;&lt;br /&gt;   # get last saturday&lt;br /&gt;   LET dt_last_saturday = dt_end + ((-1 * (WEEKDAY(dt_end) + 1)) MOD 7)&lt;br /&gt;&lt;br /&gt;   # get work weeks between first sunday and last saturday&lt;br /&gt;   LET int_workdays = (((dt_last_saturday - dt_first_sunday) + 1) / 7) * 5&lt;br /&gt;   &lt;br /&gt;   # if first sunday is not begin date&lt;br /&gt;   IF dt_first_sunday &lt;&gt; dt_begin THEN&lt;br /&gt;&lt;br /&gt;      # assume first sunday is after begin date&lt;br /&gt;      # add workdays from begin date to first sunday&lt;br /&gt;      LET int_workdays = int_workdays + (6 - WEEKDAY(dt_begin))&lt;br /&gt;&lt;br /&gt;   END IF&lt;br /&gt;&lt;br /&gt;   # if last saturday is not end date&lt;br /&gt;   IF dt_last_saturday &lt;&gt; dt_end THEN&lt;br /&gt;&lt;br /&gt;      # assume last saturday is before end date&lt;br /&gt;      # add workdays from last saturday to end date&lt;br /&gt;      LET int_workdays = int_workdays + WEEKDAY(dt_end)  &lt;br /&gt;  &lt;br /&gt;   END IF&lt;br /&gt;&lt;br /&gt;   # return working days&lt;br /&gt;   RETURN int_workdays&lt;br /&gt;&lt;br /&gt;END FUNCTION&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;VBA Version&lt;br /&gt;&lt;code&gt;&lt;br /&gt;' WorkDays&lt;br /&gt;' returns the number of working days between two dates&lt;br /&gt;Public Function WorkDays(ByVal dtBegin As Date, ByVal dtEnd As Date) As Long&lt;br /&gt;&lt;br /&gt;   Dim dtFirstSunday As Date&lt;br /&gt;   Dim dtLastSaturday As Date&lt;br /&gt;   Dim lngWorkDays As Long&lt;br /&gt;&lt;br /&gt;   ' get first sunday in range&lt;br /&gt;   dtFirstSunday = dtBegin + ((8 - Weekday(dtBegin)) Mod 7)&lt;br /&gt;&lt;br /&gt;   ' get last saturday in range&lt;br /&gt;   dtLastSaturday = dtEnd - (Weekday(dtEnd) Mod 7)&lt;br /&gt;&lt;br /&gt;   ' get work days between first sunday and last saturday&lt;br /&gt;   lngWorkDays = (((dtLastSaturday - dtFirstSunday) + 1) / 7) * 5&lt;br /&gt;&lt;br /&gt;   ' if first sunday is not begin date&lt;br /&gt;   If dtFirstSunday &lt;&gt; dtBegin Then&lt;br /&gt;&lt;br /&gt;      ' assume first sunday is after begin date&lt;br /&gt;      ' add workdays from begin date to first sunday&lt;br /&gt;      lngWorkDays = lngWorkDays + (7 - Weekday(dtBegin))&lt;br /&gt;&lt;br /&gt;   End If&lt;br /&gt;&lt;br /&gt;   ' if last saturday is not end date&lt;br /&gt;   If dtLastSaturday &lt;&gt; dtEnd Then&lt;br /&gt;&lt;br /&gt;      ' assume last saturday is before end date&lt;br /&gt;      ' add workdays from last saturday to end date&lt;br /&gt;      lngWorkDays = lngWorkDays + (Weekday(dtEnd) - 1)&lt;br /&gt;&lt;br /&gt;   End If&lt;br /&gt;&lt;br /&gt;   ' return working days&lt;br /&gt;   WorkDays = lngWorkDays&lt;br /&gt;&lt;br /&gt;End Function&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 13 Oct 2005 23:24:13 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/808</guid>
      <author>Will_Rickards (Will Rickards)</author>
    </item>
  </channel>
</rss>
