0 / 0 / 0
Регистрация: 19.07.2013
Сообщений: 8
1

UnixTime

12.08.2013, 06:08. Показов 2542. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть алгоритм который нашел в инете и он совпадает реально секудна в секунду с Unix временем, вот он:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function SYTEMTIMEToSeconds(_systime: SYSTEMTIME): Int64;
var
fltime: FILETIME;
sec: ULARGE_INTEGER;
begin
    SystemTimeToFileTime(_systime, fltime);
    sec.HighPart := fltime.dwHighDateTime;
    sec.LowPart := fltime.dwLowDateTime;
    result := sec.QuadPart;
end;
 
 
function UnixTime2: DWORD;
var
nowsystime: SYSTEMTIME;
nowsecnds: Int64;
unixsecnds: Int64;
unixtime: SYSTEMTIME;
begin
GetSystemTime(nowsystime);
nowsecnds := SYTEMTIMEToSeconds(nowsystime);
unixtime.wYear := 1970;
unixtime.wMonth := 1;
unixtime.wDay := 1;
unixtime.wHour := 0;
unixtime.wMinute := 0;
unixtime.wSecond := 0;
unixtime.wMilliseconds := 0;
unixsecnds := SYTEMTIMEToSeconds(unixtime);
result := (nowsecnds - unixsecnds) div 10000000
end;

А это написал я сам и не могу понять почему с ним не совпадает:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function UnixTime: DWORD;
  function GetMSec(mm: Word; yy: DWORD): DWORD;
  begin
 
    case mm of
    1:  result := 31;
    3:  result := 31 + 31;
    4:  result := 30 + 31 + 31;
    5:  result := 31 + 30 + 31 + 31;
    6:  result := 30 + 31 + 30 + 31 + 31;
    7:  result := 31 + 30 + 31 + 30 + 31 + 31;
    8:  result := 31 + 31 + 30 + 31 + 30 + 31 + 31;
    9:  result := 30 + 31 + 31 + 30 + 31 + 30 + 31 + 31;
    10: result := 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 31;
    11: result := 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 31;
    12: result := 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + 31;
    end;
 
    if mm >= 2 then
      if (yy mod 4) = 0 then
      result := result + 29 else
      result := result + 28;
 
  result := result * 86400;
  end;
 
var
systime: SYSTEMTIME;
i:       DWORD;
begin
result := 0;
GetSystemTime(systime);
 
  for i := 1970 to systime.wYear - 1 do
  result := result + GetMSec(12, systime.wYear);
 
  result := result + GetMSec(systime.wMonth - 1, systime.wYear);
  result := result + (systime.wDay - 1) * 86400 + systime.wHour * 3600 + systime.wMinute * 60 + systime.wSecond;
 
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.08.2013, 06:08
Ответы с готовыми решениями:

UnixTime
Здравствуйте! Есть сегодняшняя дата 1526465602, вчерашняя 1526379202 и позавчерашняя 1526206402....

UnixTime конвектр
Здравствуйте, форумчане! Возник вопрос: есть время в unix, как мне его конвертировать в такой...

Перевод из UnixTime в обычное время
Как можно перевести из unix в обычное время?

Чтение Даты (в UnixTime) из реестра и сравнение с текущей датой
Читаю (и перевожу в "понятную") дату так: uses DateUtils; procedure...

4
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
12.08.2013, 09:50 2
Цитата Сообщение от bahus_2014 Посмотреть сообщение
почему с ним не совпадает
Хотя бы потому что размер результата разный - qword vs dword
0
0 / 0 / 0
Регистрация: 19.07.2013
Сообщений: 8
12.08.2013, 12:26  [ТС] 3
Цитата Сообщение от mss Посмотреть сообщение
Хотя бы потому что размер результата разный - qword vs dword
точно не из-за размера, пока что Unix время и в DWORD влазиет, и значения обеих функций достаточно близкие получаются, вот например
UnixTime2: 1376295375

в моей
UnixTime: 1375344975

разница 660 суток
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
12.08.2013, 12:44 4
А зачем вообще нужно так извращаться ?
1. получаешь значение момента времени 01.01.1970 00:00:00 в переменную dt1: TDateTime;
2. получаешь GetSystemTime, конвертируешь его в dt2: TDateTime
3. с пом. SecondsBetwwen() получаешь искомую разницу в секундах между временными метками dt2 и dt1
0
0 / 0 / 0
Регистрация: 19.07.2013
Сообщений: 8
12.08.2013, 15:36  [ТС] 5
Ну первый способ тоже рабочий, но теперь самому интересно почему мой не работает

Добавлено через 1 час 31 минуту
Нашел ошибку, надо так
Delphi
1
2
  for i := 1970 to systime.wYear - 1 do
  result := result + GetMSec(12, i);
0
12.08.2013, 15:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.08.2013, 15:36
Помогаю со студенческими работами здесь

unixtime
Вообщем в чём суть. Инфа берётся из файла xml, там время в unixtime. Мне нужно время вставить в...

Работа c unixtime
Есть табличка с полем, в котором хранится время в формате unixtime. Можно ли как то выделить оттуда...

Получить вчерашнее unixtime
Как в sql получить вчерашнее unixtime подскажите кто знает?

Преобразование из UNIXTIME в строке запроса
В базе имеется несколько столбцов(id,dat,info). Делаю выборку при помощи SELECT SELECT id,dat,info...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru