Chapter 3. Dates, Time, and Timers
2010/07/27(火) 24:29 Javascript親記事へこのエントリーをはてなブックマークに追加

DateオブジェクトやsetTimeoutなどの時間についての章

3.4  Converting an ISO 8601 Formatted Date to a Format Acceptable to the Date Object

ISO 8601からDateオブジェクトに変換してみる。
  var dtstr= "2009-10-15T14:42:51Z";// ISO 8601
  // ISO 8061のTはTime、Zはzone
  dtstr = dtstr.replace(/\D/g," ");// 数字だけにする
  var dtcomps = dtstr.split(" ");
  // modify month between 1 based ISO 8601 and zero based Date
  dtcomps[1]--; // jsのmonthは0から指定なのでデクリメント
  var convdt = new
Date(Date.UTC(dtcomps[0],dtcomps[1],dtcomps[2],dtcomps[3],dtcomps[4],dtcomps[5]));
//Thu Oct 15 2009 23:42:51 GMT+0900  Date
2009-10-15 だけみたいなTimeまで入れてないデータでも成立するようにsplitで分割した後に残りを0で埋めておくとかの処理があると適当な数字でもDateオブジェクトが作りやすい。
が、こういうのはバグを作りやすいので厳密にしておいた方がいいような気もする。
function convertISO8601toDate(dtstr) {
  dtstr = dtstr.replace(/\D/g," ");// 数字だけにする
  var dtcomps = dtstr.split(" ");
  // modify month between 1 based ISO 8601 and zero based Date
  dtcomps[1]--; // jsのmonthは0から指定なのでデクリメント
  if (dtcomps.length < 3) return "invalid date";
  // if time not provided, set to zero
  if (dtcomps.length < 4) {
    dtcomps[3] = 0;
    dtcomps[4] = 0;
    dtcomps[5] = 0;
  }
  var convdt = new
Date(Date.UTC(dtcomps[0],dtcomps[1],dtcomps[2],dtcomps[3],dtcomps[4],dtcomps[5]));

 return convdt.toUTCString();
}
convertISO8601toDate("2010-07-22");// Thu, 22 Jul 2010 00:00:00 GMT

3.7  Tracking Elapsed Time

よくあるような経過時間を計るとき、Dateオブジェクト同士を引算すると簡単に差分を計算できる。
var firstDate;
window.onload=startTimer;
function startTimer(){
  firstDate = new Date();
  document.getElementById("date").onclick=doEvent;
}
function doEvent() {
  var secondDate = new Date();
  alert((secondDate - firstDate) / 1000);
}

3.8  Creating a Timeout

setTimeout と setInterval の性質の違い。
本にはたいしたこと書いてないが、John Resig - How JavaScript Timers Workが大変興味深い。
こっちも参考になる

3.10  Using Function Closures with Timers

setTimeoutとか第三引数で実行関数に引数として値を渡せるけどIEは対応してないので関数でクロージャー作れば解決するとかの話。
要はsetTimeout で実行する関数に引数を渡すみたいな。

setTimeoutとsetIntervalの本質的な内容はリンクがあっただけで投げられていた。
この章ではそこが一番難しいけど本には特に詳しく書いてない。

名前:  非公開コメント   

  • TB-URL  http://efcl.info/adiary/052/tb/