TweetUrlAnalyzerという,ミニ・ライブラリを作成した。
仕様
Twitterの個別ツイートのURL
https://twitter.com/TwitterJP/status/1120120399189004288
という文字列から
そのつぶやきの投稿時刻情報
- 2019年4月22日(月) 09時21分28秒 654㍉秒
- 2019/4/22(月) 09:21:28.654
を抽出するJavaScriptライブラリ。
URLを日時に変換するということ。
コード
/* ツイートURLからつぶやき投稿の年月日・日時情報を抽出するクラス @author : id:Sourcecode-Student Apache License 2019.6.01. ver1.2 JSONで返すことも可能に。出力結果にテーブル形式を含め,エクセルにコピペしやすくした。 2019.5.02. ver1.1 出力形式をTwitterにコピペしやすく 2019.4.30. ver1.0 新規作成 */ // ツイートのURLを扱うオブジェクト var TweetUrlAnalyzer = { // 正当なツイートURLか validTweetUrl : function( url ){ return !! url.match( /status\/(\d+)/ ); }, // URLからツイートIDを抜き出す getTweetIdFromtTweetUrl : function( url ){ return url.match( /status\/(\d+)/ )[1] }, // URLからアカウントIDを抜き出す getUserIdFromtTweetUrl : function( url ){ return url.match( /\/([^\/]+)\/status\// )[1] }, // URLからDateオブジェクトを生成 convertTweetUrlToDatitimeObj : function( url ){ log( "url=" + url ); // URLから数値の並びを取得 var tweet_id = this.getTweetIdFromtTweetUrl( url ); log( tweet_id ); var big_num = parseInt( tweet_id, 10 ); log( "parseInt : " + big_num ); // 下の22ビットを落とす(右へ22ビットシフト) // ※ここで,JavaScriptのビット演算子には罠があり,オペランドは32ビット整数に変換されてしまう。 // https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators // 「シフト演算子はそのオペランドをビッグエンディアン形式の 32 ビット整数に変換し、 // 左のオペランドと同じ型の結果を返します。 // 右のオペランドは 32 より小さくするべきであり、そうでない場合は下位 5 ビットのみが用いられます。」 // // したがって,JavaScriptでは 2^32 = 4294967296 よりも大きな整数のビットシフトは不可能。 // そこで,ビットシフトの代用として,割り算を行なう。 // 「右へ22ビットシフト」とは,2^22 = 4194304 で割ること。 // 割り算(ビットシフト)の結果,基準時刻からのミリ秒になる。 var relative_milli_sec = big_num / 4194304; log( "relative_milli_sec : " + relative_milli_sec ); // 基準時刻の定数を足して,絶対ミリ秒として成立させる var absolute_milli_sec = relative_milli_sec + 1288834974657 log( "abs_ms = " + absolute_milli_sec ); // Datetimeを生成 var dt = new Date( absolute_milli_sec ); return dt; }, // 曜日番号に対応した曜日の漢字を返す getYoubiKanjiFromInt : function( i ){ // ※ 0 が日曜 // https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/getDay return [ "日", "月", "火", "水", "木", "金", "土" ][ i ]; }, // 「年月日・時分秒・㍉秒」形式の日時文字列に変換 convertTweetUrlToDatitimeStrJpn : function( url ){ // URLからDatetimeオブジェクトを生成 var dt = this.convertTweetUrlToDatitimeObj( url ); // 年月日 var year = dt.getFullYear(); var month = dt.getMonth() + 1; var date = dt.getDate(); // 0埋めしない // 曜日 var day = this.getYoubiKanjiFromInt( dt.getDay() ); // 時刻 var hour = this.fillZero( dt.getHours(), 2 ); var min = this.fillZero( dt.getMinutes(), 2 ); var sec = this.fillZero( dt.getSeconds(), 2 ); var msec = this.fillZero( Math.floor( dt.getTime() % 1000 ), 3 ); var ret = year + "年" + month + "月" + date + "日(" + day + ") " + hour + "時" + min + "分" + sec + "秒 " + msec + "㍉秒" ; return ret; }, // 「yyyy/mm/dd hh:mm:ii.mmm」形式の日時文字列に変換 convertTweetUrlToDatitimeStrSimpleChars : function( url ){ // URLからDatetimeオブジェクトを生成 var dt = this.convertTweetUrlToDatitimeObj( url ); // 年月日 var year = dt.getFullYear(); var month = dt.getMonth() + 1; var date = dt.getDate(); // 0埋めしない // 曜日 var day = this.getYoubiKanjiFromInt( dt.getDay() ); // 時刻 var hour = this.fillZero( dt.getHours(), 2 ); var min = this.fillZero( dt.getMinutes(), 2 ); var sec = this.fillZero( dt.getSeconds(), 2 ); var msec = this.fillZero( Math.floor( dt.getTime() % 1000 ), 3 ); var ret = year + "/" + month + "/" + date + "(" + day + ") " + hour + ":" + min + ":" + sec + "." + msec + "" ; return ret; }, // JSONに変換 convertTweetUrlToJson : function( url ){ // URLからDatetimeオブジェクトを生成 var dt = this.convertTweetUrlToDatitimeObj( url ); // 年月日 var year = dt.getFullYear(); var month = dt.getMonth() + 1; var date = dt.getDate(); // 0埋めしない // 曜日 var day = this.getYoubiKanjiFromInt( dt.getDay() ); // 時刻 var hour = this.fillZero( dt.getHours(), 2 ); var min = this.fillZero( dt.getMinutes(), 2 ); var sec = this.fillZero( dt.getSeconds(), 2 ); var msec = this.fillZero( Math.floor( dt.getTime() % 1000 ), 3 ); // JSON化 var ret = { year : year, month : month, date : date, day : day, hour : hour, min : min, sec : sec, msec : msec }; return ret; }, // 指定桁数で0埋め fillZero : function( num, digit ){ // 数値を文字にする var s = "" + num; // 指定桁数よりも小さい間はループ while( s.length < digit ){ // 先頭をひとケタ増やす s = "0" + s; } // 文字列として返す return s; } };