在unixshell中,如何获取昨天&x27;将日期转换为变量?
我有一个shell脚本,它执行以下操作,将当前日期存储在变量“dt”中:在unixshell中,如何获取昨天&x27;将日期转换为变量?,unix,datetime,shell,ksh,hp-ux,Unix,Datetime,Shell,Ksh,Hp Ux,我有一个shell脚本,它执行以下操作,将当前日期存储在变量“dt”中: date "+%a %d/%m/%Y" | read dt echo ${dt} 我怎样才能把昨天的日期变成一个变量呢 基本上,我试图实现的是使用grep从日志文件中提取昨天的所有行,因为日志中的每一行都包含“Mon 01/02/2010”格式的日期 非常感谢您至少有两种选择 使用perl: perl -e '@T=localtime(time-86400);printf("%02d/%02d/%02d",$T[4]+1
date "+%a %d/%m/%Y" | read dt
echo ${dt}
我怎样才能把昨天的日期变成一个变量呢
基本上,我试图实现的是使用grep从日志文件中提取昨天的所有行,因为日志中的每一行都包含“Mon 01/02/2010”格式的日期
非常感谢您至少有两种选择
perl -e '@T=localtime(time-86400);printf("%02d/%02d/%02d",$T[4]+1,$T[3],$T[5]+1900)'
sh_utils
包中)
date
如果您在Mac或BSD或其他没有--date选项的设备上,您可以使用:
date -r `expr \`date +%s\` - 86400` '+%a %d/%m/%Y'
pax> date
Thu Aug 18 19:29:49 XYZ 2010
pax> dt=$(perl -e 'use POSIX;print strftime "%d/%m/%Y%",localtime time-86400;')
pax> echo $dt
17/08/2010
更新:或者
date -r $((`date +%s` - 86400)) '+%a %d/%m/%Y'
如果您有可用的Perl(并且您的
日期
没有像昨天
这样的好功能),您可以使用:
date -r `expr \`date +%s\` - 86400` '+%a %d/%m/%Y'
pax> date
Thu Aug 18 19:29:49 XYZ 2010
pax> dt=$(perl -e 'use POSIX;print strftime "%d/%m/%Y%",localtime time-86400;')
pax> echo $dt
17/08/2010
谢谢大家的帮助,但由于我使用的是HP-UX(毕竟,您支付的费用越多,获得的功能就越少……),我不得不求助于perl:
perl -e '@T=localtime(time-86400);printf("%02d/%02d/%04d",$T[3],$T[4]+1,$T[5]+1900)' | read dt
在Linux上,您可以使用
date -d "-1 days" +"%a %d/%m/%Y"
如果您的HP-UX安装中安装了Tcl,您可能会发现它的日期算法非常可读(不幸的是,Tcl shell没有像perl那样的好的“-e”选项):
这将解决所有夏令时的麻烦。如果您没有支持--date的版本,并且您不想使用perl,那么可以使用我的这个方便的ksh脚本。默认情况下,它返回昨天的日期,但您可以输入一个数字,它会告诉您过去许多天的日期。如果你把目光投向遥远的过去,它会开始慢下来一点。10万天前是1738年1月30日,但我的系统花了28秒才找到答案
#! /bin/ksh -p
t=`date +%j`
ago=$1
ago=${ago:=1} # in days
y=`date +%Y`
function build_year {
set -A j X $( for m in 01 02 03 04 05 06 07 08 09 10 11 12
{
cal $m $y | sed -e '1,2d' -e 's/^/ /' -e "s/ \([0-9]\)/ $m\/\1/g"
} )
yeardays=$(( ${#j[*]} - 1 ))
}
build_year
until [ $ago -lt $t ]
do
(( y=y-1 ))
build_year
(( ago = ago - t ))
t=$yeardays
done
print ${j[$(( t - ago ))]}/$y
下面是一个ksh脚本,用于计算第一个参数的上一个日期,在Solaris 10上测试
#!/bin/ksh
sep=""
today=$(date '+%Y%m%d')
today=${1:-today}
ty=`echo $today|cut -b1-4` # today year
tm=`echo $today|cut -b5-6` # today month
td=`echo $today|cut -b7-8` # today day
yy=0 # yesterday year
ym=0 # yesterday month
yd=0 # yesterday day
if [ td -gt 1 ];
then
# today is not first of month
let yy=ty # same year
let ym=tm # same month
let yd=td-1 # previous day
else
# today is first of month
if [ tm -gt 1 ];
then
# today is not first of year
let yy=ty # same year
let ym=tm-1 # previous month
if [ ym -eq 1 -o ym -eq 3 -o ym -eq 5 -o ym -eq 7 -o ym -eq 8 -o ym - eq 10 -o ym -eq 12 ];
then
let yd=31
fi
if [ ym -eq 4 -o ym -eq 6 -o ym -eq 9 -o ym -eq 11 ];
then
let yd=30
fi
if [ ym -eq 2 ];
then
# shit... :)
if [ ty%4 -eq 0 ];
then
if [ ty%100 -eq 0 ];
then
if [ ty%400 -eq 0 ];
then
#echo divisible by 4, by 100, by 400
leap=1
else
#echo divisible by 4, by 100, not by 400
leap=0
fi
else
#echo divisible by 4, not by 100
leap=1
fi
else
#echo not divisible by 4
leap=0 # not divisible by four
fi
let yd=28+leap
fi
else
# today is first of year
# yesterday was 31-12-yy
let yy=ty-1 # previous year
let ym=12
let yd=31
fi
fi
printf "%4d${sep}%02d${sep}%02d\n" $yy $ym $yd
测验
ksh93:
或:
第一个在同一进程中运行,第二个在子shell中运行。对于Hp UX,仅以下命令适用于我:
#!/bin/bash
yesterday=`TZ=EST+24 date +%Y%m%d` # Yesterday is a variable
mkdir $yesterday # creates a directory with YYYYMMDD format
TZ=aaa24日期+%Y%m%d
您可以将其用作:
ydate=`TZ=aaa24日期+%Y%m%d`
echo$ydate尝试以下方法:
dt=`case "$OSTYPE" in darwin*) date -v-1d "+%s"; ;; *) date -d "1 days ago" "+%s"; esac`
echo $dt
它可以在Linux和OSX上工作。我在Linux中有shell脚本,下面的代码对我有用:
#!/bin/bash
yesterday=`TZ=EST+24 date +%Y%m%d` # Yesterday is a variable
mkdir $yesterday # creates a directory with YYYYMMDD format
如果您有权访问
python
,这是一个帮助程序,它将获取任意n
天前的yyyy-mm-dd
日期值:
function get_n_days_ago {
local days=$1
python -c "import datetime; print (datetime.date.today() - datetime.timedelta(${days})).isoformat()"
}
# today is 2014-08-24
$ get_n_days_ago 1
2014-08-23
$ get_n_days_ago 2
2014-08-22
将在AIX中获取昨天,并将TZ变量设置回原始值。您可以使用GNU date命令,如下所示 过去的约会 要获取过去的昨天和更早的一天,请使用字符串day ago: date--date='昨天' 日期--date='1天前' 日期--date='10天前' 日期--date='10周前' 日期--date='10个月前' 日期--date='10年前' 未来的约会 要获取明天和后天(明天+N),请使用day word获取未来的日期,如下所示: date--date='明天' 日期--date='1天' 日期--date='10天' 日期--date='10周' 日期--date='10个月'
date--date='10年'虽然所有答案都很好,但不幸的是,没有一个对我有用。所以我不得不写一些老派的东西。(我使用的是最简单的Linux操作系统) 您可以将其与日期的常规格式相结合。例如
$ date -d @$( echo $(( $(date +%s)-$((60*60*24)) )) ) +%Y-%m-%d
说明:
以epoc秒(选项-d)为单位输入日期,从中减去一天的等效秒数。这将使日期精确地返回一天。Perl是一个选项,如果必要的话……使用
$()
而不是`
会比较方便。ksh有$()
?+1,只是因为没有假设每个UNIX问题都在Linux上。我们中的一些人还必须使用其他样式。@paxdiablo:同意,但如果没有给出具体信息,我个人认为GNU工具包是一种选择;)HP-UX
、AIX
、Solaris
和*BSD
之间的差异很难猜出味道。在奇怪的情况下,这会失败吗?比如有闰秒吗?@Alok:POSIX/Unix不跟踪闰秒(所有天数都是86400秒),但DST有一个极端情况(请参阅我对@Chris:I的评论,我认为它不会是GNU兼容的date
,但由于您没有指定Unix变体,我只是猜测;)使用HP-UX
时,您的选项有点有限,date
没有这些选项,因此Perl
可能是最好的选择。这并不重要,但如果您打算%100
结果:-)@paxdiablo:fair point,您不需要将1900
添加到年份中,Perl显然不是我的强项之一;)我会用+1来代替你的答案。需要注意的是,unix“-d Dayed”版本的简短语法可能不支持-Dayed标志。@Chris:注意,这给出了24小时前的日期,与昨天的日期有细微的不同。如果您的区域设置有夏令时,这将在冬季的第一天23:00之后给出错误的日期。@Gilles,这一点不错,因为我使用的是locattime。如果你担心它,你可以检查这个小时是否大于下午6点,只需减去6小时。这很有希望能解决问题。吉尔斯说得好。我想念我的C#:DateTime.Now.AddDays(-1)brew安装coreutils
将gnu日期安装为gdate。在macOS和Linux上工作。@clarkw:好建议,我将把它添加到答案中。这是所有答案中最好的一个,简短、甜美、简单、方便、酷,它证明了“给一个人一条鱼,他吃一天,但教他钓鱼,他吃一辈子”的故事
#!/bin/bash
yesterday=`TZ=EST+24 date +%Y%m%d` # Yesterday is a variable
mkdir $yesterday # creates a directory with YYYYMMDD format
function get_n_days_ago {
local days=$1
python -c "import datetime; print (datetime.date.today() - datetime.timedelta(${days})).isoformat()"
}
# today is 2014-08-24
$ get_n_days_ago 1
2014-08-23
$ get_n_days_ago 2
2014-08-22
$var=$TZ;
TZ=$TZ+24;
date;
TZ=$var;
$ date -d @$( echo $(( $(date +%s)-$((60*60*24)) )) )
$ date -d @$( echo $(( $(date +%s)-$((60*60*24)) )) ) +%Y-%m-%d