如何在perl

时间:2017-10-18 13:23:53

标签: perl date

我已经开始学习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

1 个答案:

答案 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更常见)。