كيف يمكنني الحصول على utctime بالميلي ثانية منذ 1 يناير 1970 بلغة ج

StackOverflow https://stackoverflow.com/questions/1952290

  •  21-09-2019
  •  | 
  •  

سؤال

هل هناك أي طريقة للحصول على مللي ثانية وجزء الكسر من عام 1970 باستخدام Time.H باللغة C؟

هل كانت مفيدة؟

المحلول

هذا يعمل على Ubuntu Linux:

#include <sys/time.h>

...

struct timeval tv;

gettimeofday(&tv, NULL);

unsigned long long millisecondsSinceEpoch =
    (unsigned long long)(tv.tv_sec) * 1000 +
    (unsigned long long)(tv.tv_usec) / 1000;

printf("%llu\n", millisecondsSinceEpoch);

في وقت كتابة هذا التقرير ، تعطيني printf () أعلاه 1338850197035. يمكنك إجراء فحص عقلانية في timestampconvert.com موقع الويب حيث يمكنك إدخال القيمة لاستعادة الوقت المعادل القابل للقراءة الإنسان (وإن كان دون دقة ميلي ثانية).

نصائح أخرى

إذا كنت تريد حل ميلي ثانية ، فيمكنك استخدام GetTimeOfday () في Posix. للحصول على تطبيق Windows انظر وظيفة GetTimeOfday لنظام التشغيل Windows.

#include <sys/time.h>

...

struct timeval tp;
gettimeofday(&tp);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;

إنه ليس قياسيًا ، ولكن gettimeofday() موجود في كل من الأنظمة المستمدة من SYSV و BSD ، وهو في POSIX. يعيد الوقت منذ الحقبة في أ struct timeval:

struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};

بالنسبة إلى UNIX و Linux يمكنك استخدامه GetTimeofday.

لـ Win32 يمكنك استخدامه getSystemTimeAsfiletime وثم تحويله إلى time_t + milliseconds.

    // the system time
    SYSTEMTIME systemTime;
    GetSystemTime( &systemTime );

    // the current file time
    FILETIME fileTime;
    SystemTimeToFileTime( &systemTime, &fileTime );

    // filetime in 100 nanosecond resolution
    ULONGLONG fileTimeNano100;
    fileTimeNano100 = (((ULONGLONG) fileTime.dwHighDateTime) << 32) + fileTime.dwLowDateTime;

    //to milliseconds and unix windows epoche offset removed
    ULONGLONG posixTime = fileTimeNano100/10000 - 11644473600000;
    return posixTime;

unix time أو posix الوقت هو الوقت في ثوان منذ الحقبة التي ذكرتها.

بزابهيإجابة صحيحة: يمكنك ببساطة مضاعفة الطابع الزمني UNIX بمقدار 1000 للحصول على مللي ثانية.

كن على علم بأن جميع قيم المللي ثانية التي يتم إرجاعها من خلال الاعتماد على طابع الطابع الزمني UNIX ستكون المضاعفات من 1000 (مثل 12345678000). القرار لا يزال ثانية واحدة فقط.

لا يمكنك الحصول على جزء الكسر

التعليق من بافيل صحيح أيضا. الطابع الزمني UNIX لا يأخذ في الاعتبار قفزة ثواني. هذا يجعل من الحكمة الاعتماد على التحويل إلى ميلي ثانية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top