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

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

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

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

JavaScript

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

ASP.NET MVC Framework

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

Q&A

解決済

4回答

8377閲覧

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

clubman

総合スコア63

C#

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

JavaScript

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

ASP.NET MVC Framework

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

1グッド

0クリップ

投稿2017/03/01 05:50

編集2017/03/01 06:44

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

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

C#

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

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

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

dotnetuseryamag👍を押しています

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

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

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

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

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

guest

回答4

0

ベストアンサー

サーバから日付出力

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

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

ISO 8601

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

JavaScript

1/** 2 * 日本日時 3 */ 4console.log(new Date('2017-03-01T16:00:00+09:00').toString()); // Wed Mar 01 2017 16:00:00 GMT+0900 (東京 (標準時)) 5 6/** 7 * 中国日時 8 */ 9console.log(new Date('2017-03-01T15:00:00+08:00').toString()); // Wed Mar 01 2017 16:00:00 GMT+0900 (東京 (標準時)) 10 11/** 12 * 世界標準日時 13 */ 14console.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時間」として扱うからです。

JavaScript

1/** 2 * 日本日時 3 */ 4console.log(new Date('2017-03-01T16:00:00+09:00').getTime()); // 1488351600000 5 6/** 7 * 中国日時 8 */ 9console.log(new Date('2017-03-01T15:00:00+08:00').getTime()); // 1488351600000 10 11/** 12 * 世界標準日時 13 */ 14console.log(new Date('2017-03-01T07:00:00Z').getTime()); // 1488351600000

Date.UTC()

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

JavaScript

1console.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/01 07:06

編集2017/03/02 13:38
think49

総合スコア18162

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

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

clubman

2017/03/03 01:44

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

0

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

JavaScript

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

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

投稿2017/03/01 06:31

coco_bauer

総合スコア6915

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

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

think49

2017/03/02 13:59

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

2017/03/03 05:36

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

0

「クライアントは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/01 06:19

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

clubman

2017/03/01 07:05

SurferOnWwwさま、ご回答ありがとうございます。 はい、サーバー側はASP.Net MVC5を採用しています。 やりたいこととしてはタイムスタンプ的なことになります。クライアントの時刻をそのまま使ってしまうと時間がズレていたり意図的に変えられてしまうためサーバーの時刻を使いたいのです。そしてサーバーは海外にあるかもしれないのでクライアントのロケールを使ってサーバーの時刻をクライアントのロケール時刻に変換したいというシナリオになります。 ご紹介くださったページですとクライアントの時刻をそのまま出力しているだけに思えますので要件を満たすことができなさそうです。 よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2017/03/01 07:39 編集

JavaScript でロケール / カルチャが取得できるかどうかわかりませんが(個人的にはできないと思いますが、自分が知らないだけという可能性を否定しきれませんので、そこはちょっと置いといて)、たとえ取得できたとしてそれから現地時間が取得できるのでしょうか? たとえば、en-US であることが分かったとして、時差(米国は東海岸と西海岸で 3 時間時差があります)とか夏時間とかはどう対応できるのでしょうか? 米国で日本語 OS の PC を使っていたらどうなるのでしょうか? Culture はプログラムで任意に書き換えられるのですが、そこのところはどう考えていますか?
clubman

2017/03/02 01:14 編集

ロケールが取得できても(そもそもJsでは取得できないようですが)JavaScriptでは現地時間は取得できないと思います。 夏時間とかはどう対応できるかについてはC#ですとTimeZoneInfo.CreateCustomTimeZone()を使えるのなら対応できるとしか答えられません。 Culture は「プログラム」で書き換えられることは無視でよいです。そこまでされたらどんなプログラムでも同じだと思います。
退会済みユーザー

退会済みユーザー

2017/03/02 01:55

> JavaScriptでは現地時間は取得できないと思います。 質問者さんの言う「現地時間」というのが何だか分かりませんが、ブラウザを動かしている PC の時間(Windows や Android の場合「日付と時刻」に設定された日時)なら JavaScript で取得できます。 上の回答で紹介した記事の下の方に「実験室」と書いたリンク先がありますが、そこで実際に試すことができますのでやってみてください。 さらに、coco_bauer さんの回答によると UTC も取得できるそうです。それで十分ではないかと思いますが。 どうしても ja-JP とか en-US などのカルチャ情報がほしければ、ブラウザからの要求ヘッダに含まれる Accept-Language を見るという手はあるかもしれません。でも、国内に時差のない国ならともかく、前のコメントに書きましたように、en-US では取得しても意味はなさそうですよ。
clubman

2017/03/02 05:05

