C# Epoch 时间到日期和时区转换
Posted
技术标签:
【中文标题】C# Epoch 时间到日期和时区转换【英文标题】:C# Epoch time to date and timezone convertion 【发布时间】:2015-07-03 22:22:23 【问题描述】:什么是将 Epoch 时间转换为日期的好方法,但使用特定时区
我需要检查两个日期。我在数据库中有一个日期,另一个在 x 网站中。
我知道这两个日期与 yyyy-MM-dd 的关系完全相同
例如:
数据库日期为: 1398891600 = 2014-05-01
X 网站日期为: 1398902400000 = 2014-05-01
C# 代码“转换器”
private string DateChecker_inEPOCH(string epochdate)
if (epochdate.Length < 13)
epochdate = epochdate + "000";
DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0).AddMilliseconds(Convert.ToDouble(epochdate));
string dateFormated = dt.ToString("yyyy-MM-dd");
return dateFormated;
问题是当我使用我的方法进行转换时,一个数据库日期是 2014-04-30,网站日期是 2014-05-01。
我使用http://www.epochconverter.com/ 测试了日期
【问题讨论】:
nitpick: 请不要称其为“纪元时间”。这是对字典词epoch 的误用。请参阅dictionary.com 2、3 或 5a。在这种情况下, epoch 是 1970-01-00 00:00:00 UTC 的“unix epoch”——而不是您正在评估的值。另见Notable epoch dates in computing。 【参考方案1】:数据库日期为:1398891600 = 2014-05-01
X 网站日期为:1398902400000 = 2014-05-01
EpochConverter.com 给了我以下结果:
1398891600000 -> 2014 年 4 月 30 日星期三 21:00:00 GMT
1398902400000 -> 2014 年 5 月 1 日星期四 00:00:00 GMT
所以您的代码似乎与 EpochConverter.com 一致。
关于时区,我会确保使用 UTC 存储/检索所有日期。在转换到/从不同时区时,这将为您省去很多麻烦。在这种情况下,假设纪元是相对于 UTC 日期存储的,您只需执行以下操作:
DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(Convert.ToDouble(epochdate));
如果您需要向最终用户显示当地时间,则可以使用以下方法:
utcDate.ToLocalTime();
【讨论】:
是的,但我在 +3 GMT 上,如果你在数据库时间上增加 3 小时,你会得到正确的日期;) 听起来网站的时间戳是非 UTC 格式的。这就是事情开始变得混乱的地方。这是你能控制的吗? 更有可能的是,数据库中的时间戳不是取自 UTC,而是取自服务器的时区(DateTime.Now
与 DateTime.UtcNow
)。以上是关于C# Epoch 时间到日期和时区转换的主要内容,如果未能解决你的问题,请参考以下文章
在 Sqlite (Dbeaver) 中转换 Epoch 时间并解析出时间
基于时区在 C# 中设置日期时间,例如 +08:00 [重复]