首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >日期值为每月每一天的两次。

日期值为每月每一天的两次。
EN

Stack Overflow用户
提问于 2019-08-15 16:54:41
回答 1查看 52关注 0票数 0

我有一项任务,需要从API中提取数据。我需要指定只收集数据之间的上午7点至晚上9点之间的每一天在给定的一个月。

这将是一个Bash脚本,它将在每个月1日的00:01上使用cron运行。

API只接受时代时期的时间。脚本需要足够的灵活性,这样我就不必在一年中的每一天都编写代码了。

我在这个问题上有问题。我可以得到一个月的第一天,划时代的时间是早上7点,划时代的时间是晚上9点,API将接受这两个划时代的值,并在2次之间查看。

我也可以得到这个月的最后一天,划时代的时间是早上7点,晚上9点。

我不知道的是,从这个月的第一天到最后一天,从早上7点到晚上9点。

代码语言:javascript
复制
START_LAST_MONTH=$(date "+%Y-%m-01" -d "-1 Month");
START_DAY_SEVEN_AM_EPOCH_DATE=$(date +%s -d"$START_LAST_MONTH 7am");
START_DAY_NINE_PM_EPOCH_DATE=$(date +%s -d"$START_LAST_MONTH 9pm");


END_LAST_MONTH=$(date "+%Y-%m-%d" -d "$START_LAST_MONTH +1 month -1 day");
END_DAY_SEVEN_AM_EPOCH_DATE=$(date +%s -d"$END_LAST_MONTH 7am");
END_DAY_NINE_PM_EPOCH_DATE=$(date +%s -d"$END_LAST_MONTH 9pm");

我认为实现这一目标的一种方法是在7点和9点的START_DAY变量上增加86400秒,这样就可以创建新的变量,然后每天向上递增,直到END_DAY 7点和9 am的时间变量被击中。这应该是灵活的,然后每个月,因为在一个月的天数不同。

但这超出了我的bash脚本技巧,我希望学习如何实现这一点,因此任何帮助都会感谢,从另一个角度来看这也是很好的。

更新:

我现在有一个bash脚本

代码语言:javascript
复制
#!/bin/sh -x

START_LAST_MONTH=$(date "+%Y-%m-01" -d "-1 Month");
START_DAY_SEVEN_AM_EPOCH_DATE=$(date +%s -d"$START_LAST_MONTH 7am");
START_DAY_NINE_PM_EPOCH_DATE=$(date +%s -d"$START_LAST_MONTH 9pm");


END_LAST_MONTH=$(date "+%Y-%m-%d" -d "$START_LAST_MONTH +1 month -1 day");
END_DAY_SEVEN_AM_EPOCH_DATE=$(date +%s -d"$END_LAST_MONTH 7am");
END_DAY_NINE_PM_EPOCH_DATE=$(date +%s -d"$END_LAST_MONTH 9pm");

until [ $END_DAY_SEVEN_AM_EPOCH_DATE ]
do
let ADD_ONE_DAY=$START_DAY_SEVEN_AM_EPOCH_DATE+86400
echo $ADD_ONE_DAY
done

但是它根本不回ADD_ONE_DAY变量。在使用-X进行调试时,它可以达到以下目的:直到$END_DAY_SEVEN_AM_EPOCH_DATE不再做任何进一步的事情。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-15 18:23:16

更新后的示例代码的问题是,在循环条件下,您实际上只检查$END_DAY_SEVEN_AM_EPOCH_DATE不为空--这只是在上面设置了两行,因此循环体永远不会执行。

要使示例按预期工作,请尝试以下修改:

代码语言:javascript
复制
#!/bin/sh -x

START_LAST_MONTH=$(date "+%Y-%m-01" -d "-1 Month");
START_DAY_SEVEN_AM_EPOCH_DATE=$(date +%s -d"$START_LAST_MONTH 7am");
START_DAY_NINE_PM_EPOCH_DATE=$(date +%s -d"$START_LAST_MONTH 9pm");


END_LAST_MONTH=$(date "+%Y-%m-%d" -d "$START_LAST_MONTH +1 month -1 day");
END_DAY_SEVEN_AM_EPOCH_DATE=$(date +%s -d"$END_LAST_MONTH 7am");
END_DAY_NINE_PM_EPOCH_DATE=$(date +%s -d"$END_LAST_MONTH 9pm");

ADD_ONE_DAY=$START_DAY_SEVEN_AM_EPOCH_DATE
until [ "$ADD_ONE_DAY" -gt "$END_DAY_SEVEN_AM_EPOCH_DATE" ]
do
let ADD_ONE_DAY=$ADD_ONE_DAY+86400
echo $ADD_ONE_DAY
done
  1. 调整循环条件以测试$ADD_ONE_DAY是否大于$END_DAY_SEVEN_AM_EPOCH_DATE
  2. 用循环前的$ADD_ONE_DAY初始化$START_DAY_SEVEN_AM_EPOCH_DATE
  3. 在循环增量$ADD_ONE_DAY内增加一天(而不是$START_DAY_SEVEN_AM_EPOCH_DATE,其结果总是相同的值,即一个无穷无尽的循环)

使用seq命令循环一个月的所有日子的另一个解决方案可以是:

代码语言:javascript
复制
#!/bin/bash

START_LAST_MONTH=$(date "+%Y-%m-01" -d "-1 Month")
END_LAST_MONTH=$(date "+%Y-%m-%d" -d "$START_LAST_MONTH +1 month -1 day")

CURRENT_YEAR=$(date +%Y -d "-1 Month")
CURRENT_MONTH=$(date +%m -d "-1 Month")
LAST_DAY_OF_MONTH=$(date +%d -d "$END_LAST_MONTH");

for CURRENT_DAY in $(seq -w 1 "$LAST_DAY_OF_MONTH"); do
    CURRENT_DATE="$CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DAY"
    CURRENT_DAY_SEVEN_AM_EPOCH=$(date +%s -d"$CURRENT_DATE 7am")
    CURRENT_DAY_NINE_PM_EPOCH=$(date +%s -d"$CURRENT_DATE 9pm")

    echo "$CURRENT_DAY_SEVEN_AM_EPOCH - $CURRENT_DAY_NINE_PM_EPOCH"
done

在这里,seq -w 1 "$LAST_DAY_OF_MONTH"将生成一个从1到相应月份的最后一天的序列,如果需要的话,-w输出以0为单位的等宽填充的数字,即"01“、"02”、.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57513287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档