Переполнение DateSerial с датами больше 17.09.2059 - PullRequest
0 голосов
/ 12 июня 2018

В настоящее время я работаю над проектом VB6, который обрабатывает данные о событиях, передаваемых железнодорожным парком Великобритании.Иногда поезда «запутываются» в отношении даты и будут передавать события, датируемые в будущем, я видел события, датированные вплоть до 2088 года. Дата передается в формате Unix (секунды с 01.01.1970).

Я понимаю, в чем проблема, я просто пытаюсь найти решение.Проблема возникает, когда дата превышает '17 / 09/2059 ', она переполняет целое число, используемое для «дня», который может обработать DateSerial.Приведенный ниже код является строкой, в которой происходит переполнение, поэтому, когда 'intDays + 1'> 32767.

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

Цель состоит в том, чтобы преобразовать время Unix в следующий формат "дд / мм / гггг чч:мм: сс».Могу ли я заставить DateSerial работать за пределами этого ограничения даты или мне нужно полностью изменить способ вычисления даты?Любая помощь будет оценена.Приветствия.

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

На самом деле довольно просто придумать заменяющую версию DateSerial, которая принимает Long в течение нескольких дней, например, попробуйте это:

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 
0 голосов
/ 12 июня 2018

Вы можете инициализировать свой результат до 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...