こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

javascriptプログラムを日本時間に直す方法

twitterをHTMLサイトに埋め込むために
「Add Twitter to your blog」
というJavaScriptで書かれたものを使用しているのですが、
表示時間が日本時間ではなくアメリカのどこかの時間(?)で表示されてしまいます。

9時間ズレです。

これを修正しようとしたのですが、上手いことできません。

どこを修正すればよいのかご教授願います。


時間に関係していると思われる部分のソースを載せます。

-----ここから-----

function relative_time(time_value) {
var values = time_value.split(" "),
parsed_date = Date.parse(values[1] + " " + values[2] + ", " + values[5] + " " + values[3]),
date = new Date(parsed_date),
relative_to = (arguments.length > 1) ? arguments[1] : new Date(),
delta = parseInt((relative_to.getTime() - parsed_date) / 1000),
r = '';

function formatTime(date) {
var hour = date.getHours(),
min = date.getMinutes() + "",
ampm = 'AM';

if (hour == 0) {
hour = 12;
} else if (hour == 12) {
ampm = 'PM';
} else if (hour > 12) {
hour -= 12;
ampm = 'PM';
}

if (min.length == 1) {
min = '0' + min;
}

return hour + ':' + min + ' ' + ampm;
}

function formatDate(date) {
var ds = date.toDateString().split(/ /),
mon = monthDict[date.getMonth()],
day = date.getDate()+'',
dayi = parseInt(day),
year = date.getFullYear(),
thisyear = (new Date()).getFullYear(),
th = 'th';

// anti-'th' - but don't do the 11th, 12th or 13th
if ((dayi % 10) == 1 && day.substr(0, 1) != '1') {
th = 'st';
} else if ((dayi % 10) == 2 && day.substr(0, 1) != '1') {
th = 'nd';
} else if ((dayi % 10) == 3 && day.substr(0, 1) != '1') {
th = 'rd';
}

if (day.substr(0, 1) == '0') {
day = day.substr(1);
}

return mon + ' ' + day + th + (thisyear != year ? ', ' + year : '');
}

delta = delta + (relative_to.getTimezoneOffset() * 60);

if (delta < 5) {
r = 'less than 5 seconds ago';
} else if (delta < 30) {
r = 'half a minute ago';
} else if (delta < 60) {
r = 'less than a minute ago';
} else if (delta < 120) {
r = '1 minute ago';
} else if (delta < (45*60)) {
r = (parseInt(delta / 60)).toString() + ' minutes ago';
} else if (delta < (2*90*60)) { // 2* because sometimes read 1 hours ago
r = 'about 1 hour ago';
} else if (delta < (24*60*60)) {
r = 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';
} else {
if (delta < (48*60*60)) {
r = formatTime(date) + ' yesterday';
} else {
r = formatTime(date) + ' ' + formatDate(date);
// r = (parseInt(delta / 86400)).toString() + ' days ago';
}
}

-----ここまで-----


以下は、「Add Twitter to your blog」を配布しているサイトです。

http://remysharp.com/2007/05/18/add-twitter-to-your-blog-step-by-step/


よろしくお願いいたします。

投稿日時 - 2010-03-15 11:31:26

QNo.5753294

困ってます

質問者が選んだベストアンサー

たびたびすいません。 有力情報かどうか分かりませんが、こんなの見つけました。

http://creazy.net/2007/06/my_hacks_on_twitter_badges.html
http://creazy.net/2007/06/twitter_javascript_badges_date_format.html
http://creazy.net/2007/04/twitter_javascript_badge.html
http://creazy.net/2007/04/twitter_javascript_badge_ie.html

     

投稿日時 - 2010-03-15 16:47:10

お礼

お世話になっています。

ありがとうございます。


ここに載せていただきました参考URLで解決できました!


さらにハックの話まであったようで・・・汗

ということで、少し書き方を変えました。


本当に何度もありがとうございました!!

投稿日時 - 2010-03-15 20:18:58

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.5

#4の訂正です。

>気になったところすべてに入れてみましたがダメでした。。
気になる点に、一つずつ入れてみてください。

それで駄目なら、JavaScriptを初期に戻し、
return hour + ':' + min + ' ' + ampm;
return mon + ' ' + day + th + (thisyear != year ? ', ' + year : '');
この行を片方づつ削除してみて下さい。

この行が、日付表示行と時間表示行ならば、この行の前に時間(hour)に9を加算させる。
それが上手くいけば、日付(day)をifを使い、hourが25以上になった時に、25-24=1としてdayに+1を加える。
各月によりますが、dayに+1をたす事により32日となた場合は月(mon)の補正を書ける。
などなど複雑ですね。

多分、ただのhtmlに組み込むjavascriptなら、すでに解決していると思うのですが、ブログ用は勝手が違うみたいです。
ただのhtmlに組み込むjavascriptなら、当方以外の回答者様がベスト回答されているのかもしれません。

-----------------------
>twitterをHTMLサイトに埋め込むために
>「Add Twitter to your blog」
>というJavaScriptで書かれたものを使用しているのですが、
これって、ブログ用じゃないhtml用ではどうなのかな??
なんて、浮気心が・・・  m(_ _)m

    

投稿日時 - 2010-03-15 16:16:08

お礼

お世話になっています。

ありがとうございました。

後の解答の参考URLを見て解決できました。

投稿日時 - 2010-03-15 20:14:29

ANo.4

#2・#3さんの情報でふと思ったのですが・・・

delta =
で始まる何処かの行に「+32400」を入れてみる。
9(時間)x60(分)x60(秒)= 32400(秒)です。
getTimezoneOffset()か、getTime()あたりの行・・・

グリニッジ標準時を取得している所に入れれば良いかと・・・

推測ですので、混乱したら無視して下さい。  m(_ _)m

   

投稿日時 - 2010-03-15 13:46:33

補足

お世話になっています。

> delta =
> で始まる何処かの行に「+32400」を入れてみる。
> 9(時間)x60(分)x60(秒)= 32400(秒)です。
> getTimezoneOffset()か、getTime()あたりの行・・・

気になったところすべてに入れてみましたがダメでした。。

投稿日時 - 2010-03-15 15:15:21

ANo.3

<9時間ズレです。>なら、アメリカのどこかの時間でなくて、
わざわざ、グリニッジ標準時に直しているようです。
ソースをざっと見たところ
delta = delta + (relative_to.getTimezoneOffset() * 60);
の部分が、現地時間との差を秒で算出しているところみたいなので、
現地時間との差を0秒となるように。
delta = delta;
と直すだけでは....

投稿日時 - 2010-03-15 13:00:11

補足

早速のご回答ありがとうございます。

> delta = delta;
> と直すだけでは....

仰せのように書きなおしてみましたがダメでした。。

ソースすべてを書きたいのですが、長すぎて投稿することができません。。。

投稿日時 - 2010-03-15 15:12:56

ANo.2

9時間ずれるというのがどっち方向なのかわからないですし、
質問に挙げられたコードだけを見ての判断で、
relative_time の引数がどういう仕様かわからないので、推測になりますが、

時間が9時間短く表示されるのでしたら、

> delta = delta + (relative_to.getTimezoneOffset() * 60);

この行をばっさり削除してみてください。

投稿日時 - 2010-03-15 12:44:15

補足

早速のご回答ありがとうございます。

> > delta = delta + (relative_to.getTimezoneOffset() * 60);
> この行をばっさり削除してみてください。

仰せのように削除しましたが変わりませんでした。。

コードを載せようと試みたのですが、文字数制限に引っ掛かり載せられませんでした。

少し上を載せたいと思います。

// ready and browser adapted from John Resig's jQuery library (http://jquery.com)
function DOMReady() {
if ( document.addEventListener && !browser.webkit ) {
document.addEventListener( "DOMContentLoaded", fireReady, false );
} else if ( browser.msie ) {
// If IE is used, use the excellent hack by Matthias Miller
// http://www.outofhanwell.com/blog/index.php?title=the_window_onload_problem_revisited

// Only works if you document.write() it
document.write("<scr" + "ipt id=__ie_init defer=true src=//:><\/script>");

// Use the defer script hack
var script = document.getElementById("__ie_init");

// script does not exist if jQuery is loaded dynamically
if (script) {
script.onreadystatechange = function() {
if ( this.readyState != "complete" ) return;
this.parentNode.removeChild( this );
fireReady.call();
};
}

// Clear from memory
script = null;

} else if ( browser.webkit ) {
// Continually check to see if the document.readyState is valid
var safariTimer = setInterval(function () {
// loaded and complete are both valid states
if ( document.readyState == "loaded" ||
document.readyState == "complete" ) {

// If either one are found, remove the timer
clearInterval( safariTimer );
safariTimer = null;
// and execute any waiting functions
fireReady.call();
}
}, 10);
}
}

投稿日時 - 2010-03-15 14:51:48

ANo.1

グリニッジ標準時で、表示されている物と思われます。

何処かで誤差の9時間を調整すればいいのですが、、、、
英語は苦手なので(単語は良いけど、文章は・・・)、コメントを入れていらっしゃいます英文を理解できれば、修正方法が分かると思われます。

役に立てずに書き込みしてしまいました。 m(_ _)m

-------------------------
if (hour == 0) {
hour = 12;
} else if (hour == 12) {
ampm = 'PM';
} else if (hour > 12) {
hour -= 12;
ampm = 'PM';
}

間違っているとお思いますが、、、、この行の前に、、、
hour = hour + 9;
if (hour > 24) {
day = day + 1;
}
っと言う感じのものを入れる事で、修正できる感じがします。

     

投稿日時 - 2010-03-15 12:13:46

お礼

早速のご回答ありがとうございます。

仰せの通りに、

・・・
function formatTime(date) {
var hour = date.getHours(),
min = date.getMinutes() + "",
ampm = 'AM';

hour = hour + 9;
if (hour > 24) {
day = day + 1;
}

if (hour == 0) {
hour = 12;
} else if (hour == 12) {
ampm = 'PM';
} else if (hour > 12) {
・・・

としてみたのですが、24時間以前のツイートがあった場合に呼び出さなくなってしまいました。。

この辺の数字には「+9」を書いたんですが、全く歯が立たずでした・・・

getHours()+9が一番惜しかった(気がするだけ?)のですが、
12時間の計算がおかしなことになりダメでした。。

投稿日時 - 2010-03-15 12:51:30

あなたにオススメの質問