Dateオブジェクトで紀元前を表現できるのか?

Dateオブジェクトで紀元前も表現できることを初めて知った。

これまで作ったアプリケーションでは,せいぜい現在から10数年前や10数年先くらいのタイムスパンでしかDateオブジェクトを使う事を考えていなかった。しかし今回作っているアプリケーションでは,数億年先や数億年前という壮大なタイムスパンを扱う必要が出てきた。

Dateオブジェクトを扱う時に,よくlongのmsec値を使う。「現在」をこのlong値表現で表示させるとすごく大きい数なのだが,ではこの値がゼロの場合はいつを示すのか。これは多くの言語でもそうだと思うが,ActionScriptやJavaだと「1970年 1月 1日 0:00:00(GMT)」だ。

これは前から知っていたのだが,このことからActionScriptやJavaのDateオブジェクトでは1970年以前を表現できないと思い込んでいた。このlong値がマイナスの場合を考えた事がなかったからだ。

実際に試してみると,long値がマイナスの場合で1970年以前を表現できることがわかった。ということは,マイナスをどんどん大きくすれば紀元前でも数億年前でも表現できるのだ!おお!

「紀元前 10年 9月 22日 0時 0分」はlong値では「-62425846765017」。これをDateオブジェクトに渡して「fullYear」を取得して表示すると「-9」となってしまう。

マイナスであることは紀元前であることなのだが,1小さいのは西暦0年が紀元前1年であるためだ。

これだと意味がよくわからないので,下記のようにfullYearがマイナスだったらBCとつけ,1を足して紀元前に補正する。

public static function toFormatedDateString(val:Number):String {

  var date:Date = new Date(val);
  var fdate:String = "";

  //紀元前
  if (date.fullYear <= 0) {
    fdate += "BC ";
    //絶対値にしてマイナスを取り除く
    //西暦0年は存在せず,西暦0年が紀元前1年なので1を足して補正
    fdate += Math.abs(date.fullYear) + 1;
  }

  //西暦
  else {
    fdate += date.fullYear;
  }

  fdate += "年 ";
  fdate += (date.month + 1) + "月 "; //monthは0から始まるので1を足して補正
  fdate += date.date + "日 ";
  fdate += date.hours + "時 ";
  fdate += date.minutes + "分";
  trace(fdate);

  return fdate;

}

すると「-62425846765017」は「BC 10年 10月 22日 0時 0分」と表示される。

コメント

このブログの人気の投稿

レオナルド・ダ・ビンチはなぜノートを「鏡文字」で書いたのか?

macでsmb(samba)共有サーバーに別名で接続(別アカウント名で接続)する方法

Google DriveにCURLでアップロードするには?