【问题标题】:Get Yesterday's date in solaris在 solaris 中获取昨天的日期
【发布时间】:2012-08-07 22:26:04
【问题描述】:

我正在运行 SunOS。

bash-3.00$ uname -a
SunOS lvsaishdc3in0001 5.10 Generic_142901-02 i86pc i386 i86pc

我需要找到Yesterday's date in linux,并使用从命令提示符传递的正确格式。当我在我的 shell 提示符下这样尝试时-

bash-3.00$ date --date='yesterday' '+%Y%m%d'
date: illegal option -- date=yesterday
usage:  date [-u] mmddHHMM[[cc]yy][.SS]
        date [-u] [+format]
        date -a [-]sss[.fff]

我总是得到日期illegal option,为什么会这样? 我做错了什么吗?

更新:-

bash-3.00$ date --version
date: illegal option -- version
usage:  date [-u] mmddHHMM[[cc]yy][.SS]
        date [-u] [+format]
        date -a [-]sss[.fff]

【问题讨论】:

  • 在 linux 下对我来说很好用
  • 这对我不起作用。您是否需要我提供任何信息,例如为什么它不起作用?
  • date --version 说什么? (在您的问题中发布结果,而不是在评论中,因为格式会被破坏)
  • @Jon,我用你的命令输出更新了这个问题。
  • 您没有使用 GNU date,因此您无法访问人们谈论的所有花哨的选项。您可以为 Solaris安装 GNU date,或者您可以编写一个小的 Perl/Python/etc 脚本来做同样的事情。

标签: linux shell unix date sunos


【解决方案1】:

试试下面这个。它应该工作

YESTERDAY=`TZ=GMT+24 date +%Y%m%d`; echo $YESTERDAY

【讨论】:

  • 如果您在午夜 (-1h,+1h) 左右运行此批处理,则使用此解决方案可能会遇到问题。这取决于 TZ,因此请确保设置您当前的 TZ,即 CET 或 GMT+1 等。
【解决方案2】:

试试这个:

DATE_STAMP=`TZ=GMT+24 date +%Y%m%d`

其中 GMT 是时区,您可能需要根据与 GMT 的小时差来更改 24。或者您可以将 GMT 更改为您更舒适的时区,例如科技部

【讨论】:

    【解决方案3】:

    按照 larsks 的建议,您可以使用 perl:

    perl -e 'use POSIX qw(strftime); print strftime "%a %b %e %H:%M:%S %Y",localtime(time()- 3600*24);'
    

    稍作修改

    http://blog.rootshell.be/2006/05/04/solaris-yesterday-date/

    要获取 YYYYMMDD 格式,请使用此

    perl -e 'use POSIX qw(strftime); print strftime "%Y%m%d",localtime(time()- 3600*24);'
    

    此链接说明如何使用 strftime 格式化日期和时间

    http://perltraining.com.au/tips/2009-02-26.html

    【讨论】:

    • 我怎样才能从那个 perl 脚本中只得到YearMonthDay?喜欢 20120706
    • 我在上面编辑了我的答案,以包含您要求的 YearMonthDay 格式。
    【解决方案4】:

    纯 bash 解决方案

    #!/bin/bash                                                                                                                                                              
    
    # get and split date                                                                                                                                                     
    today=`date +%Y%m%d`
    year=${today:0:4}
    month=${today:4:2}
    day=${today:6:2}
    
    # avoid octal mismatch                                                                                                                                                   
    if (( ${day:0:1} == 0 )); then day=${day:1:1}; fi
    if (( ${month:0:1} == 0 )); then month=${month:1:1}; fi
    
    # calc                                                                                                                                                                   
    day=$((day-1))
    if ((day==0)); then
        month=$((month-1))
        if ((month==0)); then
            year=$((year-1))
            month=12
        fi
        last_day_of_month=$((((62648012>>month*2&3)+28)+(month==2 && y%4==0)))
        day=$last_day_of_month
    fi
    
    # format result                                                                                                                                                          
    if ((day<10)); then day="0"$day; fi
    if ((month<10)); then month="0"$month; fi
    yesterday="$year$month$day"
    echo $yesterday
    

    【讨论】:

    • 所有的日期计算让我觉得是在重新发明轮子。为什么不使用内置的工具?
    • day = last_day_of_month语句中有多余的空格;修复它,我会给你一个 +1,特别是否则你的解决方案是唯一一个在任何时区都能给出正确回复的解决方案。
    • @Jens,可能有一个内置解决方案的工具,但随后建议将其作为回复。所有(当前)剩余的回复或多或少经常给出错误的日期。如果您想要一个完美的圆形但找不到,则可能需要重新发明轮子。顺便说一句,公认的答案是一个相当方形的轮子......
    【解决方案5】:

    TZ=$TZ+24 date +'%Y/%m/%d' 在 SunOS 中。

    【讨论】:

    • 这是独一无二的完美解决方案。只要正确设置了 TZ 变量,它就可以从 TZ 工作。谢谢
    【解决方案6】:

    在非 GMT 环境下玩 Solaris10,我得到了这个:

    # date 
    Fri Jul 26 13:09:38 CEST 2013 (OK)
    
    # (TZ=CEST+24 date)
    Thu Jul 25 11:09:38 CEST 2013 (ERR)
    
    # (TZ=GMT+24 date)
    Thu Jul 25 11:09:38 GMT 2013  (OK)
    
    # (TZ=CEST+$((24-$((`date "+%H"`-`date -u "+%H"`)))) date)
    Thu Jul 25 13:09:38 CEST 2013  (OK)
    

    如您所见,我有并且我想获得 CEST ,但 TZ=CEST+24 给了我错误的 CEST 数据; GMT+24 给了我正确的数据,但无法使用。

    为了得到正确的结果,我必须使用 GMT+22(错误的命令,正确的结果)或 CEST+22(错误的值,但最终正确的结果是正确的 TZ)

    【讨论】:

      【解决方案7】:

      @olivecoder 给出的纯 bash 解决方案与任何其他解决方案相比都非常可靠,但有一个错误需要纠正。当这一天落在该月的 1 日时,脚本失败,日期显示为“last_day_of_month”。 @olivecoder 错过了 $ day=last_day_of_month,应该是

      day=$last_day_of_month;
      

      修正后效果很好。

      使用 Timezone -24 在使用时会遇到一些基于时间的问题。在某些情况下,它会持续到前天。所以我认为它不可靠。

      【讨论】:

      • 我按照建议修复了我的解决方案。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多