Hatena::Diary

Perlにゅうもん〜さんぷるこーどによるPerlにゅうもん〜 このぺーじをあんてなについか RSSふぃーど

Webみにえいわ・わえいじてん ほんやくのこまど をりりーすしました。
さんぷるこーどちゅうしんのPerlにゅうもんです。 (びゅあーもくじ ,Perlいんすとーる, こまんどぷろんぷと )
さんぷるこーどをこぴーすれば、そのままPerlでじっこうして、ためすことができます。(きゅうしょうさいもくじ,きゅうかてごりべつもくじ)
でばっがで、さんぷるこーどをたどればりかいがふかまります。 (でばっがのつかいかた)

2008-11-20

DateTimeでのひづけけいさんのちゅういてん

 ひづけのけいさんはふきそくなぶぶんがあるのでできるだけたんじゅんなほうほうですますほうがよいです。ひづけけいさんをふくざつにしているげんいんをふくめて、ひづけけいさんのちゅういてんについてかいておきます。

ふろーてぃんぐたいむぞーん( floating TimeZone )

 DateTimeおぶじぇくとは、new めそっどでさくせいされて、たいむぞーんがしていされないばあいは、でふぉるとのたいむぞーんは、ふろーてぃんぐたいむぞーんとよばれるものになります。

 ふろーてぃんぐたいむぞーんとは、そんざいするどのたいむぞーんともかんけいがない、うるうびょうをこうりょしないたいむぞーんのことです。

 たいむぞーんとうるうびょうをこうりょするひつようがないばあいは、ふろーてぃんぐたいむぞーんをもちいてけいさんをおこなえばもっともあんしんだということになります。

 たとえばろぐからねんがっぴをしゅとくして、3げつごのねんがっぴをしゅとくしたいといったばあい、ふろーてぃんぐたいむぞーんでけいさんしてもんだいはありません。

うるうびょうとは

 じこくはぜったいてきなものではなくて、ちきゅうのじてんが1しゅうしたときがついたちとかぞえますから、ちきゅうのじてんがおくれるとついたちのながさがかわってしまいます。うるうびょうとはちきゅうのじてんがねんねんおくれていくために、なんねんかにいちどそうにゅうされるびょうのことです。

 うるうびょうがこうりょされているたいむぞーんをもちいて、うるうびょうがまにはさまるようにひづけをけいさんすると、うるうびょうがまにはさまらないばあいと1びょうのずれがしょうじます。

さまーたいむとは

 さまーたいむとは1ねんのあるきかんだけじこくを1じかんはやめるというせいさくのことです。あるしゅんかんにじこくを1じかんはやめるわけですから、1じかんじこくがちょうふくしてしまいます。ふつうのじこくが2ときだったとしたら、さまーたいむへんこうしたちょくごは1ときになるけです。

 このにちは、1ときから2ときがかさなってしまいます。

 だからさまーたいむをどうにゅうしているくにでは、じこくのけいさんをおこなおうとするとひじょうにふくざつなことになってしまいます。

 にっぽんのばあいはさまーたいむがありませんので、さまーたいむのえいきょうはかんがえるひつようがありません。

とくていのたいむぞーんをUTCにへんかんする。

 ひづけのけいさんをたんじゅんにするために、とくていのたいむぞーんをUTCにへんかんしてからけいさんします。

 そしてけいさんがおわったあとで、もとのたいむぞーんにもどします。

my $dt = DateTime->new( %user_input, time_zone => $user_tz );
$dt->set_time_zone('UTC'); # UTCにへんかん

# ひづけのけいさんをおこなう。

$dt->set_time_zone($user_tz); # もとのたいむぞーんにもどす。
print $dt->datetime;

 にっぽんのばあいはさまーたいむがありませんので、ろーかるじこくでけいさんをしてもきみょうなけっかになることはありません。せかいてきにはさまーたいむをどうにゅうしているくにがけっこうあるようです。

とくていのたいむぞーんでのけいさん

 とくていのたいむぞーんでけいさんをいってもたいていのばあいはただしいけっかがかえります。ただし、さまーたいむがどうにゅうされているばあいで、さまーたいむへのへんこうのじかんたいふきんをふくむばあいは、きみょうなけっかがかえります。

 じょうきでかいせつしたように、いったんUTCにへんかんしてけいさんしてからもとにもどすのがあんぜんです。

