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

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

ただいまの
回答率

90.38%

  • JavaScript

    21509questions

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

  • C#

    9473questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • ASP.NET MVC Framework

    107questions

    ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

サーバー時刻をクライアントのタイムゾーンの時刻に変換したい

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,143

clubman

score 46

クライアントはJavaScriptサーバーサイドはC#で開発をしています。

C#のみで表題の処理をしたい場合はクライアントのコードは以下でいけたのですが、JavaScriptですとクライアントのロケールが取得できないため困っています。

DateTime serverDateTime = new DateTime(2017, 3, 1, 12, 30, 0);
TimeZoneInfo serverTimeZone = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time");
DateTime date = TimeZoneInfo.ConvertTime(serverDateTime, serverTimeZone, TimeZoneInfo.Local);

例えばサーバーのロケールが中国。時刻が「2017/03/01 12:30」で、クライアントのロケールが日本の場合、日本のと中国の時差は1時間なのでdate変数には「2017/03/01 13:30」が取得できます。
この結果をクライアントはJs、サーバーはC#の環境で実現したいのですが、、

なにか妙案があればご助言頂けませんでしょうか。
よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+3

 サーバから日付出力

まず、サーバから日付出力する場合に次のどちらのフォーマットにしてください。

  • タイムゾーン付きの日付フォーマット
  • UTC日時(世界標準日時)の日付フォーマット

 ISO 8601

サーバから ISO 8601 形式の日付文字列を出力できれば、時差なく JavaScript で処理できます。

/**
 * 日本日時
 */
console.log(new Date('2017-03-01T16:00:00+09:00').toString());  // Wed Mar 01 2017 16:00:00 GMT+0900 (東京 (標準時))

/**
 * 中国日時
 */
console.log(new Date('2017-03-01T15:00:00+08:00').toString());  // Wed Mar 01 2017 16:00:00 GMT+0900 (東京 (標準時))

/**
 * 世界標準日時
 */
console.log(new Date('2017-03-01T07:00:00Z').toString());  // Wed Mar 01 2017 16:00:00 GMT+0900 (東京 (標準時))

なぜなら、JavaScript の Date オブジェクトは内部的に「1970/01/01 0:00からのUTC時間」として扱うからです。

/**
 * 日本日時
 */
console.log(new Date('2017-03-01T16:00:00+09:00').getTime());  // 1488351600000

/**
 * 中国日時
 */
console.log(new Date('2017-03-01T15:00:00+08:00').getTime());  // 1488351600000

/**
 * 世界標準日時
 */
console.log(new Date('2017-03-01T07:00:00Z').getTime());       // 1488351600000

 Date.UTC()

UTC日時が得られれば、Date.UTC() を使用する方法もあります。

console.log(new Date(Date.UTC(2017, 3, 1, 7, 0, 0, 0)).toString()); // Sat Apr 01 2017 16:00:00 GMT+0900 (東京 (標準時))

Re: clubman さん

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/03 10:44

    think49さま、丁寧な解説ありがとうございます。
    UTC日時を使う方がやりやすそうなのでそちらでアプローチしてみたいと思います。
    ありがとうございました!

    キャンセル

+3

Javascriptでは、dateのgetUTCHours()とgetHours()の差を求める事で、ローカルタイム(クライアントのロケールでの時間)と世界標準時の時差を求める事ができます。

 var currentTime = new Date();
  jisa = ( currentTime.getHours() - currentTime.getUTCHours() + 24 ) % 24; // 世界標準時との時差を計算

