[勉強]週番号から週番号へ

前回の記事「20代で知っておくべき週番号のこと」では、その最後にある日付の週番号を求めるスクリプトをおまけで載せておいた。

週番号なんて興味ある人なんてほとんどいない上に、更にそれを MortScript なんていうマニアックな言語で書いたらもうね、…見る人いるの?w

まぁそんなわけで JavaScript でおんなじように書いたヤツも乗せておくよ。これで10000人に1人くらいいるらしい週番号 LOVE でいつでも JavaScript を使って求めずにはいられない衝動に駆られた人が来るようになるハズ。イイね!

キタコ ゼッケンステッカー 番号:2キタコ ゼッケンステッカー 番号:0キタコ ゼッケンステッカー 番号:1キタコ ゼッケンステッカー 番号:0

TIFFANY&Co. ティファニー アルファベット:M ペンダントキタコ ゼッケンステッカー 番号:1キタコ ゼッケンステッカー 番号:9

ちなみに今日の週番号は 2010W19 だよ。

もちろん誰も待ってない JavaScript で書いたスクリプト

javascript:(function(){
    /* 今日の日付の場合 */
    var u=new Date();
    /* とある日付の場合 (月は0から11の範囲で指定することに注意) */
    /* var u=new Date(2010,4,12); */

    var year=u.getFullYear();
    var week=calcWeekNumber(u);
    if(week===0){
        year-=1;
        week=calcWeekNumber(new Date(year,11,31));
    }else if(week===53){
        var lastday=(new Date(year,11,31)).getDay();
        if(lastday>0 && lastday<4){
            year+=1;
            week=1;
        }
    }
    var weekdate=year+'W'+(week<10?'0':'')+week;

    alert(weekdate);

    function calcWeekNumber(u){
        var y=u.getFullYear();
        if(y%4===0 && (y%(100)!==0 || y%(400)===0)){
            /* 閏年 */
            var ordinaldate=[0,31,60,91,121,152,182,213,244,274,305,335];
        }else{
            /* 平年 */
            var ordinaldate=[0,31,59,90,120,151,181,212,243,273,304,334];
        }
        var d=u.getDay();
        d=(d===0?7:d);
        return Math.floor((ordinaldate[u.getMonth()]+u.getDate()-d+10)/7);
    }
})();

bookmarklet になってる。やったね☆

あまりにも更新頻度が低かったのでこういう変な記事でも投稿してくことにした。ブログなんてものは自己満足と軽い気持ちでやればいいのさ〜。

[勉強]20代で知っておくべき週番号のこと

ちょいと気になって週番号について調べてみた。それについて書いておこっと。

週番号、週 BANG!! GO!! (悪のり)

まず、週番号とは具体的に何ぞや、ということでこれを簡単に知るためには Wikipedia を見るのが手っ取り早いね。

日付と時刻の表記に関する国際規格 である ISO 8601 のページに書いてある説明を簡単にまとめると以下のようになるかな。

  • ある年の第1週を01で表し、よって最終週は52または53となる
  • 最初の木曜日を含む週がその年の第1週である
  • 週番号は週の始まりを月曜日として数える

ほぅほぅ、いろいろと知らなかったことが書いてあった。

最終週の週番号が年によって52か53に変わるってのも知らなかったけど、更に木曜日を基準に考えているなんてことは全く知らなかった。

何故、木曜日が優遇されてるのかは分からないけど、これによって12月でも次の年の第1週に数えたり、1月でも前の年の最終週に数えたりということがあるということ。何か強大な圧力が作用してこうなったんだろうね!(勝手な想像)

明日、学校や会社で知識をひけらかしたらイイと思うよ。

週番号の求め方

さてさて、そんな週番号を求めるにはどうしたらいいか。親切なことに英語版 Wikipedia の ISO week date のページには計算の仕方が書いてあった。

ある日付から週番号を計算する

123456789101112
平年0315990120151181212243273304334
閏年0316091121152182213244274305335

ここでは、例として今日の日付で計算してみるかな。 (2010年5月12日 水曜日)

上のテーブルを使って累積日数を求める
Ordinal day: 120+12=132
曜日を数値として数える (月曜日を1として日曜日を7とする)
Weekday: 水曜日=3
累積日数から曜日を引いて10を足す
(Ordinal day)-(Weekday)+10=132-3+10=139
7で割って端数は切り捨てる
139/7=19
求めた数字が0のときは前の年の最終週となり、53のときは次の年の第1週の場合もあるので確認する
今回はそのまま、週番号は19!

週番号は2010W19って表すとなんかいいよね。それだけw

キタコ ゼッケンステッカー 番号:2キタコ ゼッケンステッカー 番号:0キタコ ゼッケンステッカー 番号:1キタコ ゼッケンステッカー 番号:0

