【问题标题】:How do I convert date formats in Perl without importing external modules?如何在不导入外部模块的情况下在 Perl 中转换日期格式?
【发布时间】:2010-10-24 05:20:22
【问题描述】:

可能是一个简单的答案:如何在不导入外部模块的情况下进行转换?我已阅读 CPAN,但无法明确指出执行以下操作的方法:

Convert: 20080428 to 28-APR-08

有什么想法吗?

即使指导我学习教程也会很感激。

问候, PIAS

【问题讨论】:

  • 外部模块是什么意思? CPAN 代码或系统调用?

标签: perl date format


【解决方案1】:

【讨论】:

    【解决方案2】:
    my %map = ( '01' => 'JAN', '02' => 'FEB', '03' => 'MAR', '04' => 'APR' ); # You can do the rest yourself ;-)
    my $in = '20080428';
    if ( $in =~ m/..(..)(..)(..)/ ) {
        my ( $y, $m, $d ) = ( $1, $2, $3 );
        my $out = sprintf '%02d-%s-%02d', $d, $map{$m}, $y;
    }   
    else {
        die "Illegal date format";
    }   
    

    【讨论】:

    • 那些需要 [0-9] 而不是 \d 除非您启用了字节编译指示(\d 匹配 Perl 5.8 和 5.10 中 [0-9] 以外的内容)。或者,如果您不关心确切的类型,您可以说 /(..)(..)(..)/。
    • 此代码喜欢像 99998877 这样的日期。此外,1900-1999 的日期将被错误地打印。
    • 各位好人(尽管我假设 - 现在仍然是 - 只有有效日期才会形成输入)。我修复了那些 - 简单的方法。 @Chas: \d 会匹配什么不是数字?
    【解决方案3】:

    此代码在 Y10k 中失败,但这应该已经足够了。正则表达式可能更严格,但如果日期已经过验证(或将以新形式验证),则没关系。

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    my @mon = qw/null JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC/;
    
    my $d = "20080428";
    
    $d =~ s/..(..)(..)(..)/$3-$mon[$2]-$1/;
    
    print "date is now $d\n";
    

    或者,如果你疯了,想在正则表达式中验证(需要 Perl 5.10):

    #!/usr/bin/env perl5.10.0
    
    use strict;
    use warnings;
    
    my @mon = qw/null JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC/;
    
    my $d = join '', @ARGV;
    
    # only validates between 1600 and 9999
    # because of calendar weirdness prior to 1600 
    $d =~ s/
        ^
        (?:
            # non-leap years and everything but 29th of Feb in leap years
            (?:
                1[6-9]     (?<y> [0-9]{2}) | 
                [2-9][0-9] (?<y> [0-9]{2})
            )
            (?: #any month 1st through 28th
                (?: (?<m> 0[1-9] | 1[0-2]) (?<d> 0[0-9] | 1[0-9] | 2[0-8]) )
                | #or 30th of any month but 2
                (?: (?<m>0[13-9] | 1[0-2]) (?<d> 30) )
                | # or 31st of 1, 3, 5, 7, 8, 10, or 12
                (?: (?<m>0[13578] | 1[02]) (?<d> 31) )
            )
            | # or 29th of Feb in leap years
            (?:
                (?: #centuries divisible by 4 minus the ones divisible by 100
                    16          |    
                    [2468][048] |
                    [3579][26]
                )
                (?<y> 00)
                | #or non-centuries divisible by 4
                (?: 1[6-9] | [2-9][0-9] )
                (?<y>
                    0[48]       | 
                    [2468][048] |
                    [13579][26]
                )
            )
            (?<m> 02) (?<d> 29)
        )
        $
    /$+{y}-$mon[$+{m}]-$+{d}/x or die "invalid date: $d";
    
    print "date is now $d\n";
    

    【讨论】:

      猜你喜欢
      • 2014-11-14
      • 1970-01-01
      • 2021-09-19
      • 2021-12-23
      • 2011-04-12
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多