時間の表示に使うのであれば、世界標準時との時差が判れば十分なのではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/02 22:59

    一応、new Date().toTimeString() でタイムゾーン付きの書式が得られます。
    ところで、クライアント側の時差を参照する理由は時差を計算した上で new Date() に日本時間を入力する事にあるのでしょうか。
    例えば、サーバの中国時間からクライアントの日本時間に変換する事を考えた場合、中国時間と日本時間の時差を計算して new Date に日本時間を入力するよりも UTC 時間で入力する方が手間がない気がしたので、ちょっと気になりました。

    キャンセル

  • 2017/03/03 14:36

    「ロケールが中国のサーバから時刻を取得し、サーバとクライアントの時差を考慮して、サーバから取得した時間をクライアントのロケールの時間に変換したい (TimeZoneInfo.ConvertTime)」が質問者が求めるものだと解釈したので、上記のような回答になりました。 中国の標準時とサーバの時刻が一致しているのなら、UTC時間あるいはJSTを使えば良いと思いますが、中国のサーバから取得した時刻を使うコードになっているのは、そうしなければならない事情があるのかと考えました。

    キャンセル

+1

「クライアントはJavaScriptサーバーサイドはC#で開発」ということは ASP.NET Web アプリでしょうか? (であれば、ASP.NET のタグもつけていただければ)

サーバーとクライアントの PC の時間の整合を取るということが目的なのですか?

そうであれば、JavaScript でクライアント PC の時刻を取得して、何らかの手段(PostBack するなり Ajax を使うなりして)でサーバーにその情報を送って、サーバー側で時間差を調べて整合を取るというようなことが可能と思いますが。

クライアント側の現地時刻取得
http://surferonwww.info/BlogEngine/post/2010/10/06/How-to-obtain-local-time-of-client-side.aspx

そういう話ではないということでしたら、何を作っているのか(ASP.NET web アプリ? その他?)、全体的なシナリオを含めてやりたいことは何かを書いていただけませんか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/02 23:38

    think49 さん>
    話が噛み合ってないような気がします。質問者さんのやりたいことが分かっていますか? 私は分からないのですが。

    キャンセル

  • 2017/03/02 23:47

    think49 さん>
    あ、そういうことを聞く前に、「誰のどの部分に対するコメントですか?」に答えていただきたいとお願いするのが先でした。

    キャンセル

  • 2017/03/02 23:58

    think49さんのコメントで得心しました (たぶん)。Dateでは時刻が内部的にUTCで正規化されており、UTCを与えても地方時の時刻情報を得ることができる、ということですね。私が求めていたのはそれでした (「まず時差を得て…」とか考える必要はなく、クライアントではUTCを与えられればダイレクトに地方時を得られる、ということと理解しました)。

    なお、時刻のロケールと時間帯の設定は別のものなので、JavaScriptの仕様としてどう折り合いをつけているのかは気になりました。そのうち調べてみようと思います。

    キャンセル

0

こんにちは。

タイムスタンプであれば、サーバからクライアントまで、データ上は全てUTCで取り扱うというのはどうでしょう?
記録するときはサーバ上でUTC時刻を生成すれば、クライアントとの時差やサーバの設置場所による影響などは一切ないです。
そして、クライアント上で時刻を表示したいときに、生データのUTC時刻をクライアント上で自ロケール表現に変換すればいいのではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/02 13:51

    tamotoさま、ご回答ありがとうございます。

    はい、全ての時刻をUTCで扱うというのはその通りだと思います。
    ですが、「生データのUTC時刻をクライアント上で自ロケール表現に変換」というところがポイントでして、JavaScriptではロケール情報が取得できないため「自ロケール表現に変換」ということができないのかなと思い行き詰まっています。

    キャンセル

  • 2017/03/02 13:58

    javascriptには余り詳しくなくて申し訳ないですが、質問の通りの「ロケール情報を取得しサーバに送る」という情報は見つかりませんでしたが、「javascript上でUTCの時刻データをローカル時刻に変換する」というtipsなら調べるといくつか引っかかりました。タイムスタンプの用途であれば、こちらで対応できないものでしょうか?

    キャンセル

  • 2017/03/02 14:10

    ありがとうございます。
    やりたいこととしてはまさにその通りです。
    調査してみたいと思います!

    キャンセル

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

  • ただいまの回答率 90.38%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • JavaScript

    21509questions

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

  • C#

    9473questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • ASP.NET MVC Framework

    107questions

    ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。