簡體   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