2

私がやりたいことは非常に簡単です:

    private static TimeZoneInfo Tzi = // ... custom timeZone I've set;
    public static DateTime ToTimeZone(DateTime dateTime, TimeZoneInfo target)
    {
        return TimeZoneInfo.ConvertTime(dateTime, Tzi, target);
    }

アイデアは-サーバーに来るすべての日付は自動的に特定のタイムゾーンに変換され、そのようにDBに保存されます(UTC、米国中部、米国太平洋など)。

サーバーに設定されたタイムゾーンがTziと同じである限り、これは非常にうまく機能します。ただし、そうでない場合、変換は失敗します。DateTime インスタンスを作成すると、.NET はそれをマシンの TimeZone に設定し、TimeZoneInfo.ConvertTime(dateTime, Tzi, target) は私の要求をファンキーな方法で処理します。たとえば、サーバーのタイムゾーンが太平洋 (UTC -8) で、Tzi を中央 (UTC -6) に設定し、シンガポール (UTC +8) をターゲットにするとします。

TimeZoneInfo.ConvertTime(dateTime, Tzi, target) を呼び出すと、最初に dateTime を UTC -8 から UTC -6 (Tzi タイム ゾーン) に「変換」し、2 時間を追加してから、Tzi からターゲットにします。

TimeZoneInfo.ConvertTime に、送信している dateTime がサーバーの TimeZone ではなく、パラメーターから渡されている TimeZone にあることを通知する方法はありますか?

編集: OK、どちらの回答も素晴らしい推奨事項ですが、私は別の種類の問題を抱えているようです。TimeZoneInfo.ConvertTime(dateTime, Tzi, target) は正しく動作しているようで、実際の原因は次のとおりです。

return Json(new {data}, JsonRequestBehavior.AllowGet);

"Created":"/Date(1346810072950)/" のような日付を出力します。サーバーのTimeZoneによって送信日が異なることを確認しました(サーバーのTimeZone変更後はAppPoolの再起動が必要です)。ASP.NET MVC がクライアントに送り返される JSON で日付を出力する方法に影響を与える方法について、これと提案の経験がある人はいますか?

4

2 に答える 2

3

ConvertTime仕事をするべきです。多分あなたの問題はDateTime.Kind.

次の例を参照してください。

// Gets current local date
// Returns 04/09/12 11:30 in my case
var date = DateTime.Now;

// Sets DateTime as Unspecified kind (not local nor UTC)
// Returns same date as before, but the date is not tagged as "local"
date = DateTime.SpecifyKind(date, DateTimeKind.Unspecified);

// Converts the current date, specified as UTC+12, into a date specified as UTC-11
// Returns 03/09/12 12:30 in my case, which is the expected result
// (23 hours between previous date and result)
var zz = TimeZoneInfo.ConvertTime(
    date,
    TimeZoneInfo.FindSystemTimeZoneById("UTC+12"),
    TimeZoneInfo.FindSystemTimeZoneById("UTC-11"));
于 2012-09-04T09:28:12.427 に答える
2

DateTimeOffset代わりに使用できますDateTime- この構造にはタイムゾーン オフセット プロパティが含まれているため、そのインスタンスを作成するときは、使用するオフセットを指定する必要があります。

于 2012-09-04T09:11:12.177 に答える