TimeLocal в миллисекундах

 
Всем привет! Подскажите что-то никак не могу найти... как мне просто получить unix метку с миллисекундами (локального времени)... смотрю журнал, там с мс, делаю свой логгер, хочу так же...

пс: нашёл через kernel32.dll , а стандартными то средствами языка MQL4 никак?? НЕ верю!!! (даже недавно обнаружил, что хеш функции вшили... а время то уж сделать по-человечески должно быть само-собой..)
 

Вообщем спасибо VonDo Mix - проверил в таймере миллисекундном - полёт нормальный, накидал простенький класс, кое что исправил, так для примера и архива... Но Допилите из коробки решение!!!!!

//+------------------------------------------------------------------+
//|                                                        tTime.mqh |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property strict

#import "kernel32.dll"
   void GetSystemTime (ushort &t[8]);
#import

/* Type SYSTEMTIME   
**
      https://msdn.microsoft.com/en-us/library/windows/desktop/ms724950(v=vs.85).aspx
*/ 

/* USAGE
**
      #include "tTime.mqh"

      tTime _time;
      
      Print("Time with mills: "+_time.dateTimeString());
      Print("Time unix epoch with mills: "+(string)_time.unixTimestamp());
*/


class tTime
{
   public:
   
      string   dateTimeString();     
      int      mills();
      ulong    unixTimestamp();
         
   private:
   
      ushort   b[8];   
};

//+------------------------------------------------------------------+

int tTime::mills()
{
   GetSystemTime(this.b);
   
   return this.b[7];
}

//+------------------------------------------------------------------+

string tTime::dateTimeString(void)
{
   GetSystemTime(this.b);
   
   return TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)+"."+IntegerToString(this.b[7], 3, '0');
}

//+------------------------------------------------------------------+

ulong tTime::unixTimestamp(void)
{
   GetSystemTime(this.b);   
   
   return StringToInteger(IntegerToString(TimeLocal())+IntegerToString(this.b[7], 3, '0'));   
}

//+------------------------------------------------------------------+
VonDo Mix
  • www.mql5.com
Профиль трейдера
 
Taras Slobodyanik:
можно использовать GetMicrosecondCount

Например? И нет ли там такого случайно "Счетчик ограничен разрешающей способностью системного таймера. Так как время хранится как беззнаковое целое, то он переполняется каждые 49.7 дней при непрерывной работе компьютера." ? Потому как программа должна работать, в идеале, всегда... в любом случае пока мне не нравится мысль вычислять тек. время в зависимости от времени запущенной программы... нелогично.

 
Matvey Alekseev:

Например? И нет ли там такого случайно "Счетчик ограничен разрешающей способностью системного таймера. Так как время хранится как беззнаковое целое, то он переполняется каждые 49.7 дней при непрерывной работе компьютера." ? Потому как программа должна работать, в идеале, всегда... в любом случае пока мне не нравится мысль вычислять тек. время в зависимости от времени запущенной программы... нелогично.

например - синхронизировать один раз, при старте, с локальным временем, и дальше переводить время счетчика в локальное...
ничего страшного в переполнении не вижу...

и, без внешних библиотек, можно размещать продукт в маркете

а что нелогично?

 

Избыточно...

 
Matvey AlekseevВообщем спасибо VonDo Mix - проверил в таймере миллисекундном - полёт нормальный, накидал простенький класс, кое что исправил, так для примера и архива... Но Допилите из коробки решение!!!!!

Приятно, что пригодилось.)

Однако для сегодняшнего уровня языка код явно избыточный.
дело в том, что тогда был только int.
Через ushort все значительно проще...

 
Mikhail Dovbakh:

Приятно, что пригодилось.)

Однако для сегодняшнего уровня языка код явно избыточный.
дело в том, что тогда был только int.
Через ushort все значительно проще...


Добрый! Михаил, если бы вы могли потратить несколько минут своего драгоценного времени и привести пример с ushort, было бы просто замечательно! (Давно не делал ничего с побитовыми операциями просто... это надо взять книжку, вспомнить... попробовать.. ну вы понимаете :))

 
Matvey Alekseev:

Добрый! Михаил, если бы вы могли потратить несколько минут своего драгоценного времени и привести пример с ushort, было бы просто замечательно! (Давно не делал ничего с побитовыми операциями просто... это надо взять книжку, вспомнить... попробовать.. ну вы понимаете :))


Они уже тогда не нужны.)
Шаманство со сдвигом было связано с отсутсвием аналога WORD в MQL.
Поэтому если вы измените описание 

#import "kernel32.dll"
   void GetSystemTime (ushort &b[8]);
#import

вы тем самым без проблем получите соответствие 

SYSTEMTIME structure

typedef struct _SYSTEMTIME {
  WORD wYear;
  WORD wMonth;
  WORD wDayOfWeek;
  WORD wDay;
  WORD wHour;
  WORD wMinute;
  WORD wSecond;
  WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
 
Mikhail Dovbakh:

Они уже тогда не нужны.)
Шаманство со сдвигом было связано с отсутсвием аналога WORD в MQL.
Поэтому если вы измените описание 

вы тем самым без проблем получите соответствие 

SYSTEMTIME structure


Благодарю, обновил пример...