作成日
2005-02-19
変更日
2005-12-03

fdate: 特定の文字列を W3C-DTF 表記の日付に置換する JavaScript (とNucleusプラグイン)

面倒なW3C-DTF表記を簡単に入力するためのJavaScriptとプラグインです。

これは何?

読んで字のごとく、特定の文字列を W3C-DTF フォーマットの日付に置換する JavaScript とNucleusプラグインです。

Nucleus で ins タグの datetime 属性にいつも日付を W3C-DTF フォーマットで書いていたのですが、面倒になったので JavaScript にさせることにしました。

ちなみに、fdate は formatted date の略です。

仕組み

正規表現でフォーム内の「%%NOW%%」という文字列を検索し、W3C-DTF フォーマットの現在の日付に置換します。

ソース

%%NOW%% 以外の文字列を置換する場合や Nucleus 以外でご利用になる場合は適宜変更してください。

var mySysDate = new Date();
myYear = mySysDate.getFullYear();
myMonth = mySysDate.getMonth()+1;
myDate = mySysDate.getDate();
myHour = mySysDate.getHours();
myMin = mySysDate.getMinutes();
mySec = mySysDate.getSeconds();
if(myMonth < 10) { myMonth = "0" + myMonth; }
if(myDate < 10) { myDate = "0" + myDate; }
if(myHour < 10) { myHour = "0" + myHour; }
if(myMin < 10) { myMin = "0" + myMin; }
if(mySec < 10) { mySec = "0" + mySec; }
var fDate = myYear + '-' + myMonth + '-' + myDate + 'T' + myHour + ':' + myMin + ':' + mySec+'+09:00';
var myPattern = new RegExp('%%NOW%%', 'g');
var myTarget = document.forms[0].body.value;
var myResult = myTarget.replace(myPattern, fDate);
document.forms[0].body.value = myResult;

問題点

Bookmarklet

ins要素とかdel要素とかを使っているとW3C-DTFフォーマットの日付を結構使うので、Bookmarkletを作ってみた。

javascript:(function(){var mySysDate = new Date();
myYear = mySysDate.getFullYear();
myMonth = mySysDate.getMonth()+1;
myDate = mySysDate.getDate();
myHour = mySysDate.getHours();
myMin = mySysDate.getMinutes();
mySec = mySysDate.getSeconds();
if(myMonth < 10) { myMonth = '0' + myMonth; }
if(myDate < 10) { myDate = '0' + myDate; }
if(myHour < 10) { myHour = '0' + myHour; }
if(myMin < 10) { myMin = '0' + myMin; }
if(mySec < 10){ mySec = '0' + mySec; }
var fDate = myYear + '-' + myMonth + '-' + myDate + 'T' + myHour + ':' + myMin + ':' + mySec+'+09:00';
var x=prompt('',fDate);
})();

動作例 (JavaScript の実行環境が必要です)

Nucleus プラグイン

使いづらかったので、Nucleus プラグインにしてみた。このプラグインの最新版はtrunkから入手可能である。

管理画面では置換する文字列を変更することができる (デフォルトは「%%NOW%%」)。

<?php

class NP_FDate extends NucleusPlugin {

    function getName() {    // name of plugin
        return 'FDate'; 
    }

    function getAuthor()  {    // author of plugin 
        return 'ak'; 
    }
    
    function getURL()     {    // an URL to the plugin website
        return 'http://micelle.org/trash/fdate/'; 
    }
    
    function getVersion() {    // version of the plugin
        return '0.1'; 
    }
    
    // a description to be shown on the installed plugins listing
    function getDescription() { 
        return 'convert particular texts to W3C-DTF format';
    }

    function supportsFeature($what) {
        switch($what){
            case 'SqlTablePrefix':
                return 1;
            default:
                return 0;
        }
    }

    function getEventList() { return array('PreAddItem', 'PreUpdateItem'); }

    function install() {
        $this->createOption("replace", "text to change to W3C-DTF", "text", "%%NOW%%");
    }
        
    function event_PreAddItem(&$data) {
       if($this->getOption('replace')) {
        $data['body'] = $this->fdate($data['body']);
        if(trim($data['more'])) {
          $data['more'] = $this->fdate($data['more']);
          }
        }
       return;
    }
    
    function event_PreUpdateItem(&$data) {
       if($this->getOption('replace')) {
       $data['body'] = $this->fdate($data['body']);
       if(trim($data['more'])) {
          $data['more'] = $this->fdate($data['more']);
          }
        }
       return;
    }

    function fdate($str) {
        $fdate = date("Y-m-d\TH:i:s");
        $diff = date("O");
        $diff = substr($diff, 0, 3) . ':' . substr($diff, 3);
        $fdate .= $diff;
        $str = str_replace($this->getOption('replace'), $fdate, $str);
        return $str;
    }

}
?>

References