Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2016, 12:49   #1
Debauchee
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 41
По умолчанию Непонятки с timestamp (Unix-Time) в VBA

Всем доброго времени суток!
Стоит задача выгружать данные из Excel в mySQL базу. Дата/время должна быть в формате Unix-time (кол-во секунд, прошедших с 1-1-1970). Вроде бы все понятно:
Код:
Public Function unixTime(ByVal dt As String) As Long
	unixTime = DateDiff("s", DateValue("1.1.1970"), DateValue(dt))
End Function

Debug.Print unixTime("24.1.2015")
получаем
1422057600

однако, это неправильно, должно быть
1422046800
т.е. ошибка в 10800 секунд.

Найденный в инете вариант решения:
Код:
Debug.Print ((DateSerial(2015, 1, 24) - #1/1/1970#) * 60& * 60& * 24&)
дает такой же неверный результат

Проверяем Perl(ом)
Код:
use strict;
use Time::Local;
my $d = 24;
my $m = 1;
my $y = 2015;
my $ut = timelocal(0, 0, 0, $d, $m-1, $y);
print $ut;
и действительно, получаем ожидаемое 1422046800

Вероятно можно вычесть из полученного в VBA результата 10800, и будет ожидаемое значение, но как-то стремно это делать т.к. не понимаю причину ошибки...

В чем моя ошибка?

Заранее благодарю за совет!
Debauchee вне форума Ответить с цитированием
Старый 02.02.2016, 13:11   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Часовой пояс учитывать? Тот cдвиг и есть 3 часа
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.02.2016, 13:11   #3
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

10800 секунд = 3 часа. Это разность между GMT и вашим часовым поясом. Perl, видимо, учитывает системные настройки часового пояса и корректирует соответственно.
Вот например онлайн-конвертер, который тоже это учитывает:http://www.cy-pr.com/tools/time/
Цитата:
Конвертивание эпохи Unix в человекопонятную дату(human readable date)

1422057600
Timestamp в обычную дату
GMT: Sat, 24 Jan 2015 00:00:00 GMT
Ваша временная зона: 24.01.2015, 3:00:00
Так что если в Excel время указано местное, вычитайте 10800.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619

Последний раз редактировалось Казанский; 02.02.2016 в 13:26.
Казанский вне форума Ответить с цитированием
Старый 02.02.2016, 18:24   #4
Debauchee
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 41
По умолчанию

Огромнейшее спасибо!
Пора мне на пенсию - напрочь забыл про часовые пояса
Debauchee вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
unix timestamp > Data(DD.MM.YYYY) XerSon Общие вопросы Delphi 9 31.03.2013 19:13
Unix Timestamp ArtemKrass C# (си шарп) 0 14.12.2012 20:44
Run-time error 1004 (VBA) Aleksy89 Microsoft Office Excel 6 09.08.2012 13:25
PHP & delphi - разные данные UNIX TIMESTAMP phphel Общие вопросы Delphi 5 03.07.2012 21:58
Ошибка run-time error 13 Type mismatch в VBA Kracozebr Microsoft Office Word 9 19.07.2010 16:10