【问题标题】:Delphi: UnixTime string to DateTime gives unexpected resultDelphi:到 DateTime 的 UnixTime 字符串给出了意外的结果
【发布时间】:2019-08-01 09:01:31
【问题描述】:

我正在尝试将 unixtime 字符串转换为 datetime,但它给出了错误的结果。我正在使用 Delphi XE2 并使用 Dateutils 的 UnixToDateTime 函数来转换 unixtime 字符串,但没有运气。我还使用了我在网上找到的不同功能,结果仍然相同。以下是必要的信息:

Unixtime 字符串值为 1552274340690
结果是“51159-08-14 04:51:30”,应该是“3/11/2019, 11:19:00 AM”。我得到的结果来自一个在线转换器。

下面使用 System.DateUtils 的 UnixToDateTime 的示例代码:

var
 nUnixTime : Int64;
begin
 nUnixTime := StrtoInt64(sUnixTime); //sUnixTime = 1552274340690;
 Result = UnixToDateTime(nUnixTime);

下面是我在网上找到的示例代码:

const
 UnixStartDate: TDateTime = 25569.0;
var
 nUnixTime : Int64;
begin
 nUnixTime := StrtoInt64(sUnixTime); //sUnixTime = 1552274340690;
 Result := (nUnixTime / 86400) + UnixStartDate; 

请帮忙,非常感谢。

【问题讨论】:

  • 请显示您正在使用的实际代码,以及您如何检查它是否产生了您期望的结果。仅供参考,1552274340690 的正确结果是51159-08-14 04:51:30 UTC2019-03-11 11:19:00 UTC 将改为 1552303140。这是时间戳的巨大差异。
  • @RemyLebeau 是的,抱歉,我复制了一个不同的 utc 值。已经更新了帖子。
  • UnixToDateTime() 工作正常。您显然一开始就使用了错误的时间戳。您从哪里获得 sUnixTime 值?你怎么知道它是一个 Unix 时间戳而不是别的什么?
  • @RemyLebeau 实际上它来自 api 结果并且不太清楚格式是什么,因为无法从文档中找到描述。但是根据我使用的在线转换器,它给出了正确的结果,它是从纪元时间戳毫秒或秒转换为相应的日期时间值。
  • @RemyLebeau 我做了一些事情并以某种方式给了我一个正确的结果,但需要从中获取本地日期时间。我所做的是将 nUnixTime 划分为 1000,而不是使用 div 运算符,而是仅使用正斜杠,然后进行其余的转换,并且似乎可以工作。我不确定为什么或如何,也许你可以确认一下,非常感谢。

标签: datetime delphi unix-timestamp epoch


【解决方案1】:

小测试

Caption:=DateTimeToStr(UnixToDateTime(SecondsBetween(StrToDate('01.01.1970'), Now)));` 

给出正确的当前时间。

请注意,现在的 UnixTime is measured

1552307060
1552274340690

而您的值(在第二行中)以 毫秒 为单位。

因此您可以将其除以 1000 以获得 UnixToDateTime 函数可接受的值

【讨论】:

  • 是的,已经做了同样的事情,但仍然是正确的答案,谢谢@MBo
  • 是的,抱歉,页面打开很久了,我错过了所有最后的cmets(只有Remy的评论,现在被删除了)
猜你喜欢
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
相关资源
最近更新 更多