【问题标题】:Convert from one date-time format to a different date-time format从一种日期时间格式转换为另一种日期时间格式
【发布时间】:2019-05-30 15:58:24
【问题描述】:

我想将作为 Perl 脚本参数的时间转换为不同的格式。

输入的格式为yyyyMMddHHmmss(例如20190101235010)。

输出的格式应为yyyy-MM-dd-HH:mm:ss(例如2019-01-01-23:50:10)。

如果解决方案不使用 Perl 模块(POSIX 除外)会更好。

【问题讨论】:

  • 您尝试过自己解决这个问题吗?为什么你不想使用任何模块?你得到的时间是什么时区?您想要的格式是非标准的,但与您似乎通过一堆破折号和冒号输入的格式不同。
  • 20190101235010 不是“unix 格式”。没有这样的东西,人们可能会认为你的意思是 unix 纪元时间(自 1970 年 1 月 1 日开始的秒数,UTC)
  • 据我所知,尽管说了两次,但您并没有尝试转换为 UTC 时间或任何其他时区。您只是想更改日期的格式。

标签: perl unix-timestamp


【解决方案1】:

以下是一些效果很好的替代方案:

my $output =
    sprintf "%s-%s-%s-%s:%s:%s",
       unpack 'a4 a2 a2 a2 a2 a2',
          $input;

my $output = $input =~ s/^(....)(..)(..)(..)(..)(..)\z/$1-$2-$3-$4:$5:$6/sr;

my $output = $input =~ /^(....)(..)(..)(..)(..)(..)\z/s
  ? "$1-$2-$3-$4:$5:$6"
  : die("Bad input\n");

【讨论】:

    【解决方案2】:

    核心模块Time::Piece 很容易做到这一点。

    use strict;
    use warnings;
    use Time::Piece;
    
    # if input is the format you specified:
    my $input = '20190101235010';
    my $time = Time::Piece->strptime($input, '%Y%m%d%H%M%S');
    print $time->strftime('%Y-%m-%d-%H:%M:%S'), "\n";
    
    # if input is a unix epoch timestamp:
    my $input = time;
    my $time = gmtime $input;
    print $time->strftime('%Y-%m-%d-%H:%M:%S'), "\n";
    

    【讨论】:

    • 除非 OP 必须以秒精度处理 641,768 年的日期时间,否则 20190101235010 不是 unix 纪元时间。
    • @ikegami 我希望不是!尽管它可能是 Java/JS 的毫秒级,但这似乎不太可能。我只是提供了一些可能的 OP 意思。
    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多