web-dev-qa-db-ja.com

ASP.NET MVCでタイムゾーンを実行するにはどうすればよいですか?

私のサイトでは、適切なタイミングでメッセージを表示するために、ユーザーがどのタイムゾーンにいるのかを知る必要があります。これを行う方法のチュートリアルに関して、何を検索すればよいのかよくわかりません。

私が計画しているのは、ユーザーが私のサイトにアクセスすると、ドロップダウンリストからタイムゾーンを選択して設定することです。それらの設定をデータベースに保存し、それを使用して時間を計算します。

何が必要かわかりません。データベースの保存時間はどのくらいにする必要がありますか? UTCとして保存する必要があることをどこかで読みました。これを行うためにデータベースを設定するにはどうすればよいですか?また、私は共有ホスティングサイトにいるので、それを実行できるように設定する必要があります(おそらく、webconfigを使用しますか?)。

次に、HTMLヘルパーまたは通常のHTMLとしてすべてのタイムゾーンのリストが必要になります。本当に作りたくないです。

次に、私が言ったように、私は私に何をすべきかを示すチュートリアルが必要です。その時から足し算と引き算だと思いますが、間違っているかもしれません。

39
chobo2

この目的のために、タイムスタンプをUTCでデータベースに確実に保存する必要があります。

サイトのデータベースから日付を表示する必要がある場合は、次のようにすることができます。

DateTime stamp = /* get datetime from the database here, make sure you
                    use the constructor that allows you to specify the 
                    DateTimeKind as UTC. */

//E.g.
//DateTime stamp = new DateTime(2009, 12, 12, 12, 12, 12, DateTimeKind.Utc);

timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(" /* users time zone here */"); 
var convertedTime = TimeZoneInfo.ConvertTime(stamp, timeZoneInfo);

//Print out the date and time
//Console.WriteLine(convertedTime.ToString("yyyy-MM-dd HH-mm-ss")); 

タイムゾーンのリストはすでに.Netで利用できるので、 それらを列挙する方法に関するこの投稿 を見ることができます。 ASP.Net MVCの場合、タイムアウトを出力する代わりに、変換された日時をモデルクラスのプロパティに割り当てて、ビューがそれを表示に使用できるようにする必要があります。

36
womp

あなたが書いたアプリケーションの保存と処理にUTCを使用することがどれほど重要かを強調することはできません。アプリケーションが単一のタイムゾーンでのみ使用されることがわかっている場合でも、夏時間の問題があるため、ローカルタイムゾーンよりもUTCでの作業がはるかに簡単です。

データベースレベルで行う必要のある特別なことは何もありません。通常の日時列を作成するだけですが、列がUTCであると想定されていることが明確に文書化されていることを確認してください。

正直なところ、asp.netは私の専門知識ではありませんが、クライアントの要求からタイムゾーンを取得できると思います。実際、地域によっては夏時間のルールがかなりあいまいになる可能性があるため、UTCオフセットを計算するJavaスクリプトを使用し、それを使用して変換を行う方がよい場合があります。 2005年エネルギー政策法サーバー側で処理するのがかなり難しいDST規則にはまだいくつかの例外がありますが、クライアントが独自のタイムゾーンを設定できるようにすることを考えていると思いますほとんどの場合、うまく機能します。

9
Brian Gideon

まず、MSDNでDateTimeのドキュメントを確認し、それを読んでください。 ここに記事があります タイムゾーンとUTCをカバーするDateTimeのベストプラクティスについて。

はい、UTCをデータベースに保存する必要があります。 DateTimesをUTCとして保存すると、選択したタイムゾーンに基づいてユーザーとの間で時間を変換できます。あなたは正しい方向に進んでいます!

2
jscharf

使用法

getCurrentDateTimeWithTimeZone("Central Europe Standard Time");

メソッド

public DateTime getCurrentDateTimeWithTimeZone(string strTimeZone)
    {
        var localTimezone = TimeZoneInfo.Local;
        var userTimezone = TimeZoneInfo.FindSystemTimeZoneById(strTimeZone);

        var todayDate = DateTime.Now;
        var todayLocal = new DateTimeOffset(todayDate,
                                            localTimezone.GetUtcOffset(todayDate));

        var todayUserOffset = TimeZoneInfo.ConvertTime(todayLocal, userTimezone);
        return todayUserOffset.DateTime;

    }

タイムゾーンIDのリスト

日付変更線標準時

UTC-11

サモア標準時

ハワイアンスタンダードタイム

アラスカ標準時

太平洋標準時(メキシコ)

太平洋標準時

米国山岳部標準時

山岳部標準時(メキシコ)

山岳部標準時

中部標準時

中部標準時

中部標準時(メキシコ)

カナダ中部標準時

SA太平洋標準時

東部標準時

米国東部標準時

ベネズエラ標準時

パラグアイ標準時間

大西洋標準時

中央ブラジル標準時

SA西部標準時

太平洋SA標準時

ニューファンドランド標準時

E.南アメリカ標準時

アルゼンチン標準時間

SA東部標準時

グリーンランド標準時

モンテビデオ標準時

UTC-02

大西洋標準時中部

アゾレス標準時間

カーボベルデ標準時

モロッコ標準時

UTC

GMT標準時

グリニッジ標準時

W.ヨーロッパ標準時

中央ヨーロッパ標準時

ロマンス標準時

中央ヨーロッパ標準時

W.中央アフリカ標準時

ナミビア標準時

ヨルダン標準時

GTB標準時

中東標準時

エジプト標準時

シリア標準時

南アフリカ標準時

FLE標準時

イスラエル標準時

E.ヨーロッパ標準時

サウジアラビア標準時

アラブ標準時

ロシアの標準時

E.アフリカ標準時

イラン標準時

アラビア標準時

アゼルバイジャン標準時

モーリシャス標準時間

グルジア標準時

コーカサス標準時

アフガニスタン標準時

エカテリンブルク標準時

パキスタン標準時

西アジア標準時

インド標準時

スリランカ標準時

ネパール標準時

中央アジア標準時

バングラデシュ標準時間

N.中央アジア標準時

ミャンマー標準時

東南アジア標準時

北アジア標準時

中国標準時

北アジア東標準時

シンガポール標準時

W.オーストラリア標準時

台北標準時

ウランバートル標準時

東京標準時

韓国標準時

ヤクーツク標準時間

Cen。オーストラリア標準時

オーストラリア中部標準時

E.オーストラリア標準時

オーストラリア東部標準時

西太平洋標準時

タスマニア標準時

ウラジオストク標準時

中央太平洋標準時

ニュージーランド標準時間

UTC + 12

フィジー標準時

カムチャツカ標準時

トンガ標準時

0
B M