30

UTC日付文字列をに変換する必要がありますDateTimeOffsets

これは、コンピューターのタイムゾーンとは異なるタイムゾーンで機能する必要があります。 たとえば、現在のコンピュータのタイムゾーンは+02:00ですが、オフセットが-4:00のDateTimeOffsetを作成したいと思います。

私はすでにstackoverflowに関する多くの質問を読んでいますが、どれも私の問題を解決しませんでした。

それは私がする必要があることです:

入力:「2012-11-20T00:00:00Z」

出力: DateTimeOffset:

  • 2012-11-2000 :00のUtcDateTime
  • 定義されたタイムゾーンの正しいUTCオフセット(この例では01:00)
  • LocalDateTime:2012-11-20 01:00 (= UtcDateTime +オフセット)

もちろん、夏時間を考慮に入れる必要があります。

編集:物事をさらに明確にするために、次のコードスニペットを完成させてみてください。

DateTimeOffset result;
const string dateString = "2012-11-20T00:00:00Z";
var timezone = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time"); //this timezone has an offset of +01:00:00 on this date

//do conversion here

Assert.AreEqual(result.Offset, new TimeSpan(1, 0, 0));  //the correct utc offset, in this case +01:00:00
Assert.AreEqual(result.UtcDateTime, new DateTime(2012, 11, 20, 0, 0, 0)); //equals the original date
Assert.AreEqual(result.LocalDateTime, new DateTime(2012, 11, 20, 1, 0, 0));
4

3 に答える 3

18

これがあなたが探している解決策です:

const string dateString = "2012-11-20T00:00:00Z";
TimeZoneInfo timezone = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time"); //this timezone has an offset of +01:00:00 on this date

DateTimeOffset utc = DateTimeOffset.Parse(dateString);
DateTimeOffset result = TimeZoneInfo.ConvertTime(utc, timezone);
        
Assert.AreEqual(result.Offset, new TimeSpan(1, 0, 0));  //the correct utc offset, in this case +01:00:00
Assert.AreEqual(result.UtcDateTime, new DateTime(2012, 11, 20, 0, 0, 0)); //equals the original date
Assert.AreEqual(result.DateTime, new DateTime(2012, 11, 20, 1, 0, 0));

.LocalDateTimeプロパティを誤ってテストしていたことに注意してください。これにより、常に結果がコンピューターのローカルタイムゾーンに変換されます。.DateTime代わりにプロパティが必要です。

于 2013-01-14T16:45:58.357 に答える
6

これは、あなたの望むことですか:

[Test]
public void ParseUtcDateTimeTest()
{
    DateTime dateTime = DateTime.Parse("2012-11-20T00:00:00Z");
    Assert.AreEqual(new DateTime(2012, 11, 20, 01, 00, 00), dateTime);
    DateTimeOffset dateTimeOffset = new DateTimeOffset(dateTime);
    Assert.AreEqual(new TimeSpan(0, 1, 0, 0), dateTimeOffset.Offset);
}
  • 私の主張はスウェーデン(CET)で有効であることに注意してください
  • にいくつかの過負荷がありますDateTime.Parse()

これは変換に役立ちますか?

[Test]
public void ConvertTimeTest()
{
    DateTime dateTime = DateTime.Parse("2012-11-20T00:00:00Z");
    TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard     Time");
    DateTime convertedTime = TimeZoneInfo.ConvertTime(dateTime, cstZone);
    Assert.AreEqual(new DateTime(2012, 11, 19, 18, 00, 00), convertedTime);
    TimeSpan baseUtcOffset = cstZone.BaseUtcOffset;
    Assert.AreEqual(new TimeSpan(0, -6, 0, 0), baseUtcOffset);
}
于 2012-12-18T13:34:28.140 に答える
-1
const String dateString = "2012-11-20T00:00:00Z"; 
var offsetDate = DateTimeOffset.Parse(dateString); 
var offsetDate2 = DateTime.Parse(dateString);

出力は

offsetDate  {20-11-2012 0:00:00 +00:00}    System.DateTimeOffset
offsetDate2 {20-11-2012 1:00:00}           System.DateTime
于 2012-12-18T13:41:09.553 に答える