【问题标题】:How to compare time format and time stamp?如何比较时间格式和时间戳?
【发布时间】:2014-04-26 09:17:55
【问题描述】:

我有像[%Y-%m-%d %H:%M:%S] 这样的时间格式和像[2009/05/11 07:30:00] 这样的时间戳。我需要的是如何比较这两个值。可能是时间戳与时间格式不同,例如[%Y-%m%d %H:%M]。这是错误的。 有什么想法吗?

【问题讨论】:

    标签: bash datetime comparison


    【解决方案1】:

    如果日期的格式不一定相同,一种简单的方法是将它们转换为 Unix 时间戳:

    $ date --date="2009/05/11 07:30:00" +%s
    1242023400
    $ date --date="2009/05/11 07:30" +%s
    1242023400
    

    这将为您提供一个整数值,您可以使用以下方法轻松进行比较:

    if [ "$(date --date="$my_date" +%s)" -gt "$(date --date="$my_other_date" +%s)" ]
    

    date 了解许多常见的日期格式,而无需先输入。

    【讨论】:

    • 但是 [2009/05/11 07:30:00] 与 [%Y-%m%d %H:%M] 不同。表示返回码为1,不一样等于错误。
    • 使用 GNU coreutils 中的date 8.22 退出代码在两种情况下都是 0,并且它们给出相同的结果。您是否使用其他 date
    • 是的,我知道。但对我来说重要的是时间格式。在我的脚本中,如果不相同,则返回 1。如果相同,则返回 0。示例: if [[ "[%Y-%m-%d %H:%M:%S]" -eq "[2009 /05/11 07:30:00]" ]] && 返回 0 ||返回 1
    【解决方案2】:

    verify知道日期字符串采用特定格式,您可以将日期强制转换为您想要的格式并验证该字符串是否与您开始时的相同:

    $ format='%Y/%m/%d %H:%M:%S'
    $ invalid_date='2009/05/11 07:30'
    $ [ "$(date --date="$invalid_date" +"$format")" = "$invalid_date" ]
    $ echo "$?"
    1
    $ valid_date='2009/05/11 07:30:00'
    $ [ "$(date --date="$valid_date" +"$format")" = "$valid_date" ]
    $ echo "$?"
    0
    

    这仅适用于与date 兼容的日期字符串(您不能直接在date 中指定输入格式)。

    【讨论】:

    • 这是无效的,因为格式是-,并且日期在年、月、日之间有/。修复后就ok了。谢谢@l0b0
    • @user3531485 谢谢,已修复。
    【解决方案3】:

    如果日期格式相同,且该格式为 4 位年份,后接月、日、时、分、秒,但有部分在末尾被截断,则可以填写后缀并进行比较日期作为字符串:

    $ rpad_date() {
        case ${#1} in
            4)
                format='%s/01/01 00:00:00'
                ;;
            7)
                format='%s/01 00:00:00'
                ;;
            10)
                format='%s 00:00:00'
                ;;
            13)
                format='%s:00:00'
                ;;
            16)
                format='%s:00'
                ;;
            19)
                format='%s'
                ;;
            *)
                echo "Unknown format: $1" >&2
                return 1
         esac
         printf "$format" "$1"
    }
    $ rpad_date "2004"
    2004/01/01 00:00:00
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 2011-12-28
      • 2019-07-30
      相关资源
      最近更新 更多