nowめそっどのでふぉるとのたいむぞーん

 nowめそっどでげんざいじこくをしゅとくすることができますが、でふぉるとのたいむぞーんはUTCになります。

 newでDateTimeおぶじぇくとつくったばあいは、でふぉるとのたいむぞーんは、ふろーてぃんぐたいむぞーんになります。

 

さいとあんない

  • DateTimeのもくじへ
  • もくじへ
  • とっぷぺーじへ
  • 2008-11-19

    DateTime::Duration きかんをあらわすおぶじぇくと

     ひづけとひづけのまのきかんをあらわすおぶじぇくと DateTime::Durationおぶじぇくとというものがあります。

     DateTimeがひづけのじょうほうをひょうげんするのにたいして、DateTime::Duration はきかんのじょうほうをひょうげんします。

     ひづけにあるきかんをくわえたりあるきかんをひいたりしたばあいは、addめそっどやsubstructめそっどをしようしましたが、ないぶてきには、DateTime::Durationおぶじぇくとがさくせいされたうえでえんざんがなされています。

    さんぷる

    DateTimeのいんすとーるがひつようです。

    use strict;
    use warnings;
    use DateTime;
    
    # DateTimeおぶじぇくとどうしのひきざん
    my $dt1 = DateTime->new( year => 2000 , month => 2, day => 1,
                             hour => 12, minute => 44, second => 30 );
    my $dt2 = DateTime->new( year => 2003 , month => 3, day => 19,
                             hour => 23, minute => 54, second => 40 );
    
    my $duration = $dt2 - $dt1; # ひきざんのきごうをそのままつかえます。
    
    print "(1) きかんをしゅとくする。\n";
    print "きかんは",$duration->years,"ねんと",
                   $duration->months,"がつと",
                   $duration->days, "にちと",
                   $duration->hours, "じかんと",
                   $duration->minutes, "ふんと",
                   $duration->seconds, "びょう\n\n";
    
    
    print "(2)きかんのじゅんじょをはんていする。\n";
    if( $duration->is_positive ){
        print "\$dt2は\$dt1よりのちのひづけです。\n";
    }
    elsif( $duration->is_zero ){
        print "\$dt2は\$dt1とひとしいです。\n";
    }
    elsif( $duration->is_negative ){
        print "\$dt2は\$dt1よりまえのひつきです。\n";
    }
    
    print "\n";
    
    print "(3)きかんをがつかんさんでしゅとくする。\n";
    print "きかんはがつかんさんで", $duration->in_units( 'months' ), "がつです。\n";
    
    __END__
    
    

    じっこうけっか

    かいせつ

    (1)-1 DateTime::Duration

     きかんをひょうげんするDateTime::Durationくらすというものがあります。DateTimeおぶじぇくとどうしのひきざんをおこなうと、もどりちとしてDateTime::Durationおぶじぇくとがへんきゃくされます。

     えんざんしおーばーろーどというきのうがりようされていて、- きごうをつかってDateTimeおぶじぇくとどうしのひきざんをおこなうことができます。

    my $dt1 = DateTime->new( year => 2000 , month => 2, day => 1,
                             hour => 12, minute => 44, second => 30 );
    my $dt2 = DateTime->new( year => 2003 , month => 3, day => 19,
                             hour => 23, minute => 54, second => 40 );
    
    my $duration = $dt2 - $dt1; # ひきざんのきごうをそのままつかえます。
    

    (1)-2 DateTime::Durationのあくせっさめそっど

     いかのめそっどできかんのじょうほうをしゅとくできます。DateTimeとはことなり、めそっどめいのさいごにsがつきます。

    $duration->years; # ねん
    $duration->months; # がつ
    $duration->days; # にち
    $duration->hours;# じかん
    $duration->minutes; # ふん
    $duration->seconds; # びょう
    

     ちゅういしないといけないことは、それぞれのめそっどはたんどくではいみをもたないということです。たとえば、$duration->days は、きかんのにっすうそのものをあらわしているのではないということです。

     きかんが1がつと30にちだとすると、$duration->days は30になります。 60 や 61 になることはありません。

    (2)きかんのじゅんじょをはんていする。

     じょうきのめそっどはつねにまさのあたいをへんきゃくするので、どちらのきかんがさきかというはんていをおこなうことができません。きかんのじゅんじょをはんていするには、is_positive, is_zero, is_negative めそっどをしようします。

    if( $duration->is_positive ){
        print "\$dt2は\$dt1よりのちのひづけです。\n";
    }
    elsif( $duration->is_zero ){
        print "\$dt2は\$dt1とひとしいです。\n";
    }
    elsif( $duration->is_negative ){
        print "\$dt2は\$dt1よりまえのひつきです。\n";
    }
    

    (3)-1 きかんをがつかんさんでしゅとくする。

     きかんをあるたんいでしゅとくするには in_unitsめそっどをしようします。

    $duration->in_units( 'months' ); # きかんが1ねんと15がつのばあいは27になります。
    $duration->in_inits( 'years' ); # きかんが1ねんと15がつのばあいは2になります。
    $duration->in_units( 'years', 'months' ); # きかんが1ねんと15がつのばあいは( 2, 3 )になります。
    

     ひきすうを2つわたすばあいは、りすとこんてきすとでうけとるひつようがあります。

    (3)-2 へんかんかのうなたんい

     たんいでへんかんかのうであるのはいかの4つだけです。

    ねんとがつ ( 1ねんは12がつ ) # years <=> months
    しゅうとにち ( 1しゅうかんは7にち ) # weeks <=> days
    じかんとふん ( 1じかんは60ふん ) # hours <=> minutes
    びょうとみりびょう ( 1びょうは1000みりびょう ) # seconds <=> nanoseconds
    

     にちとがつはそうごにへんかんできません。にっすうががつによってことなるためです。

     ふんとびょうはそうごにへんかんできそうですが、へんかんできません。うるうびょうそんざいによって、1ふんが61びょうになることがあるためです。

    どきゅめんと

    DateTime::Duration

    さいとあんない

  • DateTimeのもくじへ
  • もくじへ
  • とっぷぺーじへ
  • 2008-11-09

    WindowsXPをこうそくかする。

     かんたんにできてこうかがたかいとおもわれるWindowsのこうそくかのほうほうです。

     こじんてきには、Windowsのぱふぉーまんすのぼとるねっくはめもりであることがおおいとかんがえています。

     めもりうえのでーたをできるかぎりりようするようにして、でぃすくへのあくせすのかいすうをへらすとぱふぉーまんすがこうじょうします。

    1. できるだけめもりをつむ。
    2. めもりをしすてむきゃっしゅにりようする。
    3. MyDocumentにはふぁいるをおかない。でーたをCどらいぶいがいにおく。
    4. ですくとっぷにはふぁいるをおかない。
    5. いらないあぷりけーしょんはさいしょうかする。
    6. すたんばいきのうをりようする。
    7. すたんばいするときは、すべてさいしょうかしておく。
    8. がめんのいろかずを16bitにする。
    9. でざいんをWindowsくらしっくにする
    10. ぱふぉーまんすをゆうせんするせっていにする。

    (1) できるだけめもりをつむ。

    しんきにこうにゅうするばあいはめもりはできるだけおおきいものかいます。おぷしょんでめもりをついかできるばあいはついかします。

    (2) めもりをしすてむきゃっしゅにりようする。

     しすてむきゃっしゅとはたぶんふぁいるきゃっしゅのことで、めもりうえにおいておけるふぁいるのようりょうがおおきくなります。でぃすくあくせすのかいすうをすくなくできます。

     →しすてむきゃっしゅめもりのわりあてをふやすでかいせつされています。

    (3) MyDocumentにはふぁいるをおかない。でーたをCどらいぶいがいにおく。

     りゆうはよくわかりませんが、MyDocumentにふぁいるがおおくなるとぱふぉーまんすがわるくなるようなきがします。

     でーたふぁいるは、Cどらいぶいがいにおくようにします。Dどらいぶとかにおきます。

     あぷりけーしょんは、C:\Program Files におくのがよいです。

     ここいがいにおくとどうさがおかしくなるあぷりけーしょんがときどきそんざいするからです。

    (4) ですくとっぷにふぁいるをおかない。

     ですくとっぷにはできるだけふぁいるをおかないようにします。ですくとっぷにあいこんがふえると、ぱふぉーまんすがおちます。( OSがめもりうえになにかをじょうっけるため。たぶん )

    (5) いらないあぷりけーしょんはさいしょうかしておく。

     たくさんあぷりけーしょんをきどうしているばあいは、いらないあぷりけーしょんをさいしょうかしておきます。ぜんめんにうぃんどうがたくさんでているとぱふぉーまんすがおちます。

    Windowsきー + D でさいしょうかして、つかうものだけをぜんめんにだしておきます。

    (6) すたんばいきのうをりようする。

     すたんばいきのうをりようすると、ぱそこんのきどうがはやくなります。すたんばいするとめもりうえのでーたがでぃすくにほぞんされ、さいかいするともとのじょうたいにもどせます。

     すたんばいするには、しゅうりょうおぷしょんからすたんばいをえらびます。

    (7) すたんばいするときは、すべてさいしょうかしておく。

     すべてさいしょうかしておくと、すたんばいとさいかいがこうそくになります。

    (8) がめんのいろかずを16bitにする。

     がめんのいろかずを16びっとにします。わたしのWindowsXPのばあいは、でふぉるとは32bitでした。16bitにするとびょうがそくどがこうじょうします。

     →WindowsXP、ぱそこんのうごきをはやくするほうほう!3けんでかいせつされています。

    (9) でざいんをWindowsくらしっくにする

     これは、Windowsのでざいんがふるめかしいものになるので、ぱふぉーまんすゆうせんのにんむけです。

     →WindowsXP、ぱそこんのうごきをはやくするほうほう!3けんでかいせつされています。

    (10) ぱふぉーまんすをゆうせんするせっていにする。

     これはWindowsのがめんのびょうがきのうをせいげんしてしまうので、ぱふぉーまんすゆうせんのにんむけです。

     →WindowsXP、ぱそこんのうごきをはやくするほうほう!3けんでかいせつされています。

    2008-11-08

    DateTime::Locale ろけーるしていのためのくらす

     DateTimeのこんすとらくたのひきすうろけーるめいをしていすることができます。

     DateTimeはこんすとらくたのなかで、DateTime::Localeおぶじぇくとをせいせいしています。そしてせいせいしたろけーるおぶじぇくとにもとづいてちいきやくにごとのひづけじょうほうのしゅつりょくをつくります。

     ろけーるのいちらんはこちら。

    さんぷる

    DateTimeのいんすとーるがひつようです。

    use strict;
    use warnings;
    use DateTime;
    use DateTime::Locale;
    
    # えんこーどよう
    use Encode;
    my $encode_to;
    if( $^O eq 'MSWin32' ){
        $encode_to = 'shift-jis';
    }
    else{
        $encode_to = 'utf8'; # おこのみにおうじて
    }
    
    print "(1) DateTime::Localeおぶじぇくと\n";
    my $locale = DateTime::Locale->load( 'ja' ); # ろけーるのせいせい
    my $dt = DateTime->now( locale => $locale , time_zone => 'local' );
    my  $day_name    = $dt->day_name;   # ようびめい
    print encode( $encode_to, $day_name ), "\n";
    
    __END__
    
    

    かいせつ

    (1)ろけーるおぶじぇくとのめいじてきなさくせい
    my $locale = DateTime::Locale->load( 'ja' ); # ろけーるのせいせい
    

     めいじてきにDateTime::Localeおぶじぇくとをさくせいするには、loadめそっどをしようします。

     loadめそっどは、しょかいはDateTime::Localeおぶじぇくとをさくせいしますが、2かいめいこうはめもりにほぞんしたDateTime::Localeおぶじぇくとをさいりようします。

     ぷろぐらむなかで'ja'をひょうげんするDateTime::Localeおぶじぇくとはつねにそんざいしないかたったひとつであるかのどちらかです。(このようなおぶじぇくとをsingleton(しんぐるとん)とよびます。)

     DateTime::TimeZoneおぶじぇくとのようにまいかいさくせいされるわけではありません。

    (2)ろけーるおぶじぇくとをこんすとらくたにわたす

     ろけーるおぶじぇくとをDateTimeのこんすとらくたにわたすには、いかのようにします。

    my $dt = DateTime->now( locale => $locale , time_zone => 'local' );
    

     めいじてきにろけーるおぶじぇくとをわたすこともできますが、

    my $dt = DateTime->now( locale => 'ja' , time_zone => 'local' );
    

     のように、もじれつでしていするのがらくです。こうかくと、DateTimeのこんすとらくたのなかでじどうてきにDateTime::Localeおぶじぇくとがさくせいされます。

    さいとあんない

  • DateTimeのもくじへ
  • もくじへ
  • とっぷぺーじへ
  • 2008-10-17

    せんれんされたPerl: CおよびJavaぷろぐらまーのためのPerl 5.6

     だいぶふるいきじですが。

    せんれんされたPerl: CおよびJavaぷろぐらまーのためのPerl 5.6

    もくじ

    いんたーぷりたーのしくみ

    そくどおよびべんちまーく・てすと

    れいがい、こんぱいる、およびぶんしょ

    げんごのあいまいさ

    1つのもくてきにたいしてふくすうのしゅほうがそんざいする (There's more than one way to do it (TMTOWTDI))

    せいきひょうげんのなきところ

    すからー、はいれつ、はっしゅ: おどろきのこうきのう

    Perlにないきのう

    Perlのもっともまされているぶぶんとは

    さんこうぶんけん

    ちょしゃについて

    きじのひょうか

    きじのぬきだし

    C/C++/Javaぷろぐらまーにとって、よりまされたぶぶんをもつPerlはひじょうにかちのあるものです。

    ゆうしゅうなぷろぐらまーは、つねにふくすうのつーるをよういしておくものです。

    Perlははんようてきなげんごです。そして、かずおおくのことなるもじゅーるをむすびつけるやくわりをはたすじゅうなんなげんごです。

    しかしもっともたいせつなのは、Perlをつかったぷろぐらみんぐはたのしく、つねになにかをまなんでいけるということです。

    さいとあんない

    2008-10-16

    げつまつじつをしゅとくする。

     げつまつじつをしゅとくするかんすうのさんぷるです。Time::Localもじゅーるのtimelocalかんすうをつかってそんざいするひづけをたしかめています。

    さんぷる

    use strict;
    use warnings;
    
    print "(1)げつまつじつをしゅとくする。\n";
    my $end_of_month_200802 = end_of_month( 2008, 2 );
    print "2008ねん2がつのげつまつじつは$end_of_month_200802にちです\n";
    
    # げつまつじつをもとめるかんすう。
    sub end_of_month{
        my ( $year, $month ) = @_;
        return if !$year || !$month;
        
        $year -= 1900; # Time::Local::timelocalかんすうは1900からのけいかねんをひきすう
                       # にとるので、1900をひく。
        $month--; # Time::Local::timelocalかんすうは 1がつは0,2がつは1のように0から
                  # はじまるがつをひきすうにとるので、1をひく。
        my @days = ( 31, 30, 29, 28 ); # げつまつじつのこうほはこの4つ
        
        require Time::Local; # ひづけのそんざいちぇっくようにしよう。
        
        foreach my $day ( @days ){
            eval{
                Time::Local::timelocal( 0, 0, 0, $day, $month, $year );
                 # そんざいしないにちをしていするとれいがいがおこる。
            };
            return $day unless $@; # れいがいがおこらなければそんざいするひづけ。
        }
        return;
    }
    
    __END__
    
    

    こーどかいせつ

    (1)げつまつじつをしゅとくする。
    (1)-1 げつまつじつのこうほになるひづけ

     げつまつじつになるのは、28にち、29にち、30にち、31にちのどれかです。31にちからじゅんにちぇっくしていってそんざいするひづけであればそれがげつまつじつです。

        my @days = ( 31, 30, 29, 28 ); # げつまつじつのこうほはこの4つ
    

    (1)-2 そんざいするひづけのちぇっく

     「そんざいするひづかどうかをはんていする。」でかいせつしたように、Time::Localもじゅーるのtimelocalかんすうでひづけのちぇっくをおこないます。

     31にちからじゅんに28にちまでちぇっくをしていきます。そんざいしないひづけをしていするとれいがいがおこるので、れいがいがおこらなければそれがげつまつじつです。

        require Time::Local; # ひづけのそんざいちぇっくようにしよう。
        
        foreach my $day ( @days ){
            eval{
                Time::Local::timelocal( 0, 0, 0, $day, $month, $year );
                 # そんざいしないにちをしていするとれいがいがおこる。
            };
            return $day unless $@; # れいがいがおこらなければそんざいするひづけ。
        }
    

    かんれんきじ

    げつまつじつをしゅとくする(じさくのそふとかいはつきろく)

     げつまつじつをもとめるべつのやりほうがしょうかいされていました。れいがいしょりをつかわないので、MAS3さんのやりほうのほうがよいです。

    さいとあんない

    2008-10-13

    そんざいするひづかどうかをはんていする。

     そんざいするひづかどうかをかんたんにはんていするには、Time::Localもじゅーるをりようします。

     Time::Localのtimelocalかんすうはしていしたひづけをえぽっくからのけいかびょうにへんかんするかんすうですが、そんざいしないひづけをしていするとれいがいをなげます。

     このことをりようするとそんざいするひづけのはんていをおこなうことができます。

    use strict;
    use warnings;
    
    use Time::Local qw( timelocal );
    
    print "(1)そんざいするひづかどうかをかくにんする。\n";
    my $year = 2008 -1900; # Perlではじこくは1900ねんからのけいかねんすうであつかうので
                           # 1900をひく。
    my $mon = 10 - 1; # がつは0からはじまるので、もとめたいがつから1をひく。
    my $mday = 32; # そんなにちはないはず。
    
    # そんざいしないにちをしていするとれいがいをなげるのでevalできゃっち
    eval{
        timelocal( 0, 0, 0, $mday, $mon, $year );
    };
    
    $year += 1900; # ふくげん
    $mon++; # ふくげん
    
    # れいがいがおこると$@がせっとされる。
    if( $@ ){
        print "$yearねん$monがつ$mdayにちはそんざいしません\n\n";    
    }
    else{
        print "$yearねん$monがつ$mdayにちはそんざいします\n\n";
    }
    
    
    print "(2)ひづけはんていをかんすうにする。\n";
    if( day_exist( $year, $mon, $mday ) ){
        print "$yearねん$monがつ$mdayにちはそんざいします\n";    
    }
    else{
        print "$yearねん$monがつ$mdayにちはそんざいしません\n";
    }
    
    # ひづけがそんざいするかをはんていするかんすう
    sub day_exist{
        my ( $year, $mon, $mday ) = @_;
        $year -= 1900;
        $mon--;
        
        require Time::Local;
        eval{
            Time::Local::timelocal( 0, 0, 0, $mday, $mon, $year );
        };
        return $@ ? 0 : 1;
    }
    
    __END__
    
    
    

    (1)そんざいするひづかどうかをかくにんする。

    (1)-1ひづけをあつかうときのちゅうい

     Perlのひょうじゅんかんすうでは、ねんは1900ねんからのけいかねんすうであつかいます。がつは1がつは0、2がつは1のように0からすたーとします。

     Time::Localもじゅーるの timelocalかんすうにひきすうをわたすときはこのことをこうりょするひつようがあります。

    my $year = 2008 -1900; # Perlではじこくは1900ねんからのけいかねんすうであつかうので
                           # 1900をひく。
    my $mon = 10 - 1; # がつは0からはじまるので、もとめたいがつから1をひく。
    my $mday = 32; # そんなにちはないはず。
    
    (1)-2 ひづけがそんざいするかのはんていをおこなう。

     Time::Localもじゅーるのtimelocalかんすうをしようしてひづけのはんていをおこないます。

     timelocalかんすうのひきすうは、「びょうふんときにちげつねん」のじゅんでしていするひつようがあるので、だみーとしてびょうふんときには0をわたしています。

     そんざいしないひづけのばあいはtimelocalかんすうはれいがいをなげますので、evalできゃっちします。れいがいがおきたばあいは$@にないようがせっとされるので、これではんていをおこないます。

    use Time::Local qw( timelocal );
    eval{
        timelocal( 0, 0, 0, $mday, $mon, $year );
    };
    if( $@ ){
        print "$yearねん$monがつ$mdayにちはそんざいしません\n\n";    
    }
    else{
        print "$yearねん$monがつ$mdayにちはそんざいします\n\n";
    }
    

    (2)ひづけがそんざいするかをはんていするかんすうをさくせいする。

     はんていほうほうがじょうきのようにかなりはんざつなので、ひきすうを「ねんがっぴ」でしていできるひづけはんていかんすうをつくっておくとべんりです。

    sub day_exist{
        my ( $year, $mon, $mday ) = @_;
        $year -= 1900;
        $mon--;
        
        require Time::Local;
        eval{
            Time::Local::timelocal( 0, 0, 0, $mday, $mon, $year );
        };
        return $@ ? 0 : 1;
    }
    

    さいとあんない

    www.learn-japan.org(romaji/hira/kata/hirakata)