Date Format Problem


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Date Format Problem
# 8  
Old 05-11-2016
when you say this is not helping what do you mean ?
You installed the package and it did not help?
Or
Thats not what I am looking for..
If second solution, you have to do the work as you have noticed yourself :
There are differences between the date command under linux and under solaris..
So show us in this particular case what you tried and give us the output so we can help

IF first option - Are you sure you have all? You should have the gnu date utility to be able to run the script the way its written here , if so are you sure its that one beeing used?
Post the output
# 9  
Old 05-11-2016
Hi VBE,

Problem is the environment in which I'm working is provided by our client. So we cannot request for an additional install package. We have to rewrite this code in another way so that we can fit it into the Solaris environment. Please try and run my code in Linux environment with a the following format

<filename> <DD-MMM-YYYY> <DD-MMM-YYYY>
# 10  
Old 05-11-2016
Code:
#!/usr/bin/bash                                
date=$1                                        
#day=${date:0:2}                               
#mo=${date:3:3}                                
#yr=${date:7:4}                                
day=`echo $date|cut -f1 -d"-"`                 
mo=`echo $date|cut -f2 -d"-"`                  
yr=`echo $date|cut -f3 -d"-"`                  
echo $day $mo $yr                              
months="JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"  
i=0                                            
m=0                                            
while [ $i -lt 34 ]                            
do                                             
        if [ "${months:$i:3}" = "$mo" ]        
        then                                   
                m=`expr 1 + $i / 3`            
                i=`expr $i + 35`               
        else                                   
                i=`expr $i + 3`                
        fi                                     
done                                           
if [ $m  -eq 0 ]                               
then                                           
        echo invalid month                     
        exit                                   
fi                                             
numdate=`expr $yr \* 10000 + $m \* 100 + $day` 
echo $numdate

You can decide whether to use cut or substrings to extract the components of the date. Do you always expect 01-MAY-2016, or is 1-MAY-2016 also valid?
There is no check to see if 29-FEB is valid, or whether 31-APR is valid.
This User Gave Thanks to jgt For This Post:
# 11  
Old 05-12-2016
Thanks a lot JGT. But fact is i need to compare two dates and return "correct" if start date is less than end date. I have written down the code and it runs well, fact is I need the code to run well in Solaris environment, where "date -d" is showing as an illegal format. I need modifications to some part of my code instead of breaking down the entire code so that Solaris doesn't throw such error
# 12  
Old 05-12-2016
So change the following two lines in your script.
Code:
d1=`date -d $1 +%s` 
d2=`date -d $2 +%s`

with
Code:
d1=`jgt_date $1`
d2=`jgt_date $2`

Where 'jgt_date' is the script that I posted. You may need to change the last line of my script to
Code:
echo "$numdate\c"
or 
echo -e "$numdate\c"

and also change the exit for invalid month to exit 1.
# 13  
Old 05-13-2016
Thank you everyone for helping me so much. JGT, I have rewritten your code in a slightly different format and it did quiet well. here is the code.

Code:
#!/usr/bin/bash
if [ $# = 2 ]; then

st_date=$1
st_day=`echo $st_date|cut -f1 -d"-"`
st_mo=`echo $st_date|cut -f2 -d"-"`
st_yr=`echo $st_date|cut -f3 -d"-"`
echo $st_day $st_mo $st_yr
months="JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
i=0
st_m=0
while [ $i -lt 34 ]
do
        if [ "${months:$i:3}" = "$st_mo" ]
        then
                st_m=`expr 1 + $i / 3`
                i=`expr $i + 35`
        else
                i=`expr $i + 3`
        fi
done
if [ $st_m  -eq 0 ]
then
        echo invalid month
        exit
fi
start_date=`expr $st_yr \* 10000 + $st_m \* 100 + $st_day`
echo $start_date

ed_date=$2
ed_day=`echo $ed_date|cut -f1 -d"-"`
ed_mo=`echo $ed_date|cut -f2 -d"-"`
ed_yr=`echo $ed_date|cut -f3 -d"-"`
echo $ed_day $ed_mo $ed_yr
months="JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
i=0
m=0
while [ $i -lt 34 ]
do
        if [ "${months:$i:3}" = "$ed_mo" ]
        then
                ed_m=`expr 1 + $i / 3`
                i=`expr $i + 35`
        else
                i=`expr $i + 3`
        fi
done
if [ $ed_m  -eq 0 ]
then
        echo invalid month
        exit
fi
end_date=`expr $ed_yr \* 10000 + $ed_m \* 100 + $ed_day`
echo $end_date

if [ $start_date -le $end_date ]
echo "Success at last";
 exit;
 fi;
 
 else 
 echo "Start date is greater than end date";
exit;
fi;


This code runs in both Linux as well as Solaris and performs every functionality very well.
# 14  
Old 05-13-2016
When I tried you code, it failed with a syntax error due to the missing then on the last if statement.

After fixing that, I also thought it was strange that when the script was invoked with no operands, it responded with Success at last. (The inconsistent indentation in your code probably contributed to this oversight.)

And, there are a lot of calls to the external utilities expr and cut that can be handled much more efficiently and faster using shell built-ins available in bash, ksh93, and a few other shells (although some of them are extensions to the features required to appear in a POSIX-conforming shell).

Maybe something like the following would also work for you:
Code:
#!/usr/bin/bash
#set -xv
IAm=${0##*/}
months="JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"

dateconv='
	    #[0-9][0-9]-[ADFJMNOS][ACEOPU][BCGLNPRTVY]-[0-9][0-9][0-9][0-9] ]]
	if [[ "$in" != \
	    [0-9][0-9]-[[:upper:]][[:upper:]][[:upper:]]-[0-9][0-9][0-9][0-9] ]]
	then	printf "%s: Bad %s date format: \"%s\"\n" "$IAm" "$s_e" \
		    "$in" >&2
		usage 2
	fi
	day=${in%%-*}
	day=${day#0}
	abb_month=${in:3:3}
	year=${in##*-}
	year=${year#0}
	year=${year#0}
	year=${year#0}
	month=0
	echo "$day $abb_month $year"
		for((i = 0; i < 36; i += 3))
	do	if [ "${months:$i:3}" = "$abb_month" ]
		then	month=$(((i + 3) / 3))
			break
		fi
	done
	if [ $month  -eq 0 ]
	then	printf "%s: Invalid abbreviated %s month: \"%s\"\n" "$IAm" \
		    "$s_e" "$abb_month" >&2
		usage 3
	fi
	dt=$(($year * 10000 + $month * 100 + $day))
'

usage() {
	printf 'Usage: %s start_date end_date\n\t%s\n\t%s\n' "$IAm" \
	    'start_date & end_date format: DD-MMM-YYYY' \
	    '(where MMM is a 3 uppercase-letter abbreviation for the month)' >&2
	exit ${1:-1}
}
	
if [ $# -ne 2 ]
then	printf '%s: Incorrect number of operands (%d found, 2 required).\n' \
	    "$IAm" $# >&2
	usage
fi
in=$1
s_e=start
eval "$dateconv"
start_date=$dt
echo $start_date

in=$2
s_e=end
eval "$dateconv"
end_date=$dt
echo $end_date

if [ $start_date -le $end_date ]
then	echo "Success at last"
else 	printf '%s: start date "%s" is greater than end date "%s"\n' "$IAm" \
	    "$1" "$2"
	exit 4
fi

(Note that this uses /usr/bin/bash as it appeared in your code. On my system, there is a /bin/bash but not a /usr/bin/bash.)
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Date: invalid date trying to set Linux date in specific format

i try to set linux date & time in specific format but it keep giving me error Example : date "+%d-%m-%C%y %H:%M:%S" -d "19-01-2017 00:05:01" or date +"%d-%m-%C%y %H:%M:%S" -d "19-01-2017 00:05:01" keep giving me this error : date: invalid date ‘19-01-2017 00:05:01' Please use CODE tags... (7 Replies)
Discussion started by: umen
7 Replies

2. UNIX for Dummies Questions & Answers

Rename all Files in a UNIX Directory from one date format to another date format

Hi Unix Gurus, I would like to rename several files in a Unix Directory . The filenames can have more than 1 underscore ( _ ) and the last underscore is always followed by a date in the format mmddyyyy. The Extension of the files can be .txt or .pdf or .xls etc and is case insensitive ie... (1 Reply)
Discussion started by: pchegoor
1 Replies

3. Shell Programming and Scripting

finding date numeral from file and check the validity of date format

hi there I have file names in different format as below triss_20111117_fxcb.csv triss_fxcb_20111117.csv xpnl_hypo_reu_miplvdone_11172011.csv xpnl_hypo_reu_miplvdone_11-17-2011.csv xpnl_hypo_reu_miplvdone_20111117.csv xpnl_hypo_reu_miplvdone_20111117xfb.csv... (10 Replies)
Discussion started by: manas_ranjan
10 Replies

4. UNIX for Dummies Questions & Answers

Shell Scripts - shows today’s date and time in a better format than ‘date’ (Uses positional paramete

Hello, I am trying to show today's date and time in a better format than ‘date' (Using positional parameters). I found a command mktime and am wondering if this is the best command to use or will this also show me the time elapse since 1/30/70? Any help would be greatly appreciated, Thanks... (3 Replies)
Discussion started by: citizencro
3 Replies

5. Shell Programming and Scripting

How to increment a user defined date value in the DATE format itself using shell script?

I need to increment a date value through shell script. Input value consist of start date and end date in DATE format of unix. For eg. I need increment a date value of 1/1/09 to 31/12/09 i.e for a whole yr. The output must look like 1/1/09 2/2/09 . . . 31/1/09 . . 1/2/09 . 28/2/09... (1 Reply)
Discussion started by: sunil087
1 Replies

6. UNIX for Dummies Questions & Answers

Changing from Excel date format to MySQL date format

I have a list of dates in the following format: mm/dd/yyyy and want to change these to the MySQL standard format: yyyy-mm-dd. The dates in the original file may or may not be zero padded, so April is sometimes "04" and other times simply "4". This is what I use to change the format: sed -i '' -e... (2 Replies)
Discussion started by: figaro
2 Replies

7. Shell Programming and Scripting

having problem in date format

if ( $opt{ww} ) { my $week = $opt{ww} ? $opt{ww} : $lot_list->{cal}->getWW(); print "\nStarting at $week\n"; while ( $week > 200430 ) { print localtime() . ": Working on $week\n"; my ($start,$end) = $lot_list->getWeekDates($week); print localtime() . ":... (3 Replies)
Discussion started by: vahnski
3 Replies

8. Shell Programming and Scripting

convert date format to mysql date format in log file

I have a comma delimited log file which has the date as MM/DD/YY in the 2nd column, and HH:MM:SS in the 3rd column. I need to change the date format to YYYY-MM-DD and merge it with the the time HH:MM:SS. How will I got about this? Sample input 02/27/09,23:52:31 02/27/09,23:52:52... (3 Replies)
Discussion started by: hazno
3 Replies

9. UNIX for Advanced & Expert Users

date issue-find prevoius date in a patricular format

Hi , I have written a shell script that takes the current date on the server and stores it in a file. echo get /usr/home/data-`date '+%Y%d'`.xml> /usr/local/sandeep/GetFILE.ini I call this GetFILE.ini file from an sftp program to fetch a file from /usr/home/ as location. The file is in... (3 Replies)
Discussion started by: bsandeep_80
3 Replies

10. Shell Programming and Scripting

convert mmddyy date format to ccyyddd format??

hi, for reading a cobol indexed file i need to convert "mmddyy" date format to "ccyyddd" format. i checked the datecalc and other scripts but couldnt modify them to cater to my need:(... The datecalc gives an output which i believe is the total days till that date, but i want to convert it... (2 Replies)
Discussion started by: Bhups
2 Replies
Login or Register to Ask a Question