vala: это правильный способ получить текущее время в миллисекундах?

Использование этой библиотеки с Vala:

http://valadoc.org/#!api=glib-2.0/GLib.DateTime

    GLib.DateTime now = new GLib.DateTime.now_local();

    var sec = now.to_unix()
    var msec = (sec * 1000) + now.get_microsecond();

это правильный способ получить текущее время в миллисекундах?

Есть ли способ лучше ?


person Max L.    schedule 19.10.2013    source источник


Ответы (1)


GLib.DateTime - допустимый способ сделать это, и немного странно, что вы запрашиваете местное время, а затем конвертируете его во время unix (которое неявно преобразуется в UTC). Однако настоящая проблема в том, что вы объединяете миллисекунды (1/1000 секунды) и микросекунды (1/1000000 секунды). Так что измените последнюю строку на

var msec = (sec * 1000) + (now.get_microsecond () / 1000);

В качестве альтернативы более простым способом было бы использовать GLib.get_real_time :

int64 msec = GLib.get_real_time () / 1000;

В зависимости от вашего варианта использования вы можете рассмотреть возможность использования монотонного времени вместо реального времени (см. GLib. get_monotonic_time

person nemequ    schedule 19.10.2013
comment
Спасибо! Я заметил, что get_monotonic_time не возвращает количество микросекунд с 1 января 1970 года по всемирному координированному времени. get_real_time возвращает что-то еще (monotinic_time вернул 587731122, а real_time вернул 1382202816518, когда они оба были запущены в течение 5 минут) Как мне получить монотонное real_time (количество микросекунд с 1 января 1970 года по всемирному координированному времени)? - person Max L.; 19.10.2013
comment
монотонное real_time бессмысленно. Если вам нужно реальное время, используйте get_real_time. Я упомянул только монотонное время, потому что многим людям, которые думают, что им нужно реальное время, было бы лучше использовать монотонное время (например, для измерения времени между событиями). - person nemequ; 19.10.2013
comment
см. также stackoverflow.com/questions / 3523442 / - person Jens Mühlenhoff; 19.10.2013