クライアントは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#の環境で実現したいのですが、、
なにか妙案があればご助言頂けませんでしょうか。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア18162
0
Javascriptでは、dateのgetUTCHours()とgetHours()の差を求める事で、ローカルタイム(クライアントのロケールでの時間)と世界標準時の時差を求める事ができます。
JavaScript
1 var currentTime = new Date(); 2 jisa = ( currentTime.getHours() - currentTime.getUTCHours() + 24 ) % 24; // 世界標準時との時差を計算
時間の表示に使うのであれば、世界標準時との時差が判れば十分なのではないでしょうか。
投稿2017/03/01 06:31
総合スコア6915
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/03 05:36
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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/01 07:05
退会済みユーザー
2017/03/01 07:39 編集
2017/03/02 01:14 編集
退会済みユーザー
2017/03/02 01:55
2017/03/02 05:05
退会済みユーザー
2017/03/02 07:58
2017/03/02 08:48
退会済みユーザー
2017/03/02 10:00
2017/03/02 11:27 編集
2017/03/02 11:08
退会済みユーザー
2017/03/02 13:25 編集
退会済みユーザー
2017/03/02 13:26
2017/03/02 14:25
退会済みユーザー
2017/03/02 14:38
退会済みユーザー
2017/03/02 14:47
2017/03/02 14:58
0
こんにちは。
タイムスタンプであれば、サーバからクライアントまで、データ上は全てUTCで取り扱うというのはどうでしょう?
記録するときはサーバ上でUTC時刻を生成すれば、クライアントとの時差やサーバの設置場所による影響などは一切ないです。
そして、クライアント上で時刻を表示したいときに、生データのUTC時刻をクライアント上で自ロケール表現に変換すればいいのではないでしょうか。
投稿2017/03/02 02:30
総合スコア4105
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/02 04:51
2017/03/02 04:58
2017/03/02 05:10
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/03 01:44