附件是我当前正在使用的方法,它接受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
,我会收到以下错误:
日历 System.Globalization.GregorianCalendar 不支持字符串表示的 DateTime。
值得注意的是,它不允许在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;
}
最佳答案
本文档,http://www.w3.org/TR/NOTE-datetime ,在这个问题中引用How to know whether a given string is a valid UTC DateTime format?未将 24 列为有效小时值。
本文档,http://en.wikipedia.org/wiki/Iso8601 ,问题的答案引用的确实将 24:00 列为有效时间。这个,http://en.wikipedia.org/wiki/12-hour_clock#Confusion_at_noon_and_midnight ,还表示 24:00 有效。
关于c# - DateTime 到 Unix 时间转换不一致且 24 小时输入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22612127/