我已经开始学习perl而且我遇到了一些问题。可能存在不同格式的日期变化的输入。我必须按时间顺序排列这些日期 我计划的是以单一日期格式转换每个日期,并将其作为日期以通用格式(作为键)存储在哈希中,并将日期存储在给定格式的原始日期(作为值)。现在对该哈希进行排序,并在输出中使用原始格式(哈希值)打印日期。
但是怎么做呢?我找到了一种方法,用另一种格式转换日期,如下所示。use Time::Piece;
my $dt = Time::Piece->strptime('Sep 12 00:00:00 2012', '%b %e %T %Y');
print $dt->strftime('%d-%m-%Y');
但在这种情况下,我必须知道输入日期的格式是什么。在执行时我不知道,因为它取决于用户。那么是否有任何方法可以比较和确定这个日期的格式?
#This is my input file
#only four formats will be there in input dates. (MM/DD/YY,
#DD-MM-YYYY, MMM-DD-YY or DD-MMM-YYYY)
10/01/92
18-07-1984
Oct-20-17
04-Jan-2004
#This is what I want in output
18-07-1984
10/01/92
04-Jan-2004
Oct-20-17
答案 0 :(得分:3)
class MonateAboCategory extends groovy.time.TimeCategory {
static int getMonateAbo(Integer val) ...
}
use(MonateAboCategory) {
println new Date() + 3.months
println new Date() - 1.monateAbo
}
将为Time::Piece->strptime()
提供一个无法使用给定格式解析的日期字符串。但我们可以使用die()
来解决这个问题:
eval
在此代码中,我们逐步完成格式列表,直到找到一个不#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use Time::Piece;
my @dates = qw[
10/01/92
18-07-1984
Oct-20-17
04-Jan-2004
];
my @fmts = qw[
%m/%d/%y
%d-%m-%Y
%b-%d-%y
%d-%b-%Y
];
foreach (@dates) {
my $tp;
for my $fmt (@fmts) {
eval { $tp = Time::Piece->strptime($_, $fmt) };
last unless $@;
}
say $tp;
}
的格式。
这会给你一个Time :: Piece对象的日期,你可以存储在某个地方。对这些对象进行排序留给读者练习: - )
注意:您需要确定您的用户只会使用这四种格式的日期。一般来说,这个问题是不可解决的,因为你可能有人输入07/09/2000到2000年9月7日(dd / mm日期比美国以外的mm / dd更常见)。