Аналог systemtime в linux

Обновлено: 04.07.2024

Структура SYSTEMTIME представляет дату и время, используя отдельные члены для месяца, дня, года, дня недели, часа, минут, секунд и миллисекунд.

Синтаксис

Члены структуры

wYear

Год. Допустимые значения для этого члена структуры 1601 - 30827.

wMonth

Месяц. Этот член структуры может быть одним из ниже перечисленных значений.

Значение

Предназначение

wDayOfWeek

День недели. Этот член структуры может быть одним из ниже перечисленных значений.

Значение

Предназначение

День месяца. Допустимые значения для этого члена структуры 0-31.

wHour

Час. Допустимые значения для этого члена структуры 0-23.

wMinute

Минута. Допустимые значения для этого члена структуры 0-59.

wSecond

Секунда. Допустимые значения для этого члена структуры 0-59.

wMilliseconds

Миллисекунда. Допустимые значения для этого члена структуры 0-999.

Замечания

Не рекомендуется, что бы Вы добавляли и вычитали значения из структуры SYSTEMTIME, чтобы получить относительное время. Вместо этого Вы должны:

  • Преобразовать структуру SYSTEMTIME в структуру FILETIME.
  • Скопируйте получившуюся структуру FILETIME в структуру ULARGE_INTEGER.
  • Используйте обычную 64-битовую арифметику для значений ULARGE_INTEGER.(Подробно операция изложена в описании функции).

Система может периодически обновлять время, синхронизируя с источником времени. Поскольку системное время, может регулироваться или вперед, или назад, не сравнивайте данные системного времени, чтобы определить истекшее время. Вместо этого используйте один из методов, рассмотренных в статье Время операционной системы Windows.

Демонстрационный код [C++]

Пример ниже демонстрирует различие между значениями времени, найденными функциями GetSystemTime и GetLocalTime.

Попытался найти полный аналог функции SystemTimeToFileTime, но не смог его найти.

У меня есть все структуры SYSTEMTIME и FILETIME с правильно работающим SYSTEMTIME на linux для функции разницы дат:

Кто-нибудь знает точную замену функции SystemTimeToFileTime ?

4 ответа

Мне нужен какой-то текстовый поиск-замена с минимальными инструментами во время запуска linux. Sed не работает, вероятно, он находит какие-то специальные символы в моих строках. Есть ли решение отключить эту причудливую магию регулярных выражений и сделать простой буквальный поиск-замену всех.

