带日期,当指定的日期包含小时/分钟/秒时,如何指定相对日期

伤口

在Bash中,我想计算日期(接收日期)和相对持续时间(保留持续时间)的总和。

例如,让:

reception_date="2017-01-02 12:34:56"
retention_duration="+2 days"

我希望有:

expiration_date="2017-01-04--12-34-56"

请注意,保留期限可以是按日期识别的任何有效相对日期,例如+X weeks+X hours

我对date信息页面的第一次掌握使我date像这样使用

$ date -d '2017-01-02 12:34:56' +'%Y-%m-%d--%H-%M-%S'
2017-01-02--12-34-56
$ date -d '2017-01-02 12:34:56 +1 days' +'%Y-%m-%d--%H-%M-%S'
2017-01-03--12-34-56
$ date -d '2017-01-02 12:34:56 +2 days' +'%Y-%m-%d--%H-%M-%S'
2017-01-03--11-34-56
$ date -d '2017-01-02 12:34:56 +3 days' +'%Y-%m-%d--%H-%M-%S'
2017-01-03--10-34-56
$ date -d '2017-01-02 12:34:56 +4 days' +'%Y-%m-%d--%H-%M-%S'
2017-01-03--09-34-56
$ date -d '2017-01-02 12:34:56 +5 days' +'%Y-%m-%d--%H-%M-%S'
2017-01-03--08-34-56

如您所见,它似乎可以正常使用,+1 days但是对于更高的值,我得到的结果确实很不规则。

以下示例按预期工作,但可读性差得多:

$ date -d '2017-01-02 +1 days 12:34:56' +'%Y-%m-%d--%H-%M-%S'
2017-01-03--12-34-56
$ date -d '2017-01-02 +2 days 12:34:56' +'%Y-%m-%d--%H-%M-%S'
2017-01-04--12-34-56
$ date -d '2017-01-02 +3 days 12:34:56' +'%Y-%m-%d--%H-%M-%S'
2017-01-05--12-34-56
$ date -d '+1 days 2017-01-02 12:34:56' +'%Y-%m-%d--%H-%M-%S'
2017-01-03--12-34-56
$ date -d '+2 days 2017-01-02 12:34:56' +'%Y-%m-%d--%H-%M-%S'
2017-01-04--12-34-56
$ date -d '+3 days 2017-01-02 12:34:56' +'%Y-%m-%d--%H-%M-%S'
2017-01-05--12-34-56

在理想的解决方案中,我希望拥有:

  • 正确的到期日期
  • 可读的相对日期格式(向用户说明如何以及为何计算此到期日期)。

我不想玩秒转换之类的事情,该解决方案的人类可读性是必不可少的。

谢谢 !

更多信息

我在使用日期版本的RedHat:

$ date --version
date (GNU coreutils) 8.4
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by David MacKenzie.
x

修改后的答案

此下游错误报告注释之后,我发现您可以通过添加now以下内容来做到这一点

$ date -d '2017-01-02 12:34:56 +2 days' +'%Y-%m-%d--%H-%M-%S'
2017-01-03--05-34-56      ## Oops
$ date -d '2017-01-02 12:34:56 now +2 days' +'%Y-%m-%d--%H-%M-%S'
2017-01-04--12-34-56      ## Much better

now防止date从解析+2时区规范 以及一个相对的项目两者之间的差异已在docs中进行说明,但在这种情况下解析器显然有些奇怪。我认为从人类的角度来看,“现在”的含义也很奇怪,但可能会更糟!

要查看date正在执行的操作,请将该--debug标志添加到您的date命令中。请参阅下面的完整说明。

原始答案

至少到目前为止(以及从date8.26版开始),您必须将相对时间项放置在时间之后。的问题是,+ 1 hour被解释为相对时间作为一个时区(!!!!)。--debug到标志date是你的朋友。

正确行为的示例(cygwin,datev8.26;添加了我的评论):

$ date --debug -d '+1 hour 2017-01-19 12:34:56'    ## Relative before the time
date: parsed relative part: +1 hour(s)             ## OK
date: parsed date part: (Y-M-D) 2017-01-19
date: parsed time part: 12:34:56
date: input timezone: -05:00 (set from TZ="America/New_York" environment value)  ## Also OK
date: using specified time as starting value: '12:34:56'
date: starting date/time: '(Y-M-D) 2017-01-19 12:34:56 TZ=-05:00'
date: '(Y-M-D) 2017-01-19 12:34:56 TZ=-05:00' = 1484847296 epoch-seconds
date: after time adjustment (+1 hours, +0 minutes, +0 seconds, +0 ns),
date:     new time = 1484850896 epoch-seconds
date: output timezone: -05:00 (set from TZ="America/New_York" environment value)  ## Still OK
date: final: 1484850896.000000000 (epoch-seconds)
date: final: (Y-M-D) 2017-01-19 18:34:56 (UTC0)
date: final: (Y-M-D) 2017-01-19 13:34:56 (output timezone TZ=-05:00)
Thu, Jan 19, 2017  1:34:56 PM                 ## A sensible result

错误行为的示例:

$ date --debug -d '2017-01-19 12:34:56 + 1 hour'    # +1 hour at the _end_
date: parsed date part: (Y-M-D) 2017-01-19
date: parsed time part: 12:34:56 TZ=+01:00    ## TZ=+1 oops!
date: parsed relative part: +1 hour(s)        ## Parsed as a relative part also!
date: input timezone: +01:00 (set from parsed date/time string)    ##Oops
date: using specified time as starting value: '12:34:56'
date: starting date/time: '(Y-M-D) 2017-01-19 12:34:56 TZ=+01:00'  ##Oops
date: '(Y-M-D) 2017-01-19 12:34:56 TZ=+01:00' = 1484825696 epoch-seconds
date: after time adjustment (+1 hours, +0 minutes, +0 seconds, +0 ns),
date:     new time = 1484829296 epoch-seconds
date: output timezone: -05:00 (set from TZ="America/New_York" environment value)  ## That's OK
date: final: 1484829296.000000000 (epoch-seconds)
date: final: (Y-M-D) 2017-01-19 12:34:56 (UTC0)
date: final: (Y-M-D) 2017-01-19 07:34:56 (output timezone TZ=-05:00)
Thu, Jan 19, 2017  7:34:56 AM     ## Bogus!

