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.NowDateTime.UtcNow)。

以上是关于C# Epoch 时间到日期和时区转换的主要内容,如果未能解决你的问题,请参考以下文章

Epoch时间到日期和时间的全手动转换

在 Sqlite (Dbeaver) 中转换 Epoch 时间并解析出时间

基于时区在 C# 中设置日期时间,例如 +08:00 [重复]

在Android中将Epoch时间转换为日期并将日期转换为Epoch时间[重复]

将 Epoch 时间转换为日期

不同计算机上的纪元日期转换结果不同