Это имело бы смысл, если бы я был в ±5 часах timezone, но я нахожусь в GMT -06:00, поэтому я не уверен, являются ли часовые пояса моей проблемой или это что-то другое. Вот мой код, который я использую: Private Sub SetFileTimes(file As String, Optional creationTime As Date, Optional accessTime As.

FILETIME -это просто timestamp с разрешением 10 миллисекунд, разделенное на два 32-разрядных числа. A POSIX timestamp (со вторым разрешением) можно просто умножить на 100, чтобы получить это.

Чтобы перейти от SYSTEMTIME к FILETIME , вы можете создать struct tm с соответствующими полями и использовать mktime для создания time_t . Поместите этот timestamp в целое число 64-bit, умножьте 100 (чтобы получить разрешение 10 миллисекунд) и добавьте поле SYSTEMTIME wMilliseconds (разделенное на 10), и у вас будет FILETIME .

Я предлагаю вам ознакомиться с источниками проекта WINE, которые будут содержать именно то, что вам нужно.

Указывает дату и время, используя отдельные элементы для месяца, дня, года, дня недели, часа, минуты, секунды и миллисекунды. Время находится либо в координированном универсальном времени (UTC), либо в локальном времени, в зависимости от вызываемой функции.

Ближайшим типом будет struct tm , хотя в нем нет миллисекунд.

Содержит значение 64-bit, представляющее количество 100-наносекундных интервалов с 1 января 1601 года (UTC).

Вы можете использовать struct timeval (поддерживает микросекунды) или struct timespec (поддерживает наносекунды)

Не все файловые системы поддерживают наносекунды, например ext4 .

Вы можете использовать для этого mktime , хотя вы получите только секунды с момента эпохи (1970-01-01 00:00 UTC).

Поэтому я бы сказал, что точная замена, мягко говоря, затруднительна.

Есть ли какая-нибудь замена для Qt, которая может быть перенесена на Windows и Linux или хороша для Linux, поддерживающего OpenGL? Я должен написать приложение OpneGL C++, и я хочу попробовать что-то лучшее, если оно существует.

В качестве учебного опыта я портирую некоторые вещи с Windows на MacOS и наткнулся на что-то вроде этого: void SomeClass::someFunction(const char* format, va_list args) < int size = _vscprintf(format, args); // length after formatting std::string s; s.resize(size); vsprintf(&s[0]); . >.

Linux не имеет понятия "filetime" как такового. В зависимости от того, что именно вы делаете, может быть лучше использовать difftime (дать разницу между двумя time_t в секундах в виде числа с плавающей запятой) или использовать более точные метки времени и преобразовать их в разницу в интервалах 10 мс?

Вы можете использовать mktime для преобразования значения даты/времени в time_t .

Похожие вопросы:

Я конвертирую код C++ из Windows в работу под Linux и наткнулся на эту функцию vsprintf_s. Это специфическая функция Microsoft, поэтому я хотел бы спросить, есть ли замена в Linux? Спасибо

Этот вопрос философски похож на вопрос, который возникает здесь снова и снова: Поиск и замена текста во всех файлах каталога linux Как искать-заменять содержимое в файлах в Ubuntu Linux? Linux поиск.

Я пытаюсь написать кросс-платформенный код i18n C++. Поскольку большинство систем linux предпочитают использовать UTF-8 в качестве кодировки символов, я подумал, что мне следует использовать string.

Мне нужен какой-то текстовый поиск-замена с минимальными инструментами во время запуска linux. Sed не работает, вероятно, он находит какие-то специальные символы в моих строках. Есть ли решение.

Это имело бы смысл, если бы я был в ±5 часах timezone, но я нахожусь в GMT -06:00, поэтому я не уверен, являются ли часовые пояса моей проблемой или это что-то другое. Вот мой код, который я.

Есть ли какая-нибудь замена для Qt, которая может быть перенесена на Windows и Linux или хороша для Linux, поддерживающего OpenGL? Я должен написать приложение OpneGL C++, и я хочу попробовать.

В качестве учебного опыта я портирую некоторые вещи с Windows на MacOS и наткнулся на что-то вроде этого: void SomeClass::someFunction(const char* format, va_list args) < int size =.

Каков формат / точная строка в unity linux для добавления setxkbmap и synclient FingerLow=1 FingerHigh=5 в my. bashrc?

Я хотел бы знать, как поменять местами столбцы (точный символ) файла с Linux (используя cut, awk, sed или что-то еще, с чем вы можете мне помочь). Я видел, как поменять местами целое выражение.

Пытался найти полный аналог функции SystemTimeToFileTime, но не смог его найти.

У меня есть все структуры SYSTEMTIME и FILETIME с правильно работающей SYSTEMTIME на linux для функции разницы дат:

Кто-нибудь знает точную замену функции SystemTimeToFileTime ?

спросил(а) 2013-02-01T15:56:00+04:00 8 лет, 9 месяцев назад

Я предлагаю вам ознакомиться с источниками проекта WINE, который будет содержать именно то, что вам нужно.

ответил(а) 2013-02-01T15:58:00+04:00 8 лет, 9 месяцев назад

FILETIME - это всего лишь метка времени с разрешением в 10 миллисекунд, разделенная на два 32-разрядных номера. Временную метку POSIX (со вторым разрешением) можно просто умножить на 100, чтобы получить это.

Чтобы перейти из SYSTEMTIME в FILETIME вы можете создать struct tm с соответствующими полями и использовать mktime для создания time_t . Поместите эту метку времени в 64-битное целое число, умножьте 100 (чтобы получить разрешение в 10 миллисекунд) и добавьте поле SYSTEMTIME wMilliseconds (разделенное на 10), и у вас есть FILETIME .

ответил(а) 2013-02-01T16:05:00+04:00 8 лет, 9 месяцев назад

Linux не имеет понятия "файл времени" как таковой. В зависимости от того, что вы делаете, может быть лучше использовать difftime ( difftime разницу между двумя time_t в секундах как число с плавающей запятой) или использовать более точные временные метки и преобразовать их в разницу в 10 мс интервалах?

Вы можете использовать mktime для преобразования значения даты/времени в time_t .

ответил(а) 2013-02-01T16:21:00+04:00 8 лет, 9 месяцев назад

Указывает дату и время, используя отдельных членов для месяца, дня, года, дня недели, часа, минуты, секунды и миллисекунды. Время либо в скоординированном универсальном времени (UTC), либо в местном времени, в зависимости от вызываемой функции.

Ближайшим типом будет struct tm , хотя он не имеет миллисекунд.

Содержит 64-битное значение, представляющее число 100-наносекундных интервалов с 1 января 1601 года (UTC).

Вы можете использовать struct timeval (поддерживает микросекунды) или struct timespec (поддерживает наносекунды)

Не все файловые системы поддерживают наносекунды, например, ext4 .

Вы можете использовать mktime для этого, хотя вы получите только секунды с эпохи (1970-01-01 00:00 UTC).

Пытался найти полный аналог функции SystemTimeToFileTime, но не нашел.

У меня есть все структуры SYSTEMTIME и FILETIME с правильно работающим SYSTEMTIME в Linux для функции разницы дат:

Кто-нибудь знает точную замену функции SystemTimeToFileTime ?

4 ответа

Я предлагаю вам обратиться к источникам проекта WINE, которые содержат именно то, что вам нужно.

Задает дату и время, используя отдельные элементы для месяца, дня, года, дня недели, часа, минуты, секунды и миллисекунды. Время указывается либо по всемирному координированному времени (UTC), либо по местному времени, в зависимости от вызываемой функции.

Ближайшим типом будет struct tm , хотя у него нет миллисекунд.

Содержит 64-битное значение, представляющее количество 100-наносекундных интервалов с 1 января 1601 года (UTC).

Вы можете использовать struct timeval (поддерживает микросекунды) или struct timespec (поддерживает наносекунды)

Не все файловые системы поддерживают наносекунды, например ext4 .

Вы можете использовать для этого mktime , хотя с начала эпохи вы получите только секунды (1970-01-01 00:00 UTC).

Так что, я бы сказал, точную замену, мягко говоря, сложно.

FILETIME - это просто отметка времени с разрешением 10 миллисекунд, разделенная на два 32-битных числа. Отметку времени POSIX (со вторым разрешением) можно просто умножить на 100, чтобы получить это.

Чтобы перейти от SYSTEMTIME к FILETIME , вы можете создать struct tm с соответствующими полями и использовать mktime для создания time_t . Поместите эту метку времени в 64-битное целое число, умножьте 100 (чтобы получить разрешение 10 миллисекунд) и добавьте поле SYSTEMTIME wMilliseconds (разделенное на 10), и вы получите FILETIME .

В Linux нет понятия «файловое время» как такового. В зависимости от того, что именно вы делаете, может быть лучше использовать difftime (указать разницу между двумя time_t в секундах в виде числа с плавающей запятой) или использовать более точные временные метки и преобразовать их в разницу в 10-миллисекундных интервалах. ?

Вы можете использовать mktime для преобразования значения даты / времени в time_t .

image


КДПВ

От переводчика:
Большинство моих знакомых для измерения времени в разного вида бенчмарках в С++ используют chrono или, в особо запущенных случаях, ctime . Но для бенчмаркинга гораздо полезнее замерять процессорное время. Недавно я наткнулся на статью о кроссплатформенном замере процессорного времени и решил поделиться ею тут, возможно несколько увеличив качество местных бенчмарков.

P.S. Когда в статье написано "сегодня" или "сейчас", имеется ввиду "на момент выхода статьи", то есть, если я не ошибаюсь, март 2012. Ни я, ни автор не гарантируем, что это до сих пор так.
P.P.S. На момент публикации оригинал недоступен, но хранится в кэше Яндекса

Функции API, позволяющие получить процессорное время, использованное процессом, отличаются в разных операционных системах: Windows, Linux, OSX, BSD, Solaris, а также прочих UNIX-подобных ОС. Эта статья предоставляет кросс-платформенную функцию, получающую процессорное время процесса и объясняет, какие функции поддерживает каждая ОС.

Процессорное время увеличивается, когда процесс работает и потребляет циклы CPU. Во время операций ввода-вывода, блокировок потоков и других операций, которые приостанавливают работу процессора, процессорное время не увеличивается пока процесс снова не начнет использовать CPU.

Разные инструменты, такие как ps в POSIX, Activity Monitor в OSX и Task Manager в Windows показывают процессорное время, используемое процессами, но часто бывает полезным отслеживать его прямо из самого процесса. Это особенно полезно во время бенчмаркинга алгоритмов или маленькой части сложной программы. Несмотря на то, что все ОС предоставляют API для получения процессорного времени, в каждой из них есть свои тонкости.

Функция getCPUTime( ) , представленная ниже, работает на большинстве ОС (просто скопируйте код или скачайте файл getCPUTime.c). Там, где это нужно, слинкуйтесь с librt, чтобы получить POSIX-таймеры (например, AIX, BSD, Cygwin, HP-UX, Linux и Solaris, но не OSX). В противном случае, достаточно стандартных библиотек.

Использование

Чтобы замерить процессорное время алгоритма, вызовите getCPUTime( ) до и после запуска алгоритма, и выведите разницу. Не стоит предполагать, что значение, возвращенное при единичном вызове функции, несет какой-то смысл.

Каждая ОС предоставляет один или несколько способов получить процессорное время. Однако некоторые способы точнее остальных.


OS clock clock_gettime GetProcessTimes getrusage times
AIX yes yes yes yes
BSD yes yes yes yes
HP-UX yes yes yes yes
Linux yes yes yes yes
OSX yes yes yes
Solaris yes yes yes yes
Windows yes

Каждый из этих способов подробно освещен ниже.

GetProcessTimes( )

На Windows и Cygwin (UNIX-подобная среда и интерфейс командной строки для Windows), функция GetProcessTimes( ) заполняет структуру FILETIME процессорным временем, использованным процессом, а функция FileTimeToSystemTime( ) конвертирует структуру FILETIME в структуру SYSTEMTIME, содержащую пригодное для использования значение времени.

Доступность GetProcessTimes( ): Cygwin, Windows XP и более поздние версии.

Получение процессорного времени:

clock_gettme( )

На большинстве POSIX-совместимых ОС, clock_gettime( ) (смотри мануалы к AIX, BSD, HP-UX, Linux и Solaris) предоставляет самое точное значение процессорного времени. Первый аргумент функции выбирает "clock id", а второй это структура timespec , заполняемая использованным процессорным временем в секундах и наносекундах. Для большинства ОС, программа должна быть слинкована с librt.

Однако, есть несколько тонкостей, затрудняющих использование этой функции в кросс-платформенном коде:

  • Функция является опциональной частью стандарта POSIX и доступна только если _POSIX_TIMERS определен в <unistd.h> значением больше 0. На сегодняшний день, AIX, BSD, HP-UX, Linux и Solaris поддерживают эту функцию, но OSX не поддерживает.
  • Структура timespec , заполняемая функцией clock_gettime( ) может хранить время в наносекундах, но точность часов отличается в разных ОС и на разных системах. Функция clock_getres( ) возвращает точность часов, если она вам нужна. Эта функция, опять-таки, является опциональной частью стандарта POSIX, доступной только если _POSIX_TIMERS больше нуля. На данный момент, AIX, BSD, HP-UX, Linux и Solaris предоставляют эту функцию, но в Solaris она не работает. определяет имена нескольких стандартных значений "clock id", включая CLOCK_PROCESS_CPUTIME_ID , чтобы получить процессорное время процесса. Тем не менее, сегодня BSD и HP-UX не имеют этого id, и взамен определяют собственный id CLOCK_VIRTUAL для процессорного времени. Чтобы запутать все ещё больше, Solaris определяет оба этих, но использует CLOCK_VIRTUAL для процессорного времени потока, а не процесса.
  • Вместо того, чтобы использовать одну из констант, объявленных выше, функция clock_getcpuclockid( ) возвращает таймер для выбранного процесса. Использование процесса 0 позволяет получить процессорное время текущего процесса. Однако, это ещё одна опциональная часть стандарта POSIX и доступна только если _POSIX_CPUTIME больше 0. На сегодняшний день, только AIX и Linux предоставляют эту функцию, но линуксовские include-файлы не определяют _POSIX_CPUTIME и функция возвращает ненадёжные и несовместимые с POSIX результаты.
  • Функция clock_gettime( ) может быть реализована с помощью регистра времени процессора. На многопроцессорных системах, у отдельных процессоров может быть несколько разное восприятие времени, из-за чего функция может возвращать неверные значения, если процесс передавался от процессора процессору. На Linux, и только на Linux, это может быть обнаружено, если clock_getcpuclockid( ) возвращает не-POSIX ошибку и устанавливает errno в ENOENT . Однако, как замечено выше, на Linux clock_getcpuclockid( ) ненадежен.

Доступность clock_gettime( ): AIX, BSD, Cygwin, HP-UX, Linux и Solaris. Но clock id на BSD и HP-UX нестандартные.

Доступность clock_getres( ): AIX, BSD, Cygwin, HP-UX и Linux, но не работает Solaris.

Доступность clock_getcpuclockid( ): AIX и Cygwin, не недостоверна на Linux.

Получение процессорного времени:

getrusage( )

На всех UNIX-подобных ОС, функция getrusage( ) это самый надежный способ получить процессорное время, использованное текущим процессом. Функция заполняет структуру rusage временем в секундах и микросекундах. Поле ru_utime содержит время проведенное в user mode, а поле ru_stime — в system mode от имени процесса.

Внимание: Некоторые ОС, до широкого распространения поддержки 64-бит, определяли функцию getrusage( ) , возвращающую 32-битное значение, и функцию getrusage64( ) , возвращающую 64-битное значение. Сегодня, getrusage( ) возвращает 64-битное значение, а getrusage64( ) устарело.

Доступность getrusage( ): AIX, BSD, Cygwin, HP-UX, Linux, OSX, and Solaris.

Получение процессорного времени:

times( )

На всех UNIX-подобных ОС, устаревшая функция times( ) заполняет структуру tms с процессорным временем в тиках, а функция sysconf( ) возвращает количество тиков в секунду. Поле tms_utime содержит время, проведенное в user mode, а поле tms_stime — в system mode от имени процесса.

Внимание: Более старый аргумент функции sysconf( ) CLK_TCK устарел и может не поддерживаться в некоторых ОС. Если он доступен, функция sysconf( ) обычно не работает при его использовании. Используйте _SC_CLK_TCK вместо него.

Доступность times( ): AIX, BSD, Cygwin, HP-UX, Linux, OSX и Solaris.

Получение процессорного времени:

clock( )

На всех UNIX-подобных ОС, очень старая функция clock( ) возвращает процессорное время процесса в тиках, а макрос CLOCKS_PER_SEC количество тиков в секунду.

Заметка: Возвращенное процессорное время включает в себя время проведенное в user mode И в system mode от имени процесса.

Внимание: Хотя изначально CLOCKS_PER_SEC должен был возвращать значение, зависящее от процессора, стандарты C ISO C89 и C99, Single UNIX Specification и стандарт POSIX требуют, чтобы CLOCKS_PER_SEC имел фиксированное значение 1,000,000, что ограничивает точность функции микросекундами. Большинство ОС соответствует этим стандартам, но FreeBSD, Cygwin и старые версии OSX используют нестандартные значения.

Внимание: На AIX и Solaris, функция clock( ) включает процессорное время текущего процесса И и любого завершенного дочернего процесса для которого родитель выполнил одну из функций wait( ) , system( ) или pclose( ) .

Внимание: В Windows, функция clock( ) поддерживается, но возвращает не процессорное, а реальное время.

Доступность clock( ): AIX, BSD, Cygwin, HP-UX, Linux, OSX и Solaris.

Получение процессорного времени:

Другие подходы

Существуют и другие ОС-специфичные способы получить процессорное время. На Linux, Solarisи некоторых BSD, можно парсить /proc/[pid]/stat, чтобы получить статистику процесса. На OSX, приватная функция API proc_pidtaskinfo( ) в libproc возвращает информацию о процессе. Также существуют открытые библиотеки, такие как libproc, procps и Sigar.

На UNIX существует несколько утилит позволяющих отобразить процессорное время процесса, включая ps, top, mpstat и другие. Можно также использовать утилиту time, чтобы отобразить время, потраченное на команду.

На Windows, можно использовать диспетчер задач, чтобы мониторить использование CPU.

На OSX, можно использовать Activity Monitor, чтобы мониторить использование CPU. Утилита для профайлинга Instruments поставляемая в комплекте с Xcode может мониторить использование CPU, а также много других вещей.

Читайте также: