【问题标题】:Bash script to increase date range per month用于增加每月日期范围的 Bash 脚本
【发布时间】:2021-02-20 11:11:37
【问题描述】:

我想增加我的工作节点的日期范围,例如

`startdate="2020-01-01T15:04:05Z"`
`endDate="2020-02-01T15:04:05Z`

runWorker(startDate, endDate) {
   // once worker is done

   // increment startDate to 
   `startDate="2020-02-01T15:04:05Z`
   `endDate="2020-03-01T15:04:05Z`
}

如何才能创建一个 bash 脚本来执行此操作,谢谢。

我想创建一个日期范围,供提取日志并保存到存储的工作人员使用,提取完成后,我想将范围增加一个月,以便使用新的数据范围运行工人。

本质上我想要实现的目标

  • 开始日期=2020-01-01T15:04:05Z

  • endDate=2020-02-01T15:04:05Z

  • 运行工人

  • 工人在规定的时间内完成

  • 增加范围以覆盖另一个月份范围

  • 为新范围运行 worker。

【问题讨论】:

  • 可能是date --date='$currentValue next month' +%FT%T%Z 之类的东西?例如。 date --date='2020-02-01T15:04:05Z next month' +%FT%T%Z 给给定日期增加一个月
  • 我不完全理解您的评论@MikhailAntonov。您可以使用“答案”窗格。
  • 老实说,我也没有完全理解这个问题。您想通过运行另一个脚本来替换一个脚本文件中的给定日期吗?或者您只想更新包含日期的变量?如果是后者,使用我建议的参数调用date 程序应该可以解决问题。如果你想要第一件事,应该用更多的魔法把它喂给sed
  • 检查我更新的问题。

标签: bash macos sh


【解决方案1】:

使用 GNU coretutils 的date

$ date --utc -d $startdate"+1 month" "+%FT%TZ"
2020-02-01T15:04:05Z

如果您使用 ISO 时区,您会:

$ TZ=UTC date -d $start"+1 month" "+%FT%T%Z"
2020-02-01T15:04:05UTC

注意Z%Z 的区别。

【讨论】:

  • 我收到了date: illegal option -- -
  • 我使用的是 Mac OS。
  • sh lokilogs.sh usage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
  • 如果您删除--utc 并尝试使用TZ=GMT 处理它?我在这里无法使用 Mac。
【解决方案2】:

在 OSX 下我能想到的是:

#!/bin/bash
startDate="2020-01-01T15:04:05Z"
endDate="2020-02-01T15:04:05Z"

function runWorker() {
    echo "Processing $startDate - $endDate"
    echo "worker does it's stuff here"

    # increment date range
    startDate=$(TZ=UTC date -j -v+1m -f "%Y-%m-%dT%TZ" "$startDate" +%FT%TZ)
    endDate=$(TZ=UTC date -j -v+1m -f "%Y-%m-%dT%TZ" "$endDate" +%FT%TZ)
}

# Repeat a bunch of times to skip one year
for i in `seq 0 14`; do
    runWorker
done

它似乎有你所追求的行为。您应该参考man date 页面,因为我对我的格式字符串不是很自信。以下部分非常重要:

按月调整日期本质上是模棱两可的,因为一个月 是一个可变长度单位,取决于当前日期。这种 日期 以最直观的方式应用调整。首先,日期试图保留月份中的日期。如果是 不可能,因为目标 月份比当前月份短,目标月份的最后一天将是结果。例如,在 May 上使用 -v +1m 31日将调整日期 到 6 月 30 日,而在 1 月 30 日使用相同的选项将导致日期调整为 2 月的最后一天。这 方法也被认为 使 shell 脚本最有意义。不过,请注意,以相同的数量来回 几个月可能会带你去不同的地方—— 输入日期。

我也没有在意时区,希望你自己弄清楚。

PS:我也认为通过在startDate 上加上一个月来计算endDate 会更好,但这也需要一些努力才能正确完成,这样就不会出现跳过的日期范围等问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多