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

如何将yyyymmddhhmms转换为“date”可读的日期`

  •  2
  • User1  · 技术社区  · 14 年前

    我有一组YYYYMMDDHHMMSS格式的日期/时间字符串,希望将其转换为 date 公用事业。通常,我可以这样做:

    date -d "2010-10-01 12:34:56"

    然而, 日期 不喜欢yyyymmddhhmms:

    date -d "20100101123456" …无效日期

    所以,我可能需要将字符串优化为先前的格式。我在想 sed 是答案,但很快就变丑了。我很确定我的字符串将是正确的格式,那么如何轻松地转换它们呢?

    6 回复  |  直到 14 年前
        1
  •  8
  •   chris    14 年前

    日期不允许“YYYYMMDDHHMMSS”,但它允许“YYYYMMDD HH:MM:SS”,因此:

    D="20100101123456"
    date -d "${D:0:8} ${D:8:2}:${D:10:2}:${D:12:2}"
    
        2
  •  4
  •   Cascabel    14 年前

    如果格式是完全固定的,可以在bash中执行,切掉字符串:

    d=20100101123456
    pretty_date="${d:0:4}-${d:4:2}-${d:6:2} ${d:8:2}:${d:10:2}:${d:12:2}"
    # 2010-01-01 12:34:56
    ...
    

    我不想费心尝试使用regex-就像你说的,模式很快变得丑陋。大量重复 ([0-9]{4}) ,即使使用扩展或perl正则表达式。或者你可以灵活匹配 . ;无验证。

        3
  •  2
  •   Dennis Williamson    14 年前

    试试这个:

    echo "20101106213245" | sed -r 's/^.{8}/& /;:a; s/([ :])(..)\B/\1\2:/;ta'
    

    结果:

    20101106 21:32:45
    
    • 在第八个字符后插入空格
    • [标签a]在空格或冒号和后面两个字符后添加冒号
    • 如果更换了,转到标签a

    你还要连字符吗?

    echo "20101106213245" | sed -r 's/^.{4}/&-/;:a; s/([-:])(..)\B/\1\2:/;ta;s/:/-/;s/:/ /'
    

    结果:

    2010-11-06 21:32:45
    
    • 在第四个字符后插入连字符
    • [标签a]在连字符或冒号以及后面两个字符后,添加冒号
    • 如果更换了,转到标签a
    • 将第一个冒号改为连字符( 2010-11:06:21:32:45 -> 2010-11-06:21:32:45 )
    • 将下一个冒号改为空格( 2010年11月6日21:32:45 -> 2010-11-06 21:32:45 )
        4
  •  1
  •   uzi    14 年前

    所有这些正则表达式的答案是什么?日期(1)工具可以使用strftime()样式的日期格式。。。将一种日期类型转换为另一种日期类型的示例:

    $ date -j -f "%Y%m%d%H%M%S" "20100101123456" "+%Y-%m-%d %H:%M:%S"
    2010-01-01 12:34:56
    

    所以如果它不是你想要的格式,就这样转换然后使用它。如果您只想设置它,只需执行以下操作:

    $ date -f "%Y%m%d%H%M%S" "20100101123456"
    
        5
  •  0
  •   Ulrich Schwarz    14 年前
     sed -ne 's/\(....\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1-\2-\3 \4:\5:\6/p'
    

    我承认这是一口。虽然我不记得sed是否支持后者,但所有的's最好应该是[0-9]或\d。

        6
  •  0
  •   sorontar    8 年前

    busybox date或bsd date接受输入格式的描述。

    Busybox是一个GNU小型实用程序,易于安装。

    bsd格式已在另一个答案中介绍,因此这里是busybox:

    $ busybox date -D "%Y%m%d%H%M%S" -d "20100101123456" +'%Y-%m-%d %H:%M:%S'
    2010-01-01 12:34:56