Sponsored Content
Full Discussion: General Purpose Date Script
Top Forums UNIX for Beginners Questions & Answers General Purpose Date Script Post 302868649 by Corona688 on Monday 28th of October 2013 12:03:14 PM
Old 10-28-2013
I get no such errors here, even when fiddling with the TZ variable (which perl appears to support). What version of perl do you use?

The real error was that the string 'now', which caused no errors, wasn't supported and should have been flagged.

Error detection has been made more robust as a result and support for 'now' added:

Code:
#!/usr/bin/perl

use POSIX;

my $cmdstr="%Y-%m-%d %H:%M:%S";
my ($input, $arg, $sign)=(undef, undef, 0);
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime();

# Commandline parsing stuff
while(defined($arg=shift)) {
        if($arg =~ /^--date=/)  {       $input=substr($arg, 7);         }
        elsif($arg =~ /^-d$/)   {       $input=shift;                   }
        elsif($arg =~/^\+/)     {       $cmdstr=substr($arg,1);         }
        else                    {       print STDERR "unknown $arg\n";  }
}

# Put the date string back into argv, split on spaces
unshift(@ARGV, split(/[ \t]+/, $input));

while(defined($arg=shift))
{
        # Need to split +1 into +1
        if($arg =~ /^[+]/) {    $sign=1;        $arg=substr($arg,1);    }
        elsif($arg =~ /^-/) {   $sign=-1;       $arg=substr($arg,1);    }

        ################## DATE FORMAT DETECTION ########################

        # @1234 means seconds in epoch time
        if($arg =~ /^@[0-9]+$/)
        {
                ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($1+0);
                next;
        }

        # Checks for YYYYMMDD or YYYY/MM/DD time
        # TODO:  Check for YYMMDD dates
        # TODO:  Check for YYYYDDMM dates (ugh)
        if($arg =~ /^([0-9]{4})(\/?)([0-9]{2})\2([0-9]{2})/)
        {
                ($year,$mon,$mday)=($1-1900,$3-1,$4+0);
                ($sec,$min,$hour)=(0,0,0);
                next;
        }

        # HH:MM:SS times
        if($arg =~ /([0-2][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?$/)
        {
                ($sec,$min,$hour)=($3+0, $2+0, $1+0);
                next;
        }

        # As last resort, assume its a pure number.
        if($arg =~ /^([0-9]+)$/) {
                if($sign == 0)
                {
                        print STDERR "offset without unit";
                        exit(1);
                }

                $offset=$1+0;
                next;
        }

        if($arg =~ /^seconds?$/)        {       }
        elsif ($arg =~ /^years?$/) {
                                        $year += ($offset*$sign);
                                        $sign=0;
                                        $offset=0;
                                }
        elsif($arg =~ /^minutes?$/)     {       $offset *= 60;          }
        elsif($arg =~ /^hours?/)        {       $offset *= 60*60;       }
        elsif($arg =~ /^days?/)         {       $offset *= 60*60*24;    }
        elsif($arg =~ /^weeks?/)        {       $offset *= 60*60*24*7;  }
        elsif($arg =~ /^months?$/)      {

                                        $mon += ($offset*$sign);

                                        while($mon > 12)
                                        {
                                                $mon-=12;
                                                $year++;
                                        }

                                        while($mon < 0)
                                        {
                                                $mon+=12;
                                                $year--;
                                        }

                                        $sign=0;
                                        $offset=0;
                                }
        elsif($arg =~ /^now$/)  {
                ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime();
        }
        elsif(length($arg) == 0){       } # Empty string?  Ignore
        else                    {
                                        print STDERR "Unknown argument $arg\n";
                                        exit(1);
        }
}

# Convert the altered year, month, etc back into epoch time.
my $ref=mktime($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst);
# Add the seconds offset calculated above.
$ref += ($sign * $offset);
# Convert back into list.
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($ref);

print strftime($cmdstr."\n",
        $sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst);


Last edited by Corona688; 10-28-2013 at 01:16 PM..
 

8 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Looking for a general purpose System Monitor

Does anyone have any scripts or suggestions on a general purpose Unix/Linux monitoring tool? (5 Replies)
Discussion started by: darthur
5 Replies

2. UNIX for Dummies Questions & Answers

whats the purpose of the following script?

whats the purpose of the following script? who could run it? To what is the script refering that exceeds 75%? The mailbox? What does sed 's/%//' do? (1 Reply)
Discussion started by: vrn
1 Replies

3. Shell Programming and Scripting

General Q: how to run/schedule a php script from cron jobs maybe via bash from shell?

Status quo is, within a web application, which is coded completely in php (not by me, I dont know php), I have to fill out several fields, and execute it manually by clicking the "go" button in my browser, several times a day. Thats because: The script itself pulls data (textfiles) from a... (3 Replies)
Discussion started by: lowmaster
3 Replies

4. Shell Programming and Scripting

awk (?) help or just general script

I have two files (___ represents blanks) Foo1 1000 345 456 1001 876 908 1002 ___ 786 1003 643 908 1004 345 234 and Foo2 1000 345 1001 876 1002 111 1003 643 1004 345 (3 Replies)
Discussion started by: garethsays
3 Replies

5. Shell Programming and Scripting

script to fill up disk space for testing purpose

Hello everyone I am new to this forum I am working on a project and needed a test script to fill up a disk partition /tmp/data to see how the program fails. The system I am working on is a redhat 5.3. Is there anything out there? Thanks. (10 Replies)
Discussion started by: dp100022
10 Replies

6. UNIX for Dummies Questions & Answers

Purpose of - (hypen) in script or command line

Hi, I am new for unix and I am following ABS guide. What is the purpose of - (hypen ) in the below command and What it will do in this?. Can anyone explain it in detail. Rest of the things in the below command I understood somewhat. (cd /source/directory && tar cf - . ) | (cd /dest/directory &&... (1 Reply)
Discussion started by: gwgreen1
1 Replies

7. Shell Programming and Scripting

Script to determine Date,TotalFile,total size of file based on date

I have file listed like below -rw-r--r--+ 1 test test 17M Nov 26 14:43 test1.gz -rw-r--r--+ 1 test test 0 Nov 26 14:44 test2.gz -rw-r--r--+ 1 test test 0 Nov 27 10:41 test3.gz -rw-r--r--+ 1 test test 244K Nov 27 10:41 test4.gz -rw-r--r--+ 1 test test 17M Nov 27 10:41 test5.gz I... (5 Replies)
Discussion started by: krish2014
5 Replies

8. UNIX for Beginners Questions & Answers

General Purpose XML Processing

I've been kicking this around for a while now, I might as well post it here. v0.0.9, now properly supporting self-closing tags. v0.0.8, an important quoting fix and a minor change which should handle special <? <!-- etc. tags without seizing up as often. Otherwise the code hasn't changed much.... (6 Replies)
Discussion started by: Corona688
6 Replies
All times are GMT -4. The time now is 03:50 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy