Need to minus one day from a date given


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Need to minus one day from a date given
# 1  
Old 07-03-2017
Need to minus one day from a date given

Hello Folks,

I have a variable output holding date as below -
output = "20141220"
I need to extract a day out of it and store it in another variable i.e. something similar to below -
output1=20141219"
and if the month is changing i.e. date in on 31st or 1st it should be taken care of
"date -d" is not supported in the version I am using, any leads will be greatly appreciated...
# 2  
Old 07-03-2017
Quote:
Originally Posted by ektubbe
"date -d" is not supported in the version I am using
You don't need date -d for this type of things - use the TZ-variable (Time Zone) instead.

You see, time ist stored in "UTC" (universal time coordinated) in UNIX systems. the local time is just an offset from this, and this offset is set by the TZ variable, which you can change for a single command, for instance:

Code:
# TZ=GMT+1 date
Mon Jul  3 08:40:29 GMT 2017
# TZ=GMT+25 date
Sun Jul  2 08:40:37 GMT 2017

You see, adding/subtracting 24 to the TZ variable changes the output by 24 hours - which is a day. The same way you can get any arbitrary date, even in the future:

Code:
# TZ=GMT+1 date
Mon Jul  3 08:43:32 GMT 2017
# TZ=GMT+25 date
Sun Jul  2 08:43:32 GMT 2017
# TZ=GMT-23 date
Tue Jul  4 08:43:32 GMT 2017


I hope this helps.

bakunin
# 3  
Old 07-03-2017
That was good, but did not help sorry...

Thank you for the solution, but I do not deal with system date, it is an arbitary date given by the system and I need to minus a day from it.
Quote:
Originally Posted by bakunin
You don't need date -d for this type of things - use the TZ-variable (Time Zone) instead.

You see, time ist stored in "UTC" (universal time coordinated) in UNIX systems. the local time is just an offset from this, and this offset is set by the TZ variable, which you can change for a single command, for instance:

Code:
# TZ=GMT+1 date
Mon Jul  3 08:40:29 GMT 2017
# TZ=GMT+25 date
Sun Jul  2 08:40:37 GMT 2017

You see, adding/subtracting 24 to the TZ variable changes the output by 24 hours - which is a day. The same way you can get any arbitrary date, even in the future:

Code:
# TZ=GMT+1 date
Mon Jul  3 08:43:32 GMT 2017
# TZ=GMT+25 date
Sun Jul  2 08:43:32 GMT 2017
# TZ=GMT-23 date
Tue Jul  4 08:43:32 GMT 2017


I hope this helps.

bakunin
# 4  
Old 07-04-2017
Hi.

If you can use ksh93, then there is extensive support for date manipulation.

See http://blog.fpmurphy.com/2008/10/ksh...ipulation.html for a number of examples ... cheers, drl
# 5  
Old 07-04-2017
You could use perl

save this as dayadd.pl:
Code:
#! /usr/bin/env perl
use Time::Local;
use POSIX qw(strftime);

 my ($yy, $mm, $dd) = unpack "A4A2A2", $ARGV[0];
 eval { print strftime("%Y%m%d\n", localtime(timelocal(0,0,0,$dd,$mm - 1,$yy) + $ARGV[1]*24*60*60)) } ;
 exit 1 if $@ ;
 exit 0;

Then you can use it like this:
Code:
$ ./dayadd.pl 20141220 -1 || echo "Invalid date!"
20141219

$ ./dayadd.pl 20132202 -1 || echo "Invalid date"
Invalid date


Last edited by Chubler_XL; 07-04-2017 at 08:22 PM..
This User Gave Thanks to Chubler_XL For This Post:
# 6  
Old 07-05-2017
This is how you do it in Solaris.

Code:
:~$ gdate +%Y%m%d
20170705

:~$ gdate +%Y%m%d -d "-10days"
20170625

here's --help from the util. FYI gdate and date are NOT the same thing.

Code:
 gdate --help
