日期大于 17/09/2059 的 DateSerial 溢出

DateSerial overflow with dates greater than 17/09/2059

我目前正在处理一个 VB6 项目,该项目处理英国铁路公司传输的事件数据。偶尔火车 'gets confused' 关于日期,并会传输未来的事件,我已经看到日期远至 2088 年的事件。日期以 Unix 时间传输(从 1/1/1970 开始的秒数)。

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

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

目标是将Unix时间转换成如下格式"dd/mm/yyyy hh:mm:ss"。我可以让 DateSerial 超出这个日期限制工作吗?还是我需要完全改变我计算日期的方式?任何帮助,将不胜感激。干杯。

您可以将结果初始化为 01/01/1970,然后添加所需的秒数:

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