将UTC DateTime转换为DateTimeOffset

Fab*_*ian 24 .net c# datetime datetimeoffset

我需要将UTC日期字符串转换为DateTimeOffsets.

这必须使用与计算机时区不同的时区. 例如,当前计算机时区是+02:00,但我想创建一个偏移-4:00的DateTimeOffset.

我已经在stackoverflow上阅读了很多问题,但没有一个能解决我的问题.

这就是我需要做的事情:

输入: "2012-11-20T00:00:00Z"

输出: DateTimeOffset:

  • UtcDateTime 2012-11-20 00:00
  • 定义的时区的正确Utc偏移量(本例中为01:00)
  • LocalDateTime:2012-11-20 01:00 (= UtcDateTime + Offset)

当然,必须考虑夏令时.

编辑:为了使事情更清楚,请尝试完成以下代码段:

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));
Run Code Online (Sandbox Code Playgroud)

Mat*_*int 13

这是您正在寻找的解决方案:

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

var utc = DateTimeOffset.Parse(dateString);
var 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));
Run Code Online (Sandbox Code Playgroud)

请注意,您错误地测试了该.LocalDateTime属性 - 它总是将结果转换为计算机的本地时区.你只需要这个.DateTime属性.

  • 即使问题是关于类型的,你仍然使用“var”——太棒了。 (2认同)
  • @BojidarStanchev - `var` 没有任何问题,但我同意显式键入的示例更清晰。我相应地编辑了答案。请记住原始答案是 8 年前发布的。此外,您始终可以提出修改而不是抱怨。 (2认同)
  • 抱怨同样有效,而且省力得多 (2认同)

Joh*_*son 5

这是你想要的吗:

[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);
}
Run Code Online (Sandbox Code Playgroud)
  • 请注意,我的断言在瑞典(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);
}
Run Code Online (Sandbox Code Playgroud)