Получить вчерашнюю дату в Solaris

Я использую SunOS.

bash-3.00$ uname -a
SunOS lvsaishdc3in0001 5.10 Generic_142901-02 i86pc i386 i86pc

Мне нужно найти Yesterday's date in linux с правильным форматированием, переданным из командной строки. Когда я попробовал это в командной строке моей оболочки,

bash-3.00$ date --date='yesterday' '+%Y%m%d'
date: illegal option -- date=yesterday
usage:  date [-u] mmddHHMM[[cc]yy][.SS]
        date [-u] [+format]
        date -a [-]sss[.fff]

Я всегда получаю дату illegal option, почему так? Я что-то не так делаю?

Обновление:-

bash-3.00$ date --version
date: illegal option -- version
usage:  date [-u] mmddHHMM[[cc]yy][.SS]
        date [-u] [+format]
        date -a [-]sss[.fff]

person AKIWEB    schedule 07.08.2012    source источник
comment
У меня отлично работает под линуксом   -  person Jon Lin    schedule 08.08.2012
comment
Это не работает для меня. Вам нужна какая-либо информация от меня, например, почему это не работает?   -  person AKIWEB    schedule 08.08.2012
comment
Что говорит date --version? (опубликуйте результаты в своем вопросе, а не в комментарии, потому что форматирование будет удалено)   -  person Jon Lin    schedule 08.08.2012
comment
@Jon, я обновил вопрос выводом твоей команды.   -  person AKIWEB    schedule 08.08.2012
comment
Вы не используете GNU date, поэтому у вас не будет доступа ко всем причудливым опциям, о которых говорят люди. Вы можете установить GNU date для Solaris или написать небольшой скрипт Perl/Python/etc, который сделает то же самое.   -  person larsks    schedule 08.08.2012
comment
@JonLin Не весь мир работает на Linux. Не весь мир является датой GNU.   -  person Jens    schedule 16.12.2015


Ответы (7)


Попробуйте это ниже. Он должен работать

YESTERDAY=`TZ=GMT+24 date +%Y%m%d`; echo $YESTERDAY
person arsenal    schedule 07.08.2012
comment
Используя это решение, у вас могут возникнуть проблемы, если вы запустите эту партию около (-1 часа, + 1 час) в полночь. Это зависит от TZ, поэтому обязательно настройте текущую TZ, т. е. CET или GMT+1 и т. д. - person Enrico Giurin; 14.04.2016

Попробуйте это:

DATE_STAMP=`TZ=GMT+24 date +%Y%m%d`

где GMT ​​— это часовой пояс, и вам может потребоваться изменить 24 часа в соответствии с разницей в часах с GMT. Либо так, либо вы можете изменить GMT на более удобный для вас часовой пояс, например. КНТ

person George Karanikas    schedule 07.08.2012

Как предложил larsks, вы можете использовать perl:

perl -e 'use POSIX qw(strftime); print strftime "%a %b %e %H:%M:%S %Y",localtime(time()- 3600*24);'

Немного изменен из

http://blog.rootshell.be/2006/05/04/solaris-yesterday-date/

Чтобы получить формат ГГГГММДД, используйте это

perl -e 'use POSIX qw(strftime); print strftime "%Y%m%d",localtime(time()- 3600*24);'

Эта ссылка объясняет, как форматировать дату и время с помощью strftime

http://perltraining.com.au/tips/2009-02-26.html

person amdn    schedule 07.08.2012
comment
Как я могу получить только YearMonthDay из этого Perl-скрипта? как 20120706 - person AKIWEB; 08.08.2012
comment
Я отредактировал свой ответ выше, чтобы включить запрошенный вами формат YearMonthDay. - person amdn; 08.08.2012

Чистый баш-решение

#!/bin/bash                                                                                                                                                              

# get and split date                                                                                                                                                     
today=`date +%Y%m%d`
year=${today:0:4}
month=${today:4:2}
day=${today:6:2}

# avoid octal mismatch                                                                                                                                                   
if (( ${day:0:1} == 0 )); then day=${day:1:1}; fi
if (( ${month:0:1} == 0 )); then month=${month:1:1}; fi

# calc                                                                                                                                                                   
day=$((day-1))
if ((day==0)); then
    month=$((month-1))
    if ((month==0)); then
        year=$((year-1))
        month=12
    fi
    last_day_of_month=$((((62648012>>month*2&3)+28)+(month==2 && y%4==0)))
    day=$last_day_of_month
fi

# format result                                                                                                                                                          
if ((day<10)); then day="0"$day; fi
if ((month<10)); then month="0"$month; fi
yesterday="$year$month$day"
echo $yesterday
person olivecoder    schedule 08.08.2012
comment
Все вычисления дат кажутся мне изобретением велосипеда. Почему бы не использовать встроенный инструмент? - person Jens; 26.07.2013
comment
В операторе day = last_day_of_month есть лишние пробелы; Исправьте это, и я дам вам +1, тем более что в противном случае ваше решение - единственное, которое всегда дает правильный ответ независимо от часового пояса. - person jlliagre; 06.09.2013
comment
@Jens, может быть инструмент со встроенным решением, но затем предложите его в качестве ответа. Все (текущие) оставшиеся ответы более или менее часто дают неправильную дату. Изобретение колеса может быть необходимо, если вы хотите идеально круглое колесо, но не можете его найти. Кстати, принятый ответ - довольно квадратное колесо ... - person jlliagre; 06.09.2013

TZ=$TZ+24 date +'%Y/%m/%d' в SunOS.

person Arun    schedule 16.12.2015
comment
Это уникальное и идеальное решение. Он работает независимо от TZ, если переменная TZ установлена ​​правильно. Спасибо - person Enrico Giurin; 14.04.2016

Играя на Solaris10 в среде, отличной от GMT, я получаю следующее:

# date 
Fri Jul 26 13:09:38 CEST 2013 (OK)

# (TZ=CEST+24 date)
Thu Jul 25 11:09:38 CEST 2013 (ERR)

# (TZ=GMT+24 date)
Thu Jul 25 11:09:38 GMT 2013  (OK)

# (TZ=CEST+$((24-$((`date "+%H"`-`date -u "+%H"`)))) date)
Thu Jul 25 13:09:38 CEST 2013  (OK)

Как видите, у меня есть и я хочу получить CEST, но TZ=CEST+24 дает мне неправильные данные CEST; GMT+24 дает мне правильные данные, но непригодны для использования.

Чтобы получить правильный результат, я должен использовать GMT+22 (неправильная команда, правильный результат) или CEST+22 (неправильное значение, но, наконец, правильный результат для правильного TZ).

person user2622547    schedule 26.07.2013

Чистое решение bash, предоставленное @olivecoder, очень надежно по сравнению с любым другим решением, но есть ошибка, которую нужно исправить. когда день выпадает на 1-е число месяца, скрипт дает сбой с датой, говорящей «last_day_of_month» в значении дня. @olivecoder пропустил $ в day=last_day_of_month, так и должно быть

day=$last_day_of_month;

После этой поправки работает очень хорошо.

При использовании Часовой пояс -24 возникают некоторые проблемы, связанные со временем. в некоторых случаях он идет на позавчера. Так что я думаю, что это не надежно.

person Community    schedule 20.06.2016
comment
Я исправил свое решение, как было предложено. Спасибо! - person olivecoder; 18.07.2016