Usage: gdate [OPTION]... [+FORMAT]
  or:  gdate [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
Display the current time in the given FORMAT, or set the system date.

  -d, --date=STRING         display time described by STRING, not 'now'
  -f, --file=DATEFILE       like --date once for each line of DATEFILE
  -I[TIMESPEC], --iso-8601[=TIMESPEC]  output date/time in ISO 8601 format.
                            TIMESPEC='date' for date only (the default),
                            'hours', 'minutes', 'seconds', or 'ns' for date
                            and time to the indicated precision.
  -r, --reference=FILE      display the last modification time of FILE
  -R, --rfc-2822            output date and time in RFC 2822 format.
                            Example: Mon, 07 Aug 2006 12:34:56 -0600
      --rfc-3339=TIMESPEC   output date and time in RFC 3339 format.
                            TIMESPEC='date', 'seconds', or 'ns' for
                            date and time to the indicated precision.
                            Date and time components are separated by
                            a single space: 2006-08-07 12:34:56-06:00
  -s, --set=STRING          set time described by STRING
  -u, --utc, --universal    print or set Coordinated Universal Time
      --help     display this help and exit
      --version  output version information and exit

FORMAT controls the output.  Interpreted sequences are:

  %%   a literal %
  %a   locale's abbreviated weekday name (e.g., Sun)
  %A   locale's full weekday name (e.g., Sunday)
  %b   locale's abbreviated month name (e.g., Jan)
  %B   locale's full month name (e.g., January)
  %c   locale's date and time (e.g., Thu Mar  3 23:05:25 2005)
  %C   century; like %Y, except omit last two digits (e.g., 20)
  %d   day of month (e.g., 01)
  %D   date; same as %m/%d/%y
  %e   day of month, space padded; same as %_d
  %F   full date; same as %Y-%m-%d
  %g   last two digits of year of ISO week number (see %G)
  %G   year of ISO week number (see %V); normally useful only with %V
  %h   same as %b
  %H   hour (00..23)
  %I   hour (01..12)
  %j   day of year (001..366)
  %k   hour, space padded ( 0..23); same as %_H
  %l   hour, space padded ( 1..12); same as %_I
  %m   month (01..12)
  %M   minute (00..59)
  %n   a newline
  %N   nanoseconds (000000000..999999999)
  %p   locale's equivalent of either AM or PM; blank if not known
  %P   like %p, but lower case
  %r   locale's 12-hour clock time (e.g., 11:11:04 PM)
  %R   24-hour hour and minute; same as %H:%M
  %s   seconds since 1970-01-01 00:00:00 UTC
  %S   second (00..60)
  %t   a tab
  %T   time; same as %H:%M:%S
  %u   day of week (1..7); 1 is Monday
  %U   week number of year, with Sunday as first day of week (00..53)
  %V   ISO week number, with Monday as first day of week (01..53)
  %w   day of week (0..6); 0 is Sunday
  %W   week number of year, with Monday as first day of week (00..53)
  %x   locale's date representation (e.g., 12/31/99)
  %X   locale's time representation (e.g., 23:13:48)
  %y   last two digits of year (00..99)
  %Y   year
  %z   +hhmm numeric time zone (e.g., -0400)
  %:z  +hh:mm numeric time zone (e.g., -04:00)
  %::z  +hh:mm:ss numeric time zone (e.g., -04:00:00)
  %:::z  numeric time zone with : to necessary precision (e.g., -04, +05:30)
  %Z   alphabetic time zone abbreviation (e.g., EDT)

By default, date pads numeric fields with zeroes.
The following optional flags may follow '%':

  -  (hyphen) do not pad the field
  _  (underscore) pad with spaces
  0  (zero) pad with zeros
  ^  use upper case if possible
  #  use opposite case if possible

After any flags comes an optional field width, as a decimal number;
then an optional modifier, which is either
E to use the locale's alternate representations if available, or
O to use the locale's alternate numeric symbols if available.

Examples:
Convert seconds since the epoch (1970-01-01 UTC) to a date
  $ date --date='@2147483647'

Show the time on the west coast of the US (use tzselect(1) to find TZ)
  $ TZ='America/Los_Angeles' date

Show the local time for 9AM next Friday on the west coast of the US
  $ date --date='TZ="America/Los_Angeles" 09:00 next Fri'

Report gdate bugs to bug-coreutils@gnu.org
GNU coreutils home page: <http://www.gnu.org/software/coreutils/>
General help using GNU software: <http://www.gnu.org/gethelp/>
Report gdate translation bugs to <http://translationproject.org/team/>
For complete documentation, run: info coreutils 'gdate invocation'

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Replace date in file every day with current date

I Have text like XXX_20190908.csv.gz need to replace Only date in this format with current date every day Thanks! (1 Reply)
Discussion started by: yamasani1991
1 Replies

2. Shell Programming and Scripting

Date minus 1 day

Hi the below code is failing i am trying to generate do the following: 2014-10-22 11:26:00 (Substract 24 hrs) should produce 2014-10-21 11:26:00 I need the same formatting below because that gets inputted into code for an... (4 Replies)
Discussion started by: Samuel12
4 Replies

3. Homework & Coursework Questions

How to minus 2 month from current date?

I am running a script in ksh to get the 2 months back date from system date.The below code is giving correct date output from putty command prompt.But while running the script is .ksh file it is giving the error below.Please suggest. ; d=a; y=a m-=num while(m < 1) {m+=12; y--}... (1 Reply)
Discussion started by: hini
1 Replies

4. HP-UX

Actual date minus six months (HP UX)

Hi there, is it possible to get the actual date minux six months with just a simple command? It's easy with Linux but on HP Unix (for me) impossible ;) Best wishes (3 Replies)
Discussion started by: System
3 Replies

5. AIX

Need to get the next day's date of the user entered date

I need to get the next day's date of the user entered date for example: Enter date (yyyy/mm/yy): 2013/10/08I need to get the next day's date of the user entered date Desired Output: 2013/10/09Though there are ways to achieve this is Linux or Unix environment (date command) ,I need to... (1 Reply)
Discussion started by: rpm120
1 Replies

6. Shell Programming and Scripting

finding the previous day date and creating a file with date

Hi guys, I had a scenario... 1. I had to get the previous days date in yyyymmdd format 2. i had to create a file with Date inthe format yyyymmdd.txt format both are different thanks guys in advance.. (4 Replies)
Discussion started by: apple2685
4 Replies

7. UNIX and Linux Applications

sqlite: calculating with dates - compare current date minus 6 months with stored record

Hi I have a table with name, date in format DD.MM.YYYY. I need to something like this (I try to explain in pseudo code) if SYSDATE (current date) minus 6 months > $expiry date print OK else print NOK with $name and $expiry date I know this is possible with Oracle. How to do this... (0 Replies)
Discussion started by: slashdotweenie
0 Replies

8. Shell Programming and Scripting

how to obtain date and day of the week from `date` command

Hi, does anybody know how to format `date` command correctly to return the day of the week? Thanks -A I work in ksh.... (1 Reply)
Discussion started by: aoussenko
1 Replies

9. UNIX for Dummies Questions & Answers

print previous month (current month minus 1) with Solaris date and ksh

Hi folks month=`date +%m`gives current month Howto print previous month (current month minus 1) with Solaris date and ksh (7 Replies)
Discussion started by: slashdotweenie
7 Replies

10. Shell Programming and Scripting

Script to find previous month last day minus one day timestamp

Hi All, I need to find the previous month last day minus one day, using shell script. Can you guys help me to do this. My Requirment is as below: Input for me will be 2000909(YYYYMM) I need the previous months last day minus 1 day timestamp. That is i need 2000908 months last day minus ... (3 Replies)
Discussion started by: girish.raos
3 Replies
Login or Register to Ask a Question