我猜您处于UTC + 1时区,因此date(1)解释+1 days为UTC + 1:00时区并不会伤害您。编辑已报告此错误gnulib但似乎未对其进行修补,因此您可能只需要使用已经解决的变通办法即可。好消息是,您不必向用户提供相同的字符串date例如,

rel="+2 days"
base="$(date)"
exp="$(date -d "$rel $base")
echo "$base $rel is $exp"

请注意,最后两行交换$base的顺序$rel

当然,另一种选择是将所有内容都切换为UTC,这样您就可以说date --debug -d '2017-01-19 12:34:56 Z + 1 hour'(与Z)来强制将相关部分解释为这样。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Yaml灯具中为RoR单元测试指定相对日期

来自分类Dev

具有指定小时:分钟的Joda日期时间,但晚于现在

来自分类Dev

具有指定小时:分钟的Joda日期时间,但晚于现在

来自分类Dev

在Github中搜索“问题”或“拉取请求”时,可以指定相对于“今天”的日期吗?

来自分类Dev

从日期获得小时,分钟和秒?

来自分类Dev

日期时差获取小时:分钟:秒

来自分类Dev

自日期以来的秒,分钟和小时

来自分类Dev

从日期显示天:小时:分钟:秒

来自分类Dev

自日期以来的秒,分钟和小时

来自分类Dev

如何获得相对于指定日期的下一个小时?

来自分类Dev

Python日期时间提取小时分钟快速

来自分类Dev

Dateutil的相对日期库

来自分类Dev

获取包含日期,小时,秒的特殊日期列

来自分类Dev

使用相对日期(“本周”)时strtotime()的异常行为

来自分类Dev

按小时分组-指定开始的分钟

来自分类Dev

相对于(日期,小时,分钟等)的时间戳偏移

来自分类Dev

如何在Directus中设置相对日期?

来自分类Dev

如何按小时对日期时间进行分组

来自分类Dev

使用bash在YYYYMMDDHHMMSS中增加日期的小时/分钟/秒

来自分类Dev

按日期排序分组,而不考虑小时/分钟/秒

来自分类Dev

向Java SQL日期添加小时,分钟和秒

来自分类Dev

使用bash在YYYYMMDDHHMMSS中增加日期的小时/分钟/秒

来自分类Dev

将结束日期转换为剩余的天,小时,分钟,秒

来自分类Dev

如何在Python中的指定时间段内按日期分组和对日期时间应用聚合函数?

来自分类Dev

从午夜到指定的日期时间多少秒

来自分类Dev

如何在javascript中获取日期选择器值的完整(包括小时,分钟和秒)日期格式

来自分类Dev

我在 Pandas 中使用 datetime 将秒转换为小时和分钟,但它显示的是 1970 年的日期。如何删除日期?

来自分类Dev

如何获取小时,分钟和秒这两个日期之间的时差?

来自分类Dev

如何以天,小时,分钟和秒的形式从两个日期中获取差异

Related 相关文章

  1. 1

    如何在Yaml灯具中为RoR单元测试指定相对日期

  2. 2

    具有指定小时:分钟的Joda日期时间,但晚于现在

  3. 3

    具有指定小时:分钟的Joda日期时间,但晚于现在

  4. 4

    在Github中搜索“问题”或“拉取请求”时,可以指定相对于“今天”的日期吗?

  5. 5

    从日期获得小时,分钟和秒?

  6. 6

    日期时差获取小时:分钟:秒

  7. 7

    自日期以来的秒,分钟和小时

  8. 8

    从日期显示天:小时:分钟:秒

  9. 9

    自日期以来的秒,分钟和小时

  10. 10

    如何获得相对于指定日期的下一个小时?

  11. 11

    Python日期时间提取小时分钟快速

  12. 12

    Dateutil的相对日期库

  13. 13

    获取包含日期,小时,秒的特殊日期列

  14. 14

    使用相对日期(“本周”)时strtotime()的异常行为

  15. 15

    按小时分组-指定开始的分钟

  16. 16

    相对于(日期,小时,分钟等)的时间戳偏移

  17. 17

    如何在Directus中设置相对日期?

  18. 18

    如何按小时对日期时间进行分组

  19. 19

    使用bash在YYYYMMDDHHMMSS中增加日期的小时/分钟/秒

  20. 20

    按日期排序分组,而不考虑小时/分钟/秒

  21. 21

    向Java SQL日期添加小时,分钟和秒

  22. 22

    使用bash在YYYYMMDDHHMMSS中增加日期的小时/分钟/秒

  23. 23

    将结束日期转换为剩余的天,小时,分钟,秒

  24. 24

    如何在Python中的指定时间段内按日期分组和对日期时间应用聚合函数?

  25. 25

    从午夜到指定的日期时间多少秒

  26. 26

    如何在javascript中获取日期选择器值的完整(包括小时,分钟和秒)日期格式

  27. 27

    我在 Pandas 中使用 datetime 将秒转换为小时和分钟,但它显示的是 1970 年的日期。如何删除日期?

  28. 28

    如何获取小时,分钟和秒这两个日期之间的时差?

  29. 29

    如何以天,小时,分钟和秒的形式从两个日期中获取差异

热门标签

归档