更改datetimeoffset的时区

9
我有一个DateTimeOffset变量,其值为1989年11月11日16:00:00 +03:30。 我可以调用ToLocalTime()方法,并显示出1989年11月11日18:00:00 +05:30。(我在印度:p)
我正在寻找类似于此的东西: variable1.ToOffset(<timespan>) 如果我给这个函数一个3小时的timespan,它应该返回1989年11月11日19:00:00 +06:30
我试图改变偏移,但偏移属性是只读的。是否有人知道任何解决方法?

DateTimeOffset 的 AddHours() 和 Add(Timespan) 怎么样? - Alex
有一个内置函数与我的问题描述完全相同。函数的名称也是一样的! - Bilal Fazlani
2个回答

18

这很蠢。但是有一个名为ToOffset的函数,它将timespan作为输入参数!


12

给未来读者:

我有一个没有时区的DateTimeOffset被解析了。

所以,如果只想更改时区而不影响实际时间,您需要再次减去TimeSpan,如下面的代码所示:

例如:2018-03-27T11:00:00 +00:00 => 2018-03-27T11:00:00 +02:00

static DateTimeOffset ChangeUtcToCest(DateTimeOffset original)
{
    TimeZoneInfo cetInfo = TimeZoneInfo.FindSystemTimeZoneById("Central Europe Standard Time");
    DateTimeOffset cetTime = TimeZoneInfo.ConvertTime(original, cetInfo);
    return original
        .Subtract(cetTime.Offset)
        .ToOffset(cetTime.Offset);
}

为了提高性能,您应该将 TimeZoneInfo.FindSystemTimeZoneById("Central Europe Standard Time") 缓存到一个 static readonly 字段中。 - Dai
谢谢,Sam Sengers。这对我来说很好用。Dai,是的,我将它存储在所有时区(Windows/Linux)中。 - Prashant Girase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接