2013-12-13 72 views
1

我已经递交了大量带有日期和时间大整数值的表格。在MS Access中将刻度转换为日期时间值

实施例:1382575236393表示2013年12月2日10:30 PM

我的理解的是,这是蜱(纳秒)。我一直无法找出或找到一个公式或功能,将该刻度转换为在Microsoft Access 2010中使用的日期/时间值。

任何人都解决过这个问题吗?我在想某个地方会有VBA功能。

感谢

+0

你会发现这个有用:http://able2know.org/topic/70939-1 –

回答

1

VBA在大多数部分不随时间冻结自90年代中期,回来的时候VB生态系统是从一切天壤之别。它们有更多的内聚性(例如.NET框架)。

无论如何,没有标准的“tick”定义 - 在Unix/POSIX上,时间戳是自1970-01-01 00:00 UTC以来的秒数,在.NET DateTime.Tick中是一百纳秒,但是Stopwatch.ElapsedTicks是一个任意单位,所以它总体上有点复杂。

我不知道用什么样的规模,所以我做了一些分工,并发现它实际上是的毫秒从unix新纪元数量:今天

Nanoseconds:  1382575236393/86400000000000 = 0.01 of a day 
100-Nanoseconds: 1382575236393/ 864000000000 = 1.6 days 
Microseconds: 1382575236393/ 86400000000 = 16 days 
Milliseconds: 1382575236393/  86400000 = 160002 days (43 years) 
Seconds:   1382575236393/  86400 = 16002028 days (43,841 years!) 

于43年前,合顺便说一句,是1970年,所以现在我们知道规模。我打算下注,因为这显然是基于1970-01-01 00:00纪元,它也将用UTC。 VBA不包含处理时区的任何内置功能(我知道这很愚蠢),所以我认为最好我们假设这是UTC日期值,所以您需要在适当的时候在您的应用程序中进行自己的时区转换。

那么事情就会变得很多你越需要使用64位整数这样做正确,but there's a problem: only VBA in 64-bit versions of Office 2010 or later include the LongLong type,如果你使用的是32位Office或运行Office 2007或更早。现在,我们假设您正在运行64位Office 2010或2013.

无论如何,解决方案(与LongLong)是将毫秒时间戳转换为UNIX时间戳,然后让VBA将秒添加到时期。注意:从不自己添加秒数到一年,因为你会忘记诸如闰秒,闰年和其他小技巧。

Public Function MilisecondUnixTimestampToVBDate(milisecondUnixTimestamp As LongLong) As Date 
    Dim unixTimestamp As Long 
    unixTimestamp = milisecondUnixTimestamp/1000 

    Dim dt As Date 
    dt = DateAdd("s", unixTimestamp , #1/1/1970#) 
    MilisecondUnixTimestampToVBDate = dt 

End Function 
+0

他说*“1382575236393代表2013年12月2日10:30 PM “*您的函数是否返回相同的日期/时间值或返回2013年10月24日上午12点40分36秒? – HansUp

+0

@HansUp感谢您发现并感到羞愧,因为我没有对它进行测试。当我运行该功能时,我也会获得2013年10月24日的信息。我只是假设,因为规模看起来与Unix时间戳类似,这是正确的。我认为OP需要提供更多细节。 – Dai

+0

对,这里有些奇怪。要么他给了我们错误的代表日期,要么那些“滴答”基于除[Unix时间戳](http://www.unixtimestamp.com/index.php)以外的内容。 – HansUp

0

即使简单:

Public Function TicksToDate(dblMilliseconds As Double) As Date 
    TicksToDate = DateAdd("s", dblMilliseconds/1000, #1/1/1970#) 
End Function 
相关问题