日期大于 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
我目前正在处理一个 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