« ASCII24、RBBTODAY、ImpressのEntryFullText | メイン | [Femo]公開メモ機能追加しました。 »

FormValidator::Simple::Plugin::DateTime::Format

MTのエントリーフォームのようにinput="text"に日付・時間を入力する場合のチェックに。
DateTime::Format::*とDateTime::Format::Strptimeを利用するメソッドの2つ

use FormValidator::Simple qw/DateTime::Format/;
use CGI;

my $q = CGI->new;
$q->param( datetime1 => '2006-04-26T19:09:21+0900' );
$q->param( datetime2 => '2006-04-26 19:09:21' );

my $result = FormValidator::Simple->check( $q => [
    datetime1 => [ [ 'DATETIME_STRPTIME', '%Y-%m-%dT%T%z' ] ],
    datetime2 => [ [ qw/DATETIME_FORMAT MySQL/ ] ],
] );


DateTime::Format::Strptimeはver. 1.0700にしないとtime_zoneがUTCになるバグがあります。

ソースは追記に

package FormValidator::Simple::Plugin::DateTime::Format;

use strict;
use warnings;
use FormValidator::Simple::Exception;
use FormValidator::Simple::Constants;
use DateTime::Format::Strptime;
use UNIVERSAL::require;

sub DATETIME_FORMAT {
    my ( $self, $params, $args ) = @_;
    my $date   = $params->[0];
    my $format = $args->[0];
    FormValidator::Simple::Exception->throw(
        qq/Validation DATETIME_FORMAT needs a format argument./)
      unless $format;

    my $module;
    if ( ref $format ) {
        $module = $format;
    }
    else {
        $module = "DateTime::Format::$format";
        $module->require
          or FormValidator::Simple::Exception->throw(
            qq/Validation DATETIME_FORMAT: failed to require $module. "$@"/ );
    }
    my $dt;
    eval {
        $dt = $module->parse_datetime($date);
    };
    my $result = $dt ? TRUE : FALSE;

    if ( $dt && $self->options->{time_zone} ) {
        $dt->set_time_zone( $self->options->{time_zone} );
    }
    return ($result, $dt);
}

sub DATETIME_STRPTIME {
    my ( $self, $params, $args ) = @_;
    my $date   = $params->[0];
    my $format = $args->[0];
    FormValidator::Simple::Exception->throw(
        qq/Validation DATETIME_STRPTIME needs a format argument./)
      unless $format;

    my $dt;
    eval{
        my $strp = DateTime::Format::Strptime->new(
            pattern => $format,
            on_error => 'croak'
        );
        $dt = $strp->parse_datetime($date);
    };

    my $result = $dt ? TRUE : FALSE;

    if ( $dt && $self->options->{time_zone} ) {
        $dt->set_time_zone( $self->options->{time_zone} );
    }
    return ($result, $dt);
}

1;

コメント

こっちも本体に登録しちゃっていいでしょうか

コメントを投稿