【问题标题】:Perl Format datesPerl 格式化日期
【发布时间】:2017-06-05 18:25:14
【问题描述】:
use Date::Calc qw(:all);
use Time::Piece;
use POSIX qw(strftime);
$a1 = '01.01.1963';
($year, $month, $day) = Decode_Date_US($a1);
print "$year $month $day\n";
$formatted = strftime('%m/%d/%Y',$month,$day,$year);
print "$formatted\n";

我正在尝试使用 POSIX(strftime) 以一致的格式格式化日期。我不确定输入格式可能是什么。我正在使用 Decode_Date_US 来提取相关的年月日信息。然后我尝试使用 strftime 以一致的方式格式化日期。我收到以下错误 用法:POSIX::strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1) at test_dates.pl line 60

任何帮助将不胜感激。 “use Time::Piece”最终将用于对日期进行排序。

谢谢

【问题讨论】:

  • 这种格式不太一致。它和你之前的那个一样。只需使用/ 而不是.
  • @simbabque 提出了一个很好的观点。你所做的就是s<\.></>g
  • 这只是一个测试用例。在实际情况下,我不会事先知道格式是什么?我正在传递 3 个参数(月日年)。我在这里错过了什么?
  • 你至少知道日/月/年的顺序吗? (以及年份是 2 位还是 4 位?)因为如果你不这样做,你就会陷入困境 - 10/11/12 本质上是模棱两可的,没有办法解决这个问题。
  • 关于“我在这里缺少什么?”,作为工具指针,参数数量错误。它们的顺序也是错误的。您的使用:strftime(fmt, mon, mday, year) 实际使用:strftime(fmt, sec, min, hour, mday, mon, year)。花两秒钟实际阅读您收到的错误消息!!!

标签: perl date posix strftime


【解决方案1】:

只需使用Time::Piecestrptime

#!/usr/bin/env perl
use strict;
use warnings;

use Time::Piece;

my $date = '01.01.1963';
my $timestamp = Time::Piece->strptime( $date, "%m.%d.%Y" );
print $timestamp -> strftime( "%m/%d/%Y")

但是,如果格式不一致,那么您就输了 - 对于初学者来说,有很多地方可以转换日/月顺序,或者将年份表示为两位数(有时会与月或日发生冲突)。

它本质上是模棱两可的。您最多可以通过抓取数字组并假设它们的顺序一致来应用一些非常粗略的猜测。

例如

my ( $day, $month, $year ) = m/(\d{2}).*(\d{2}).*(\d{4})/; 

$timestamp = Time::Piece -> strptime ( "$year-$month-$day", "%Y-%m-%d" ); 

但是你会被10/11/12 这样的日期绊倒,因为你根本不知道哪个数字是哪个字段。您可以通过evalstrptime 尝试猜测,然后重试不同的格式,直到您得到一个确实 解码为有效的格式。

正如您所指出的 - Decode_Date_US 基本上是这样做的:

use strict;
use warnings;
use Date::Calc qw(:all);
use Time::Piece;
my $a1 = '01.01.1963';
my ($year, $month, $day) = Decode_Date_US($a1);
my $time = Time::Piece -> strptime("$year/$month/$day", "%Y/%m/%d");
print $time->strftime("%Y-%m-%d"),"\n";

还有 - use strict; use warnings; 很好。

还有 - 一个 correct way to write dates。如果您要重新格式化,那么不模棱两可的就是最好的选择。

【讨论】:

  • Decode_Date_US 负责解析任何日期格式。它是 Date::Calc 的一部分
  • 在这种情况下 - 解析它,将其输入 Time::Piece 对象,并使用内置的 strftime 而不是 posix 的。 (编辑答案)
  • 运行上述脚本会导致 Perl 命令行解释器崩溃。
  • @Bappa 不。一定是你正在做的其他事情。
  • 很奇怪。上述脚本在 1970 年 1 月 1 日之前的日期一直崩溃。
【解决方案2】:

我最终使用了 DateTime 模块的 strftime 函数,它可以处理早于 1970 年的日期。 “崩溃”-Perl 命令行解释器已停止工作。如果有帮助,我正在使用 Windows 机器和一个非常罕见的 perl 用户。

这对我有用

use Date::Calc qw(:all);
use DateTime;
$dateformat = "%m/%d/%Y";
($year, $month, $day) = Decode_Date_US($date);
$date = DateTime->new(
                  year=>$year,
                  month=>$month,
                  day=>$day,            
        );
$date = $date->strftime($dateformat);

【讨论】:

  • 很确定这是 Windows 的东西,而不是 Perl 的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 2014-04-10
相关资源
最近更新 更多