代码之家  ›  专栏  ›  技术社区  ›  Guss

bash中的日历计算

  •  3
  • Guss  · 技术社区  · 15 年前

    我想在bash中执行一些日历操作—具体来说,我想知道给定月份的最后一个日期(包括闰年,准备查找表对我来说不是一个有效的解决方案)。

    假设我有以下代码:

    $year=2009
    $start_month=2
    $end_month=10
    for $month in $(seq $start_month $end_month); do
      echo "Last date of "$(date +"%B" -d "${year}-${month}-01")" is: " ???
    done
    

    我不知道怎么做这种事。我虽然 date -d 会像posix mktime一样工作,并将无效日期折叠到它们的有效等价物中,所以我可以这样说 date -d "2009-03-00" 得到“2009-02-28”,但没有这样的运气。

    在标准的GNU环境中,是否只使用bash上可用的工具来完成它?

    4 回复  |  直到 15 年前
        1
  •  6
  •   Steve Baker    15 年前

    尝试: date -d 'yesterday 2009-03-01'

    直觉我知道。早期版本的日期用于按POSIX方式工作。

        2
  •  5
  •   lhunath    15 年前

    日期(1)的-d是GNU特定的;因此使用它只在GNU Linux上有效。

    更便携的解决方案 sh 阿法克),这是:

    : $(cal 4 2009); echo $_
    
        3
  •  3
  •   MarkusQ    15 年前

    如果你不介意玩grep/awk/perl,你可以看看 cal .

    $ cal 4 2009
         April 2009
    Su Mo Tu We Th Fr Sa 
              1  2  3  4
     5  6  7  8  9 10 11
    12 13 14 15 16 17 18
    19 20 21 22 23 24 25
    26 27 28 29 30
    

    编辑(markusq):为了弥补我下面的笑话解决方案,我将为您的:

    cal 4 2009 | tr ' ' '\n' | grep -v ^$ | tail -n 1
    
        4
  •  1
  •   MarkusQ    15 年前

    好吧,一种方法是在一个循环中观察当前日期,直到月份组件发生变化,将日组件保存一轮。这会给你一个月的第一天和最后一天,但可能太慢了。

    2009年4月1日发布