【发布时间】:2014-05-07 03:59:33
【问题描述】:
以下是我使用的接受三个输入的方法:
dateTimeInput 是一个代表日期的字符串。
inputFormat 是我的格式字符串,格式如下:yyyy-MM-dd'T'HH:mm:sszzz。
timeZoneStandardName 是从 var TimeZoneList = TimeZoneInfo.GetSystemTimeZones(); 检索的唯一时区标识符,其中 ID 是通过 timeZoneList.Id 检索的。
我主要使用TimeZoneInfo 来获取我的小时和分钟偏移量,因为它非常明确它是哪个城市/时区,例如UTC 是输入字符串。
public string unixTimeToDateTime(int unixInput, string outputFormat, string timeZoneStandardName)
{
// output format is "yyyy-MM-dd'T'HH:mm:sszzz"
TimeZoneInfo objTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZoneStandardName);
if (outputFormat == "yyyy-MM-dd'T'HH:mm:sszzz")
{
DateTime UTCDate = Epoch.AddSeconds(unixInput);
DateTime localDate = TimeZoneInfo.ConvertTimeFromUtc(UTCDate, objTimeZoneInfo);
return localDate.ToString("yyyy-MM-dd'T'HH:mm:ss") + toTimeSpan(objTimeZoneInfo.GetUtcOffset(localDate).Hours, objTimeZoneInfo.GetUtcOffset(localDate).Minutes);
}
// output format is anything else
else
{
DateTime UTCDate = Epoch.AddSeconds(unixInput);
DateTime localDate = TimeZoneInfo.ConvertTimeFromUtc(UTCDate, objTimeZoneInfo);
return localDate.ToString(outputFormat);
}
}
在 Grasshopper 3D 中的组件上使用此方法我将向您展示三个示例:
2014 年 3 月 9 日更改夏令时
2014 年 11 月 2 日(这是我遇到问题的日期)的 DST 更改之一
另一个日期是 2015 年 11 月 2 日,以证明奇怪的差异。
输入 UTC 时间列表(在 2014 年 3 月 9 日强制执行 DST 偏移的战略位置),并将它们输出到 EST 时间,此示例成功输出正确的 DST 偏移,如最右侧面板所示(提示:2014-03-09T01:00:00-05:00 到 2014-03-09T03:00:00-04:00)。
现在是奇怪的部分。
如果我进行 2014 年 11 月 2 日 DST 更改,输出如下:
您可以在最右侧的面板上看到,01:00:00-05:00 存在两次。所需的输出应该从01:00:00-04:00 到01:00:00-05:00!
作为比较,这里是 2015 年 11 月 2 日:
2015 年 11 月 2 日(虽然不是年份,但具有相同的 DAYS)在不重复一个小时的情况下切换 DST 没有问题。
所以我的结论是,对于 2014 年 11 月 2 日,DST 提前一个小时增加。
这是DateTimeInfo 的错误吗?为什么过早增加一个小时?是我的代码吗?什么给了?!
编辑:
使用 Unix 时间戳并将其转换为 DateTime:
1414904400 是Sun, 02 Nov 2014 05:00:00 GMT
1414908000 是 Sun, 02 Nov 2014 06:00:00 GMT
【问题讨论】:
-
凌晨 1 点到凌晨 2 点在 2014 年 11 月 2 日出现两次,因此该时间出现两次是有道理的。你确定你的结果不正确吗?
-
如果这是真的,2015 年 11 月 2 日的示例不会做同样的事情吗?我提供这个例子是因为我认为它也是正确的,但它没有意义,因为 UTC 从不重复。
-
没有。 2015 年 11 月 2 日不是 2015 年的“回退”日期,而是 11 月 1 日。
-
正确,但
22:00:00-04:00到22:00:00-05:00在转换为 UTC 01:00:00-05:00 和01:00:00-05:00重复。 -
是的,UTC 时间不会重复,但本地时间会重复(您正在将 UTC 时间 转换为 本地时间吗?)。您正在转换两个 UTC 时间,而这两个时间恰好都转换为 2014 年 11 月 2 日凌晨 1 点。这不会发生在 2015 年 11 月 2 日,因为 DST 切换时间不是当天凌晨 1 点。