GNU/Linux >> Belajar Linux >  >> Linux

Spesifikasi waktu pemformatan struct

Salah satu cara untuk memformatnya adalah:

printf("%lld.%.9ld", (long long)ts.tv_sec, ts.tv_nsec);

Berikut ini akan menampilkan stempel waktu UTC yang sesuai dengan ISO8601 dan RFC3339, termasuk nanodetik.

Ini menggunakan strftime() , yang berfungsi dengan struct timespec sama halnya dengan struct timeval karena yang dipedulikannya hanyalah jumlah detik, yang disediakan keduanya. Nanodetik kemudian ditambahkan (hati-hati untuk menambahkan angka nol!) serta akhiran UTC 'Z'.

Contoh keluaran:2021-01-19T04:50:01.435561072Z

#include <stdio.h>
#include <time.h>
#include <sys/time.h>

int utc_system_timestamp(char[]);

int main(void) {
    char buf[31];
    utc_system_timestamp(buf);
    printf("%s\n", buf);
}

// Allocate exactly 31 bytes for buf
int utc_system_timestamp(char buf[]) {
    const int bufsize = 31;
    const int tmpsize = 21;
    struct timespec now;
    struct tm tm;
    int retval = clock_gettime(CLOCK_REALTIME, &now);
    gmtime_r(&now.tv_sec, &tm);
    strftime(buf, tmpsize, "%Y-%m-%dT%H:%M:%S.", &tm);
    sprintf(buf + tmpsize -1, "%09luZ", now.tv_nsec);
    return retval;
}

Contoh baris perintah GCC (perhatikan -lrt ):

gcc foo.c -o foo -lrt

Saya ingin menanyakan pertanyaan yang sama. Inilah solusi saya saat ini untuk mendapatkan string seperti ini:2013-02-07 09:24:40.749355372 Saya tidak yakin apakah ada solusi yang lebih mudah dari ini, tetapi setidaknya format string dapat dikonfigurasi secara bebas dengan pendekatan ini.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define NANO 1000000000L

// buf needs to store 30 characters
int timespec2str(char *buf, uint len, struct timespec *ts) {
    int ret;
    struct tm t;

    tzset();
    if (localtime_r(&(ts->tv_sec), &t) == NULL)
        return 1;

    ret = strftime(buf, len, "%F %T", &t);
    if (ret == 0)
        return 2;
    len -= ret - 1;

    ret = snprintf(&buf[strlen(buf)], len, ".%09ld", ts->tv_nsec);
    if (ret >= len)
        return 3;

    return 0;
}

int main(int argc, char **argv) {
    clockid_t clk_id = CLOCK_REALTIME;
    const uint TIME_FMT = strlen("2012-12-31 12:59:59.123456789") + 1;
    char timestr[TIME_FMT];

    struct timespec ts, res;
    clock_getres(clk_id, &res);
    clock_gettime(clk_id, &ts);

    if (timespec2str(timestr, sizeof(timestr), &ts) != 0) {
        printf("timespec2str failed!\n");
        return EXIT_FAILURE;
    } else {
        unsigned long resol = res.tv_sec * NANO + res.tv_nsec;
        printf("CLOCK_REALTIME: res=%ld ns, time=%s\n", resol, timestr);
        return EXIT_SUCCESS;
    }
}

keluaran:

gcc mwe.c -lrt 
$ ./a.out 
CLOCK_REALTIME: res=1 ns, time=2013-02-07 13:41:17.994326501

Linux
  1. Pemformatan Namenode Dalam Instalasi Hadoop?

  2. men-debug template dengan GDB

  3. Membatasi akses syscall untuk aplikasi Linux

  1. 6 opsi pemformatan tcpdump tingkat lanjut

  2. struct sigaction kesalahan tidak lengkap

  3. Bagaimana cara meneruskan parameter ke panggilan sistem Linux?

  1. bagaimana saya bisa mencegat panggilan sys linux?

  2. Bagaimana cara mendeteksi perubahan alamat IP secara terprogram di Linux?

  3. Linux API untuk mendaftar proses yang sedang berjalan?