1

日時をデータベースに保存するときに時間を世界時に変換し、データベースから取得するときにシステム時間に変換したいと考えています。

関数ConvertToLocalTime()ConvertToUniversalTime( )を作成することで、どちらも完全に成功しました。

現地時間に変換するコードを以下に示します。

    public void ConvertToLocalTime()
    {
        string szTimezoneinfoid = TimeZoneInfo.Local.Id.ToString();
        TimeZoneInfo tzInfo = TimeZoneInfo.FindSystemTimeZoneById(szTimezoneinfoid);

        this.m_dtCreatedDate = TimeZoneInfo.ConvertTimeFromUtc(m_dtCreatedDate, tzInfo);
    }

関数Shipment.ConvertToLocalTime()を呼び出すと、出荷作成日が正常に機能するまで現地時間に変更されます。

ここで、 Shipment.ConvertToLocalTime()をもう一度呼び出すと、現地時間が再び UTC と見なされ、現地時間に変換されます。

すでに現地時間になっている場合、現地時間への変換をブロックする方法はありますか?

日時のタイムゾーンを取得する方法はありますか?

4

2 に答える 2

2

タイムゾーン自体が UTC でない限り、の結果は のTimeZoneInfo.ConvertTimeFromUtcです。DateTimeKindUnspecified

その結果を に渡すと、それが UTC であることを理解TimeZoneInfo.ConvertTimeFromUtcしていると想定されます。DateTimeConvertTimeFromUtc

基本的に、あまりにも多くの異なるものを表現しようとするDateTime.Kind問題を回避しようとするハックです。DateTimeあなたの方法は、あいまいな可能性のあるデータから始まり、あいまいなデータで終わります...これはうまくいきません。

自分が何をしているのかを常に把握し、独自の結果でメソッドを呼び出さないようにするか、別の .NET 日付/時刻 API であるNoda Timeの使用を検討することができます。さまざまな種類のデータを表すデータ型。

于 2012-10-02T10:32:04.807 に答える
1

あなたの例で何が間違っているのか正確にはわかりませんが、データベースから UTC であることがわかっている日付/時刻を取得し、それを現地時間に変換するだけの場合は、次のことができます。

var dbTime = //whatever, from database.
var utcTime = DateTime.SpecifyKind(dbTime, DateTimeKind.Utc);
var localTime = utcTime.ToLocalTime();

私自身のプロジェクトでdbTime.Kind != DateTimeKind.Localは、データ リーダーが変換の実行を開始することを決定した場合に備えて、最初に確認します。

于 2012-10-02T10:32:48.750 に答える