我正在尝试编写bash脚本,以在给定的一天合并24个文件。在夏令时期间,需求发生了变化,我可以得到23或25个文件。
因此,通过进一步的研究,我意识到日光节约从每年的3月的第二个星期日(23)开始,到11月的第一个星期日(25)结束。
我需要更多输入来获取给定月份的第二个星期日,以检查分别查找3月和11月的23个文件或25个文件。
我们将不胜感激任何提供帮助的信息。
谢谢
下面是示例代码,每天可以查找24个文件-
if [ -z "$1" ];then
now=$(date -d "-1 days" +%Y-%m-%d);
else now=$1;
fi
load_date='load_date='$now
singlePath="$newPath/$load_date"
fileCount=$(hdfs dfs -ls -R $hdfsPath/$load_date/ | grep -E '^-' | wc -l)
path=$hdfsPath/$load_date
if [ $fileCount -eq 24 ]; then
echo "All files are available for "$load_date;
hadoop fs -cat $path/* | hadoop fs -put - $singlePath/messages.txt
else echo $fileCount" files are available for "$load_date"! Please note, few files are being missed";
fi
答案 0 :(得分:3)
我不会硬编码DST过渡的日期。我只想数一下“ 今天今天有几个小时”:
“正常”的一天:
$ diff=$(( $(date -d now +%s) - $(date -d yesterday +%s) ))
$ echo $(( diff / 3600 ))
24
“春天向前”
$ diff=$(( $(date -d "2019-03-10 23:59:59" +%s) - $(date -d "2019-03-09 23:59:59" +%s) ))
$ echo $(( diff / 3600 ))
23
“后退”
$ diff=$(( $(date -d "2019-11-03 23:59:59" +%s) - $(date -d "2019-11-02 23:59:59" +%s) ))
$ echo $(( diff / 3600 ))
25
需要注意的一件事:由于bash仅执行整数算术运算,因此如果差值不是86400而是86399,则得到:
$ echo $((86399 / 3600))
23
因此,最好查询昨天的时间 first ,这是极小但非零的机会,即秒在两个日期调用之间滴答作响:
diff=$(( -$(date -d yesterday +%s) + $(date -d now +%s) ))
在这里,$ diff将为86400或86401(对于非DST过渡日),除以3600将得到24而不是23。