「現地時間」というのは上記のコメントでSurferOnWwwさまがおっしゃったことなのですが、、 それはさておきやりたいことは「サーバーの時刻」を「クライアントのロケールの時刻」に変換したいのです。ブラウザを動かしている PC の時間を取得したいわけではありません。 意図が伝わりづらかったようなら申し訳ございません。
退会済みユーザー

退会済みユーザー

2017/03/02 07:58

> やりたいことは「サーバーの時刻」を「クライアントのロケールの時刻」に変換 「クライアントのロケールの時刻」というのが意味不明です。「ブラウザを動かしている PC の時間」ではないということですが、では一体何なのでしょう? 質問者さんの前のコメントで、 > クライアントの時刻をそのまま使ってしまうと時間がズレていたり意図的に変えられてしまう という懸念がありましたが、そういうことがなければ「ブラウザを動かしている PC の時間」=「クライアントのロケールの時刻」でいいのですかね? であれば、JavaScript で取得する UTC とサーバーで取得する UTC を比較してズレがなければその懸念はないということで、「ブラウザを動かしている PC の時間」を使えばいいのでは? ズレていたらお手上げになるかもしれませんが、質問者さんの言う「クライアントのロケールの時刻」は取得できそうもありませんし、他に方法はないと思います。
ikedas

2017/03/02 08:48

「ロケール」にあたるものとしては時間帯の設定があるでしょうが、たとえ時間帯の設定がわかったとしても、それに基づく時刻を計算するのは大変だと思います。 そんなことをしなくても、クライアントでのUTCとローカルタイムの差を取得することでUTCからの時差を求め、サーバの時刻を基準にローカルタイムを計算してやるという方法 (coco_bauerさんがおっしゃっている方法) で充分ではないかと思います。
退会済みユーザー

退会済みユーザー

2017/03/02 10:00

ikedas さん> 誰のどの部分に対するコメントですか?
think49

2017/03/02 11:27 編集

日本語ロケールで Date#toString() すると日本時間になる事から誤解が生まれた気がしますが、JavaScript はロケールを扱えます。 内部的にUTC時間(1970/01/01からのミリ秒)に変換されたプリミティブ値を持っています。 それが中国時間であってもアメリカ時間であっても ISO 8601 形式で入力すれば、UTC時間としての正しい値を持ちます。 new Date(yyyy, mm, dd) で日本時刻として扱われてしまうのは new Date がブラウザのロケールに合わせた値として認識してしまうからです。 サーバから生のデータをJavaScriptに入力したいのなら ISO 8601 が選択肢になると思います。
ikedas

2017/03/02 11:08

> SurferOnWwwさん 質問者さんの発言へのコメントです。
退会済みユーザー

退会済みユーザー

2017/03/02 13:25 編集

ikedas さん> であれば、私の回答のコメントではなく ikedas さんご自身の回答として別に書いていただくというわけにはいきませんか?
退会済みユーザー

退会済みユーザー

2017/03/02 13:26

think49 さん> 誰のどの部分に対するコメントですか?
think49

2017/03/02 14:25

To: SurferOnWww さん SurferOnWww さん、ikedas さんは共に時差の計算はいろいろと小難しい計算をしなければならない、というニュアンスの意見のように読めましたが、それほど大変ではないと指摘しました。 new Date('2017-03-01T15:00:00+08:00').toString(); // "Wed Mar 01 2017 16:00:00 GMT+0900 (東京 (標準時))" (クライアント側のロケールで出力) それと、質問者の要件である「サーバの時刻を使用する要件」に否定的のようですが、そこを否定してしまうと質問に対する回答としては適切ではないようにも思っています。 例えば、掲示板の記事の投稿日時など、クライアント側の現在時刻を使う事が意図されていない可能性も考えられます。 通常の掲示板ではサーバが出力した日付フォーマットをそのまま出力するだけですが、クライアントのロケール時刻の自動的に変換されるならそれはそれで面白いのではないかと思います。
退会済みユーザー

退会済みユーザー

2017/03/02 14:38

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

退会済みユーザー

2017/03/02 14:47

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

2017/03/02 14:58

think49さんのコメントで得心しました (たぶん)。Dateでは時刻が内部的にUTCで正規化されており、UTCを与えても地方時の時刻情報を得ることができる、ということですね。私が求めていたのはそれでした (「まず時差を得て…」とか考える必要はなく、クライアントではUTCを与えられればダイレクトに地方時を得られる、ということと理解しました)。 なお、時刻のロケールと時間帯の設定は別のものなので、JavaScriptの仕様としてどう折り合いをつけているのかは気になりました。そのうち調べてみようと思います。
guest

0

こんにちは。

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

投稿2017/03/02 02:30

tamoto

総合スコア4105

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

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

clubman

2017/03/02 04:51

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

2017/03/02 04:58

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

2017/03/02 05:10

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問