TIFFANY&Co. ティファニー アルファベット:M ペンダントキタコ ゼッケンステッカー 番号:1キタコ ゼッケンステッカー 番号:9

ちなみに、最後の手順で0になったときは、前の年の最終週の週番号が52か53か分からないのでもう一度計算しないといけない。慣れれば0を計算で求める前に0になりそうなのは分かるようになるよね。いや、 sima は慣れてないから分からないけど。53になったときは、その年の12月31日が月、火、水曜日だったら次の年の第1週とすればイイはず、…多分。

ところで何で10を足すんだろ、深く考えずにまるまんま信じて計算したけど気になるっちゃあ気になるね。何でだろ。

ある週番号と曜日から日付を計算する

反対に週番号から日付を求める方法も書いてあったので、興味がある人は ISO week date を見るとイイと思うよ。決して説明が面倒になったとかそういうわけではな…。

誰も待ってない MortScript のスクリプト

話としては以上なんだけど、マニアックな言語 MortScript である日付の週番号を求めるスクリプトを書いたのでせっかくだから載せておこっと。確実に需要はないだろうけどw

# 今日の日付の場合
# u=TimeStamp()
# とある日付の場合
u=MakeTimeStamp(2010,5,12)

year=FormatTime("Y",u)
CallFunction("calcWeekNumber",week,u)
If(week=0)
    year-=1
    CallFunction("calcWeekNumber",week,MakeTimeStamp(year,12,31))
ElseIf(week=53)
    lastday=FormatTime("w",MakeTimeStamp(year,12,31))
    If(lastday>0 && lastday<4)
        year+=1
        week=1
    EndIf
EndIf
weekdate=year&"W"&(week<10?"0":"")&week

Message(weekdate)


Sub calcWeekNumber
    Local()
    u=argv[1]
    y=FormatTime("Y",u)
    If(y MOD 4 =0 && (y MOD 100 <>0 || y MOD 400 =0))
        # 閏年
        ordinaldate=Array(0,31,60,91,121,152,182,213,244,274,305,335)
    Else
        # 平年
        ordinaldate=Array(0,31,59,90,120,151,181,212,243,273,304,334)
    EndIf
    d=FormatTime("w",u)
    d=(d=0?7:d)
    Return(Floor((ordinaldate[FormatTime("m",u)*1]+FormatTime("d",u)-d+10)/7))
EndSub


Exit

MortScript はあまりにもマニアックなので、 JavaScript でも書いてみた

プロフィール

sima

ガジェット大好き。おもしろアイテム大好き。いろいろとまぁ物欲を刺激するモノが多いけど、なかなか手に入れることができないでいる。いつかは自分の部屋を、自分が気に入ったモノだけで埋め尽くしたいものだなぁ。…あっ、これ将来の夢ね。

Twitter はフォロー大歓迎なのでよろしく。よく蚊と戦ってるよ。

最新記事

  1. OpeTumblr の Opera Extensions (拡張機能) 版を密かに公開 (05月25日)
  2. シカ成分を補充したら幸せになった (04月24日)
  3. ブログを(内部的にガッツリと)リニューアルしてみた (12月10日)
  4. 補完モードを開始するマッピングを書く (10月25日)
  5. アボカドを育ててみた…かった (07月23日)
  6. 正規表現クロスワードを完全クリアしてみた (07月19日)
  7. Gmail バックアップソフトの Gmvault が動かないときの解決法 (07月14日)
  8. Google アカウントが消える前に! Gmail フルバックアップのススメ (06月30日)
  9. 厳選して使っているポイントサイト2つ (03月27日)
  10. Tumblr で画像を Lightbox 表示!(しかも何も導入せずに) (03月21日)

カテゴリ

アーカイブ

コメント

Gmail バックアップソフトの Gmvault が動かないときの解決法
dsfds (03月31日)
OpeTumblr の Opera Extensions (拡張機能) 版を密かに公開
sima (06月26日)
you (11月30日)
you (11月30日)
sima (10月28日)
HTML ソースの改行を半角スペースにしない方法
ok (06月21日)
sima (05月28日)
edvakf (05月28日)
英数字・記号を並べてみる
ふぁ (11月25日)
コメハチ (11月02日)
OperaでもっとTumblrる!(OpeTumblrをまたまた改良)
you (05月09日)
sima (05月07日)
you (05月04日)
chikuwa (12月12日)

トラックバック

20代で知っておくべき週番号のこと
full of universe (05月16日)
UKTenkiを自動巡回させてみる(MortScript)
なんとなくすばらしい日々の戯れ言 (01月31日)
新着メールを一気に開くMortScriptを改良!
PDAと私生活 (11月07日)
PDAと私生活 (11月02日)
コイツはすごい!Windows Live Writerでブログ投稿をラクラクに
シーサーイーサー (10月31日)
Willcom03で新着メールを一気に開く!(MortScript)
PDAと私生活 (10月10日)

のカレンダー