【问题标题】:C# Epoch time to date and timezone convertionC# Epoch 时间到日期和时区转换
【发布时间】: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

标签: c# timezone epoch


【解决方案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)。
猜你喜欢
  • 2020-06-15
  • 2019-10-23
  • 2012-04-01
  • 2011-10-09
  • 2018-12-23
  • 2018-07-25
  • 2017-03-23
  • 1970-01-01
  • 2014-06-10
相关资源
最近更新 更多