繁体   English   中英

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

[英]How get correct time zone offset on daylight saving in C#

从冬季切换到夏季时,我正努力获得正确的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"));

执行代码时,我对startingDate收到“ 2018-03-01T01:00:00+01:00 ”,这是我期望的。

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

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

如果您能在这方面帮助我,我将非常感激。

您必须在循环内调用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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM