Vb6 日期大于2059年9月17日的日期序列溢出

Vb6 日期大于2059年9月17日的日期序列溢出,vb6,Vb6,我目前正在从事一个VB6项目,该项目处理由英国铁路公司传输的事件数据。偶尔,列车会对日期“感到困惑”,并将在未来传输日期疯狂的事件,我看到的事件可以追溯到2088年。日期以Unix时间传输(从1970年1月1日起的秒数) 我理解问题所在,我只是在努力寻找解决方案。问题似乎是当日期超过'17/09/2059'时,它溢出了DateSerial可以处理的'day'所用的整数。下面的代码是发生溢出的代码行,因此当“intDays+1”大于32767时 UnixTimestampToDateTime =

我目前正在从事一个VB6项目,该项目处理由英国铁路公司传输的事件数据。偶尔,列车会对日期“感到困惑”,并将在未来传输日期疯狂的事件,我看到的事件可以追溯到2088年。日期以Unix时间传输(从1970年1月1日起的秒数)

我理解问题所在,我只是在努力寻找解决方案。问题似乎是当日期超过'17/09/2059'时,它溢出了DateSerial可以处理的'day'所用的整数。下面的代码是发生溢出的代码行,因此当“intDays+1”大于32767时

UnixTimestampToDateTime = DateSerial(1970, 1, intDays + 1) + TimeSerial(intHours, intMins, CInt(intSecs)) 

目标是将Unix时间转换为以下格式“dd/mm/yyyy hh:mm:ss”。我可以让DateSerial在这个日期限制之外工作吗?或者我需要完全改变我计算日期的方式吗?任何帮助都将不胜感激。干杯。

您可以将结果初始化为1970年1月1日,然后添加所需的秒数:

Dim unix_time As Currency
Dim max_long  As Long
Dim result    As Variant

' Determine unix time
unix_time = .....

' Initialize result to 01/01/1970 00:00:00
result = DateSerial(1970, 1, 1) + TimeSerial(0, 0, 0)

' Determine maximum number of seconds we can add in a single call
max_long = 2147483647

' Add desired time
While unix_time > max_long
  result = DateAdd("s", max_long, result)
  unix_time = unix_time - max_long
Wend
result = DateAdd("s", CLng(unix_time), result)

实际上,提供一个可接受
Long
数天的
DateSerial
替换版本是非常简单的,例如,尝试以下方法:

Private Function MyDateSerial(ByVal Year As Integer, ByVal Month As Integer, ByVal Day As Long)
    MyDateSerial = DateSerial(Year, Month, 1) + Day - 1
End Function
下面是一个简单的用例来测试它

Debug.Print MyDateSerial(1970, 1, 30000), DateSerial(1970, 1, 30000)
19.2.2052     19.2.2052 

嗨,这是一种货币。干杯。我更新了我的答案。你是如何将unix时间戳分解为天、小时和分钟的?我试图找出如何在注释中发布代码,只是刚刚加入了。你没有;评论是为了澄清问题。如果有新的相关信息,更新问题。嗨,罗布,这实际上是我尝试的第一件事。问题是,这也会溢出。使用Dateadd添加1970年1月1日起的秒数只会在凌晨3:14(UTC)时达到2038年1月19日,因此,列车在2147483647以上传输的任何时间都会导致溢出:-(我更新了我的答案。不知道这是否有效;我没有尝试Hi Robert,这非常有效。感谢您的帮助。干杯:-)