【问题标题】:How get correct time zone offset on daylight saving in C#如何在 C# 中获得夏令时的正确时区偏移量
【发布时间】:2019-07-05 09:24:39
【问题描述】:

从冬季时间切换到夏季时间时,我很难获得正确的 datetimeoffset。

我要做的是向 API 发送请求,参数是两个日期,格式如下:“2018-03-01T01:00:00+01:00” 我在巴黎时区创建了两个 Datetimeoffset(我的电脑在英国,但 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"));

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

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

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

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

【问题讨论】:

  • IsDaylightSavingTime 方法在这里可能会有所帮助
  • 我不确定你的答案@IDarkCoder,[link]IsDateTimeOffset 只会返回一个布尔值,我该如何使用它?
  • 如果它的夏令时那么它的时区 +1 否则不是(除了那些半小时轮班的地方)
  • 2018 年夏令时开始于 25.03 而不是 01.04
  • @Zoomzoom - 所有有效的时区标识符都是自洽的。如果 DST 规则在它们适用的区域之间存在差异,则相应地会有不同的标识符。对于"Romance Standard Time",对应的英文显示名称为"(UTC+01:00) Brussels, Copenhagen, Madrid, Paris",适用于比利时、丹麦、西班牙和法国(各自的大陆,加上休达)。所有这些地区都是 CET/CEST 时区的欧盟国家,目前 DST 生效。

标签: c# timezone datetimeoffset


【解决方案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);

【讨论】:

  • 嗨,马特,感谢您的帮助,这或多或少是我找到的解决方案。再次感谢
猜你喜欢
  • 2013-10-17
  • 2021-08-28
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 2022-01-10
  • 2010-09-18
相关资源
最近更新 更多