質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

719閲覧

setIntervalメソッドで現在時刻を更新し続ける件について

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2017/07/13 23:59

ブラウザー上で現在時刻を2017-01-01 12:00:15みたいに秒まで表示し、setIntervalメソッドでその時刻表示を更新し続けたいです。

クライアント側の時刻を起点にしてしまうとクライアントのマシーンに設定されてる時刻が起点になってしまうので、最初はサーバー側で設定される時刻を取得して、その時刻を起点に現在時刻を更新して行こうと考えています。

そこで懸念点なのですが、setIntervalってどのくらい正確なものなのでしょうか?

1日、現在時刻の更新タイマーを放置していたとしても、ちゃんと秒まで誤差なく、現在時刻を更新してくれるものなのでしょうか?

誤差が生まれてしまう場合は、定期的にクライアント側からサーバー側の時刻を取得してあげるか、サーバー側からクライアント側にウェブソケットで現在時刻を送ってあげたりなどの対策でokでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

setIntervalの精度もそうですが、サーバー時間を参照するということは
httpでよみこむ時間差が発生するので、コンマ秒単位の正確さは
保証は難しいようです。

タイマーの間隔を気にするのであれば、
最初にサーバー時間とユーザー時計の差をとっておいて、
つねにユーザー時計との差を利用して時間を表示する考え方もあります
ただし差を計算する間に時間がすぎていますので、結局微妙な
誤差は吸収しきれませんが1秒単位でずれることはないでしょう。

ただしその方式だとユーザーが時計をいじってしまったり
タイムサーバーとの同期で調整がはいってしまうと根拠がくずれますので
適当なタイミングで同期をとるなど運用でカバーが必要です

投稿2017/07/14 00:30

yambejp

総合スコア114814

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/07/14 02:10

御回答ありがとうございます。 時刻表示機能は簡単そうで、やはり、一癖あるのですね。確認できて良かったです!ありがとうございました!
guest

0

setIntervalの精度は信頼できないので、時刻表示と時刻取得を非同期に動かすなどが考えられます。

エラー処理とか誤差とか考えられてないです。
誤差についてはローカルと比較する、複数サーバから取得して平均するなど考えられます。

javascript

1var Time; 2var LoopTimer; 3var GetTimer; 4function start() 5{ 6 LoopTimer = setInterval("printtime()", 100); 7 gettime(); 8} 9function gettime() 10{ 11 // サーバから時刻取得 12 13 // タイムアウト 14 GetTimer = setInterval("timeout()", 1000); 15} 16// レスポンス受信処理 17function getresponse() { 18 // タイマークリア 19 clearInterval(GetTimer); 20 // 取得した時刻を変数に格納 21 Time = responseText; 22 // 再度取得 23 gettime(); 24} 25// タイムアウト処理 26function timeout() { 27 // タイマークリア 28 clearInterval(GetTimer); 29 // サーバ切断 abort(); 30 31 // 再度取得 32 gettime(); 33} 34// 時刻表示 35function printtime() { 36 // 表示置き換え 37 38}

投稿2017/07/14 01:22

shoko1

総合スコア372

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/07/14 02:11

御回答ありがとうございます。 確かにエラー処理も実装必要ですね。いろいろやらないといけないのですね!ありがとうございました!
退会済みユーザー

退会済みユーザー

2017/07/14 02:11

御回答ありがとうございます。確かにエラー処理も実装必要ですね。いろいろやらないといけないのですね!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問