【发布时间】:2014-03-24 14:23:10
【问题描述】:
附件是我目前使用的一种方法,它接收DateTime 字符串列表、它们的输入格式(即yyyy-MM-dd HH:mm:ss)以及它们以小时为单位的偏移量。
至于文化和“标准”,我使用InvariantCulture,并将时间转换为UTC。
public int unixFormat3(string dateTimeInput, string inputFormat, int hours)
{
DateTime result;
CultureInfo provider = CultureInfo.InvariantCulture;
result = DateTime.ParseExact(dateTimeInput, inputFormat, provider);
int unixTime = (Int32)(result.ToUniversalTime().AddHours(hours).Subtract(new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc))).TotalSeconds;
return unixTime;
}
上述方法的两个问题:
- 我使用这个网站作为比较。如果我的输入是
2014-03-18 21:00:00,根据我的方法,我的输出是1395190800,它转换回2014-03-19 01:00:00。它有四个小时的差异。所需的输出是这样的:
- 如果我的输入是
2014-03-18 24:00:00,我会收到以下错误:
The DateTime represented by the string is not supported in calendar System.Globalization.GregorianCalendar.
值得注意的是,它不允许在HH 部分输入24。这是一个奇怪的错误,因为 NodaTime 处理得很好......虽然这与我使用 DateTime 无关。
有人对这个领域有任何见解吗?
编辑:
经过一些实验,删除 .ToUniversalTime() 会删除我的 4 小时偏移量。为什么会发生这种情况?
public int unixFormat3(string dateTimeInput, string inputFormat, int hours)
{
DateTime result;
CultureInfo provider = CultureInfo.InvariantCulture;
result = DateTime.ParseExact(dateTimeInput, inputFormat, provider);
int unixTime = (Int32)(result.AddHours(hours).Subtract(new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc))).TotalSeconds;
return unixTime;
}
【问题讨论】:
-
3/19 00:00 不行吗?
-
它确实有效,尽管
24:00没有。在DateTime库看来,24:00和00:00似乎不是一回事。 -
打电话给 Jon Skeet 和 Matt Johnson :)。
标签: c# datetime timezone unix-timestamp dst