JavaScriptでPHPのmktime関数とdate関数を再現

JavaScriptの日付の扱いはとても面倒です。
一方、PHPではdateという関数があって、年月日などの整形がとても簡単です。
完全再現というわけにはいきませんが、JavaScriptでdate関数を使う方法を考えました。

php_mktime

まずPHPのmktimeという関数を作ります。
これは年月日時分秒を与えると1970年1月1日午前0時からの通算秒を返します。
PHPのmktimeは、時分秒月日年の順に与えるという奇妙な使用になっていますが、これに従います。
「2001年2月3日4時5分6秒」は「timestamp=php_mktime(4,5,6,2,3,2001)」として使います。

function php_mktime() {
  //PHPのmktimeを再現。
  //1970年1月1日午前0時からの通算秒数を返す。
  //引数は時,分,秒,月,日,年。省略のときは現在日時。
  var now, vals, mydate, i;
  now = new Date();
  vals = [];
  vals[0] = now.getHours();
  vals[1] = now.getMinutes();
  vals[2] = now.getSeconds();
  vals[3] = now.getMonth() + 1;
  vals[4] = now.getDate();
  vals[5] = now.getFullYear();
  for (i = 0; i < 6; i++) {
    if (typeof arguments[i] != 'undefined') {
      vals[i] = arguments[i];
    }
  }
  mydate = new Date(vals[5], vals[3] - 1, vals[4], vals[0], vals[1], vals[2]);
  return mydate.getTime() / 1000;
}

php_date

次にphp_dateという関数を作ります。
これはフォーマットとタイムスタンプを与えると日付や時間を整形して返します。
フォーマットにYを指定すると、年を4桁で返します。
本当はもっとたくさんあるのですが、ここではY,y,m,n,F,M,d,j,w,l,D,G,H,g,h,i,s,a,Aに対応しています。
例えば「php_date(“Ymd”,timestamp)」のようにして使うと「20010203」が返ります。

function php_date() {
  //PHPのdateを再現。
  //ただしY,y,m,n,F,M,d,j,w,l,D,G,H,g,h,i,s,a,Aに対応。
  //引数は形式,タイムスタンプ。タイムスタンプは省略できる。省略のときは現在日時。
  var format, timestamp, months, weekdays, mydate, temp;
  format = arguments[0];
  timestamp = arguments[1];
  if (typeof timestamp == "undefined") {
    timestamp = php_mktime();
  }
  months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
  weekdays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
  mydate = new Date(timestamp * 1000);
  //二重変換防止のためformatの文字を@で挟む。
  format = format.replace(/([YymnFMdjwlDGHghisaA])/g, "@$1@")
  //年
  format = format.replace(/@Y@/g, mydate.getFullYear());
  format = format.replace(/@y@/g, ("0" + mydate.getFullYear() % 100).slice(-2));
  //月
  format = format.replace(/@m@/g, ("0" + (mydate.getMonth() + 1)).slice(-2));
  format = format.replace(/@n@/g, mydate.getMonth() + 1);
  format = format.replace(/@F@/g, months[mydate.getMonth()]);
  format = format.replace(/@M@/g, months[mydate.getMonth()].substr(0, 3));
  //日
  format = format.replace(/@d@/g, ("0" + mydate.getDate()).slice(-2));
  format = format.replace(/@j@/g, mydate.getDate());
  //曜日
  format = format.replace(/@w@/g, mydate.getDay()); //0:日曜
  format = format.replace(/@l@/g, weekdays[mydate.getDay()]);
  format = format.replace(/@D@/g, weekdays[mydate.getDay()].substr(0, 3));
  //時(24時)
  format = format.replace(/@G@/g, mydate.getHours());
  format = format.replace(/@H@/g, ("0" + mydate.getHours()).slice(-2));
  //時(12時)
  temp = mydate.getHours() % 12 == 0 ? 12 : mydate.getHours() % 12;
  format = format.replace(/@g@/g, temp);
  format = format.replace(/@h@/g, ("0" + temp).slice(-2));
  //分
  format = format.replace(/@i@/g, ("0" + mydate.getMinutes()).slice(-2));
  format = format.replace(/@s@/g, ("0" + mydate.getSeconds()).slice(-2));
  //AM,PM
  temp = mydate.getHours() < 12 ? "am" : "pm";
  format = format.replace(/@a@/g, temp);
  format = format.replace(/@A@/g, temp.toUpperCase());
  return format;
}

コメント

  1. hk より:

    php_date()の年の下2桁取得のyオプションですが、

    > mydate.getFullYear() % 100

    これでは、**00~**09年は1桁になってしまいます。

  2. stabucky より:

    hkさん
    ご指摘の通り、yオプションは下2桁を取得して2桁で返すように修正しました。
    ありがとうございました。

タイトルとURLをコピーしました