如何在C#中的夏令时获取正确的时区偏移量

时间:2019-07-05 09:24:39

标签: c# timezone datetimeoffset

从冬季切换到夏季时,我正努力获得正确的datetimeoffset。

我想做的是向API发送请求,参数是两个日期,格式如下:“ 2018-03-01T01:00:00+01:00” 我在巴黎TimeZone中创建了两个Datetimeoffset(我的PC在英国,但API是法国服务),这是我的操作方式:

var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Romance Standard Time");
DateTime dt = new DateTime(2018,03,01,00,00,00);
dt = DateTime.SpecifyKind(dt, DateTimeKind.Local);
DateTimeOffset startingDate = new DateTimeOffset(dt);
startingDate = TimeZoneInfo.ConvertTime(startingDate, timeZoneInfo);
DateTimeOffset endingDate = new DateTimeOffset();
for (int i = 0;i<700;i++)
{
     startingDate = startingDate.AddMonths(i);
     endingDate = startingDate.AddMonths(1);
     IRestResponse myquery= getAPIresult("", "", startingDate.ToString("yyyy-MM-ddTHH:mm:sszzzzzz"), endingDate.ToString("yyyy-MM-ddTHH:mm:sszzzzzz"));

执行代码时,我得到的startDate为“ 2018-03-01T01:00:00+01:00”。

但是我在EndingDate收到“ 2018-04-01T01:00:00+01:00”,这很奇怪,因为3月31日是法国的夏令时,因此巴黎时区从GMT + 01到GMT + 02。

所以我应该得到“ 2018-04-01T01:00:00+02:00”作为结束日期。

如果您能帮助我,我将非常感激。

1 个答案:

答案 0 :(得分:1)

您必须在循环内调用TimeZoneInfo.ConvertTime,以便针对时区重新评估每个值。 (DateTimeOffset仅显示偏移量,不显示时区。)

此外,您在循环中更改.AddMonths(i)时,startingDate的逻辑是错误的。您可以使用.AddMonths(1),也可以将原始开始日期保存在一个不会变异的单独变量中。

因此,最简单的解决方法是:

startingDate = TimeZoneInfo.ConvertTime(startingDate.AddMonths(1), timeZoneInfo);
endingDate = TimeZoneInfo.ConvertTime(startingDate.AddMonths(1), timeZoneInfo);

此外,您可能想考虑为什么在开始日期就引入DateTimeKind.Local。这与这项任务无关。考虑一下吧:

DateTime dt = new DateTime(2018, 3, 1, 0, 0, 0);
TimeSpan offset = timeZoneInfo.GetUtcOffset(dt);
DateTimeOffset startingDate = new DateTimeOffset(dt, offset);