#!/usr/bin/perl -w use strict; use HTTP::Date; use Time::HiRes; $\ ="\n"; my %month = (Jan => 0, Feb => 31, Mar => 59, Apr => 90, May => 120, Jun => 151, Jul => 181, Aug => 212, Sep => 243, Oct => 273, Nov => 304, Dec => 334); my %year = (1901 => -25202, 1902 => -24837, 1903 => -24472, 1904 => -24107, 1905 => -23741, 1906 => -23376, 1907 => -23011, 1908 => -22646, 1909 => -22280, 1910 => -21915, 1911 => -21550, 1912 => -21185, 1913 => -20819, 1914 => -20454, 1915 => -20089, 1916 => -19724, 1917 => -19358, 1918 => -18993, 1919 => -18628, 1920 => -18263, 1921 => -17897, 1922 => -17532, 1923 => -17167, 1924 => -16802, 1925 => -16436, 1926 => -16071, 1927 => -15706, 1928 => -15341, 1929 => -14975, 1930 => -14610, 1931 => -14245, 1932 => -13880, 1933 => -13514, 1934 => -13149, 1935 => -12784, 1936 => -12419, 1937 => -12053, 1938 => -11688, 1939 => -11323, 1940 => -10958, 1941 => -10592, 1942 => -10227, 1943 => -9862, 1944 => -9497, 1945 => -9131, 1946 => -8766, 1947 => -8401, 1948 => -8036, 1949 => -7670, 1950 => -7305, 1951 => -6940, 1952 => -6575, 1953 => -6209, 1954 => -5844, 1955 => -5479, 1956 => -5114, 1957 => -4748, 1958 => -4383, 1959 => -4018, 1960 => -3653, 1961 => -3287, 1962 => -2922, 1963 => -2557, 1964 => -2192, 1965 => -1826, 1966 => -1461, 1967 => -1096, 1968 => -731, 1969 => -365, 1970 => 0, 1971 => 365, 1972 => 730, 1973 => 1096, 1974 => 1461, 1975 => 1826, 1976 => 2191, 1977 => 2557, 1978 => 2922, 1979 => 3287, 1980 => 3652, 1981 => 4018, 1982 => 4383, 1983 => 4748, 1984 => 5113, 1985 => 5479, 1986 => 5844, 1987 => 6209, 1988 => 6574, 1989 => 6940, 1990 => 7305, 1991 => 7670, 1992 => 8035, 1993 => 8401, 1994 => 8766, 1995 => 9131, 1996 => 9496, 1997 => 9862, 1998 => 10227, 1999 => 10592, 2000 => 10957, 2001 => 11323, 2002 => 11688, 2003 => 12053, 2004 => 12418, 2005 => 12784, 2006 => 13149, 2007 => 13514, 2008 => 13879, 2009 => 14245, 2010 => 14610, 2011 => 14975, 2012 => 15340, 2013 => 15706, 2014 => 16071, 2015 => 16436, 2016 => 16801, 2017 => 17167, 2018 => 17532, 2019 => 17897, 2020 => 18262, 2021 => 18628, 2022 => 18993, 2023 => 19358, 2024 => 19723, 2025 => 20089, 2026 => 20454, 2027 => 20819, 2028 => 21184, 2029 => 21550, 2030 => 21915, 2031 => 22280, 2032 => 22645, 2033 => 23011, 2034 => 23376, 2035 => 23741, 2036 => 24106, 2037 => 24472, 2038 => 24837); my $httpdate = 'Wed, 25 Aug 2010 09:56:38 GMT'; sub mytime { my $year = substr($_[0],12,4); my $days = ($year-1970)*365+ # days in full year passed sprintf('%d', ($year-1970)/4)+ # add leap days in years passed $month{substr($_[0],8,3)}+ # add days in full months passed (substr($_[0],5,2)-1)+ #is doing a -1 to day of month needed? (((($year)%4) == 0 && (($month{substr($_[0],8,3)}+substr($_[0],5,2)) > 59))?1:0); #have we passed the leap day in the current year? return $days*86400+(substr($_[0],17,2)*60*60)+(substr($_[0],20,2)*60)+substr($_[0],23,2); #hrs/mins/secs } sub mytime2 { my $year = substr($_[0],12,4); my $days = ($year-1970)*365+ # days in full year passed ((($year-1970) - (($year-1970) % 4))/4)+ # add leap days in years passed $month{substr($_[0],8,3)}+ # add days in full months passed (substr($_[0],5,2)-1)+ #is doing a -1 to day of month needed? (((($year)%4) == 0 && (($month{substr($_[0],8,3)}+substr($_[0],5,2)) > 59))?1:0); #have we passed the leap day in the current year? return $days*86400+(substr($_[0],17,2)*60*60)+(substr($_[0],20,2)*60)+substr($_[0],23,2); #hrs/mins/secs } sub mytime3 { #yr table my $year = substr($_[0],12,4); my $days = $year{$year}+ #use year day hash $month{substr($_[0],8,3)}+ # add days in full months passed (substr($_[0],5,2)-1)+ #is doing a -1 to day of month needed? (((($year)%4) == 0 && (($month{substr($_[0],8,3)}+substr($_[0],5,2)) > 59))?1:0); #have we passed the leap day in the current year? return $days*86400+(substr($_[0],17,2)*60*60)+(substr($_[0],20,2)*60)+substr($_[0],23,2); #hrs/mins/secs } sub mytime4 { #yr table and full substr caching my $year = substr($_[0],12,4); my $month = substr($_[0],8,3); my $day = substr($_[0],5,2); my $days = $year{$year}+ #use year day hash $month{$month}+ # add days in full months passed ($day-1)+ #is doing a -1 to day of month needed? (((($year)%4) == 0 && (($month{$month}+$day) > 59))?1:0); #have we passed the leap day in the current year? return $days*86400+(substr($_[0],17,2)*60*60)+(substr($_[0],20,2)*60)+substr($_[0],23,2); #hrs/mins/secs } sub mytime5 { #year table and removed redundant year caching my $days = $year{substr($_[0],12,4)}+ #use year day hash $month{substr($_[0],8,3)}+ # add days in full months passed (substr($_[0],5,2)-1)+ #is doing a -1 to day of month needed? ((((substr($_[0],12,4))%4) == 0 && (($month{substr($_[0],8,3)}+substr($_[0],5,2)) > 59))?1:0); #have we passed the leap day in the current year? return $days*86400+(substr($_[0],17,2)*60*60)+(substr($_[0],20,2)*60)+substr($_[0],23,2); #hrs/mins/secs } my $t_a = Time::HiRes::time(); for (0 .. 100000) {mytime($httpdate);} print 'with sprintf int '.(Time::HiRes::time()-$t_a)."\n";; $t_a = Time::HiRes::time(); for (0 .. 100000) {mytime2($httpdate);} print 'with algebra int '.(Time::HiRes::time()-$t_a)."\n";; $t_a = Time::HiRes::time(); for (0 .. 100000) {mytime3($httpdate);} print 'with yr table '.(Time::HiRes::time()-$t_a)."\n";; $t_a = Time::HiRes::time(); for (0 .. 100000) {mytime4($httpdate);} print 'with yr table and full substr caching '.(Time::HiRes::time()-$t_a)."\n";; $t_a = Time::HiRes::time(); for (0 .. 100000) {mytime5($httpdate);} print 'with yr table no cache '.(Time::HiRes::time()-$t_a)."\n";; $t_a = Time::HiRes::time(); for (0 .. 100000) {str2time($httpdate);} print 'with HTTP date '.(Time::HiRes::time()-$t_a)."\n";; print "algorithm outputs"; print mytime($httpdate); print mytime2($httpdate); print mytime3($httpdate); print mytime4($httpdate); print mytime5($httpdate); print str2time($httpdate);