Getting a Date value based on day

Hi,

I have a scenario like this.

I get a file on anyday of the week, so the file name is like this.

FILE_NAME_YYYYMMDD

I want to get the tuesday date before this day.

For example
FILE_NAME_20180413 I should get the date as 20180410
FILE_NAME_20180404 I should get the date as 20180403

Ho could I do that?

Thanks!!

What operating system are you using (including release number)?

What shell are you using (including version number)?

If you have a filename like FILE_NAME_20180410 , what date do you want? 20180410 or 20180403 ?

What have you tried to solve this problem on your own?

Hi,

I am using Korn shell AIX ver 7.1

I tried this , but its giving me an error : date: illegal option -- d

date -d "$d -$(date -d $d +2) days" +"%m-%d-%Y"

If FILE_NAME_20180410 then I would need 20180410 .

Thanks!

If you have python installed, here is an approach:-

import datetime

def previous_weekday(day, weekday):
        days_behind = weekday - day.weekday()
        if days_behind >= 0:
                days_behind -= 7
        return day + datetime.timedelta(days_behind)


files = ['FILE_NAME_20180413','FILE_NAME_20180404','FILE_NAME_20180410']

for file in files:
        day = datetime.date(int(file[10:-4]), int(file[14:-2]), int(file[16:]))

        # 0 - Monday, 1 - Tuesday ...
        if day.weekday() == 1:
                print(file, day.strftime("%Y%m%d"))
        else:
                prev_tuesday = previous_weekday(day, 1)
                print(file, prev_tuesday.strftime("%Y%m%d"))

Produces output:-

('FILE_NAME_20180413', '20180410')
('FILE_NAME_20180404', '20180403')
('FILE_NAME_20180410', '20180410')

I asked what version of shell you're using, but you didn't provide an answer to that question. With a recent Korn shell, such as version 93u+, (which may be installed as ksh93 on AIX 7.1) you could try a simplified version of:

for file in "$@"
do	fd=${file##*_}
	printf 'File: %s: %(%a(%w), %Y-%m-%d)T, Previous Tuesday: %(%Y%m%d\n)T' \
	    "$file" "$fd" "$fd $((($(printf '%(%u)T' "$fd")+5)%7)) days ago"
done

which if invoked with the operands FILE_NAME_20180410 , FILE_NAME_20180413 , and FILE_NAME_20180409 produces the output:

File: FILE_NAME_20180410: Tue(2), 2018-04-10, Previous Tuesday: 20180410
File: FILE_NAME_20180413: Fri(5), 2018-04-13, Previous Tuesday: 20180410
File: FILE_NAME_20180409: Mon(1), 2018-04-09, Previous Tuesday: 20180403
1 Like

What if the date in the file name falls on a Tuesday itself? (e.g. "FILE_NAME_20180417")
I assume, in that case, you want the same date returned, rather than the previous week's Tuesday.

Using Perl's core module Time::Piece, here is a way to do it:

$
$ #
$ echo "FILE_NAME_20180413" |
  perl -lne 'BEGIN {use Time::Piece}
             ($x = $_) =~ s/^.*_//;
             $t = Time::Piece->strptime($x, "%Y%m%d");
             $weekday = $t->wday;
             $delta = 3 - $weekday;
             if ($weekday < 3) { $delta -= 7 };
             $t += 24*60*60*$delta;
             print $t->strftime("%Y%m%d");
            '
20180410
  
$
$

And some more testing is done here.

$
$ # Generate some test data
$ perl -le 'BEGIN {use Time::Piece}
            sub get_prev_tuesday {
                ($x = shift) =~ s/^.*_//;
                $t = Time::Piece->strptime($x, "%Y%m%d");
                $weekday = $t->wday;
                $delta = 3 - $weekday;
                if ($weekday < 3) { $delta -= 7 };
                $t += 24*60*60*$delta;
                return $t->strftime("%Y%m%d");
            }
            # Generate a list of filenames for testing
            $start_date = Time::Piece->strptime("20180401", "%Y%m%d");
            foreach $offset (0..29) {
                $date = $start_date + 24*60*60*$offset;
                $file_name = "FILE_NAME_".$date->strftime("%Y%m%d");
                $val = get_prev_tuesday($file_name);
                print $file_name, " => ", $val;
            }
           '
FILE_NAME_20180401 => 20180327
FILE_NAME_20180402 => 20180327
FILE_NAME_20180403 => 20180403
FILE_NAME_20180404 => 20180403
FILE_NAME_20180405 => 20180403
FILE_NAME_20180406 => 20180403
FILE_NAME_20180407 => 20180403
FILE_NAME_20180408 => 20180403
FILE_NAME_20180409 => 20180403
FILE_NAME_20180410 => 20180410
FILE_NAME_20180411 => 20180410
FILE_NAME_20180412 => 20180410
FILE_NAME_20180413 => 20180410
FILE_NAME_20180414 => 20180410
FILE_NAME_20180415 => 20180410
FILE_NAME_20180416 => 20180410
FILE_NAME_20180417 => 20180417
FILE_NAME_20180418 => 20180417
FILE_NAME_20180419 => 20180417
FILE_NAME_20180420 => 20180417
FILE_NAME_20180421 => 20180417
FILE_NAME_20180422 => 20180417
FILE_NAME_20180423 => 20180417
FILE_NAME_20180424 => 20180424
FILE_NAME_20180425 => 20180424
FILE_NAME_20180426 => 20180424
FILE_NAME_20180427 => 20180424
FILE_NAME_20180428 => 20180424
FILE_NAME_20180429 => 20180424
FILE_NAME_20180430 => 20180424
  
$
$