【问题标题】:Odd Unix Timestamp conversion奇数 Unix 时间戳转换
【发布时间】:2013-08-14 19:32:02
【问题描述】:

我正在使用 windows phone 8,需要将 DateTime 对象转换为 unix 时间戳。

我知道有很多关于如何做到这一点的帖子,但我有一个奇怪的错误,我就是想不通。

我正在这样做:

double val = (value.Ticks - New DateTime(1970,1,1).Ticks) / TimeSpan.TicksPerSecond;

其中 value 是我要转换为 unix 时间戳的 DateTime 对象。 我知道该值包含正确的时间, (在调试期间我可以看到它有正确的日期+时间)

但转换后的 unix 值总是 +2 小时。 时区肯定有问题。

有人可以帮助我吗?我发现在 WP 下处理时区非常烦人,因为除了 UTC 或 Local 之外,没有其他方法可以转换为特定时区。

【问题讨论】:

  • 我已经添加了 c# 标签,因为我认为那是您使用的语言。如果不是,请将标签替换为您实际使用的语言。
  • Unix time conversions in C# 的可能重复项
  • 不要那样做。 Jon Skeet's answer 这个问题有你需要的一切。但是您需要了解并非所有DateTimes 都是平等的。 .Kind 很重要 - 这可能解释了您提到的差异。
  • 是的,我找到了 Jon Skeet 的答案,我尝试了他的解决方案。假设它在我的国家是 12:00,那么 UTC 时间是 10:00,(DateTime.UtcNow - UnixEpoch).TotalSeconds(UnixEpoch 是 utc)的结果是 12:00,这对我来说是正确的时间,但我不明白为什么,因为 DateTime.UtcNow 关闭了 2 小时。这里的问题是我也需要它在不同的时区工作。

标签: c# datetime timezone unix-timestamp


【解决方案1】:

根据this documentationDateTime 的三参数构造函数:

DateTime(Int32, Int32, Int32)

“将 DateTime 结构的新实例初始化为指定的年、月和日。”它没有指定时区的方法,文档也没有指定结果的时区。我猜是当地时间。

还有另一个构造函数:

DateTime(Int32, Int32, Int32, Int32, Int32, Int32, DateTimeKind)

“将 DateTime 结构的新实例初始化为指定的年、月、日、小时、分钟、秒和协调世界时 (UTC) 或本地时间”。

尝试替换

New DateTime(1970,1,1).Ticks

通过

New DateTime(1970,1,1,0,0,0,DateTimeKind.Utc).Ticks

获取代表 1970-01-01 00:00:00 UTC 的 DateTime(如果我没记错语法的话)。

【讨论】:

  • 谢谢,但我已经尝试过了。不管我做什么,时间总是错的。现在我安装了 Noda-Time 库,在那里我至少可以得到正确的时区,但我还没有弄清楚如何在这个时区得到当前时间。
  • 如果您尝试过但没有成功,您为什么接受这个答案?
  • 我了解到它确实有效。我认为 unix 时间戳取决于本地时间,但我了解到 unix 时间戳在每个位置都应该相同,并且它不代表我的本地时区不是问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 2023-03-18
  • 2011-12-16
  • 2017-07-18
相关资源
最近更新 更多