从冬季切换到夏季时,我正努力获得正确的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
”作为结束日期。
如果您能帮助我,我将非常感激。
答案 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);