JavaScriptで,TwitterのツイートURLを日時に変換し,つぶやき投稿時刻を算出するライブラリ

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;
	}

};