5

変換時刻をユーザーのタイム ゾーンに変換しようとしていますが、「太平洋標準時」などの Windows タイム ゾーン文字列がありません。私が持っているのは、「-07:00」などの文字列オフセットだけです。タイムスパンを作成する必要があるようです。この文字列を手動で解析する唯一の方法はありますか? 文字列オフセットを使用して時間を変換する方法があるはずですが、何かが足りないのかもしれません。

私はこれを持っていますが、タイムゾーンが必要です。代わりにオフセットを使用するように変更しようとしていますが、変換用に作成されたタイムスパンを確認でき、タイムスパンへのオフセットを取得する必要があります。

static void Main(string[] args)
{
    var currentTimeInPacificTime = ConvertUtcTimeToTimeZone(DateTime.UtcNow, "Pacific Standard Time");
    //TimeSpan ts = new TimeSpan("-07:00");
    Console.ReadKey();
}

static DateTimeOffset ConvertUtcTimeToTimeZone(DateTime dateTime, string toTimeZoneDesc)
{
    if (dateTime.Kind != DateTimeKind.Utc) throw new Exception("dateTime needs to have Kind property set to Utc");
    TimeSpan toUtcOffset = TimeZoneInfo.FindSystemTimeZoneById(toTimeZoneDesc).GetUtcOffset(dateTime);
    var convertedTime = DateTime.SpecifyKind(dateTime.Add(toUtcOffset), DateTimeKind.Unspecified);
    return new DateTimeOffset(convertedTime, toUtcOffset);
}
4

4 に答える 4

6

メソッドを使用できますTimeSpan.Parse

TimeSpan ts = TimeSpan.Parse("-07:00");
Console.WriteLine(ts);   // -07:00:00

TimeSpan.Parse がここで失敗するため、先頭の「+」を削除するように注意してください。「+01:00」は正しくありませんが、「01:00」は機能します。

または、もう少し安全にしたい場合は、次のTimeSpan.TryParse方法を試してください。

TimeSpan ts;
if (TimeSpan.TryParse("-07:00", out ts))
    Console.WriteLine(ts);   // -07:00:00

ただし、もちろん、UTC 日付/時刻をローカル日付/時刻に変換するだけの場合は、次のようにするだけです。

DateTime localDateTime = utcDateTime.ToLocalTime();

または、任意のタイムゾーンに変換するには:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(toTimeZoneDesc);
DateTime localDateTime = TimeZoneInfo.ConvertTime(utcDateTime, tzi);
于 2013-08-17T20:03:01.700 に答える
1

より複雑な/非標準の形式については、 を使用することもできますTimeSpan.ParseExact(String, String, IFormatProvider)。ここで、2 番目の String はCustom TimeSpan Format Stringです。

API 情報は msdn.microsoft.com で入手でき、上にリンクされています。

于 2013-08-17T20:10:52.290 に答える
1

変換時刻をユーザーのタイム ゾーンに変換しようとしていますが、「太平洋標準時」などの Windows タイム ゾーン文字列がありません。私が持っているのは、「-07:00」などの文字列オフセットだけです。

次に、正しい変換を行うために必要なものがありません。timezone tag wikiの「Time Zone != Offset」を読んでください。

"Pacific Standard Time"この値は、米国太平洋時間に使用されるオブジェクトの であること.Idを理解することが重要です。太平洋標準時 (UTC-8) と太平洋夏時間 (UTC-7) の両方TimeZoneInfoをカバーしています。

私が持っているのは、「-07:00」などの文字列オフセットだけです。タイムスパンを作成する必要があるようです。

これで、一般に XY 問題と呼ばれるものができました。オフセット自体を操作する必要はありません。

あなたのコードには、への呼び出しがありますdateTime.Add(toUtcOffset)。タイム ゾーンの変換を行う場合、これは間違っているというコードのにおいです。タイムゾーンを操作するためだけに時間を手動で追加または削除する必要はありません。これは、話している瞬間を実際に変更するために予約する必要があります。

すべきことは、ユーザーからリアルタイム ゾーン ID を収集することです。"Pacific Standard Time"で使用するかTimeZoneInfo、またはNoda Time"America/Los_Angeles"のような TZDB 実装で使用します。

コンテキストでタイム ゾーンの変換が重要でない場合は、代わりにDateTimeOffsetなどの完全な値を収集することをお勧めし2013-08-17T13:27:00.000-07:00ます。

于 2013-08-17T20:19:26.000 に答える
-1

「太平洋標準時」を含むタイムゾーン文字列があります。完全なリストはここにあります。http://www.xiirus.net/articles/article-_net-convert-datetime-from-one-timezone-to-another-7e44y.aspx

任意の DateTime オブジェクトをタイムゾーンに変換できます -

    TimeZoneInfo timeZoneInfo; 
    DateTime dateTime ; 

    //Set the time zone information to Pacific Standard Time
    timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); 
    //Get date and time in US Mountain Standard Time 
    dateTime = TimeZoneInfo.ConvertTime(DateTime.Now, timeZoneInfo);
    //Print out the date and time
    Console.WriteLine(dateTime.ToString("yyyy-MM-dd HH-mm-ss")); 

したがって、メソッドは次のように変更できます-

static DateTimeOffset ConvertUtcTimeToTimeZone(DateTime dateTime, string toTimeZoneDesc)
{
   return new DateTimeOffset(TimeZoneInfo.ConvertTime(dateTime, TimeZoneInfo.FindSystemTimeZoneById(toTimeZoneDesc)));
}
于 2013-08-17T20:10:07.350 に答える