[英]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.