如何在 Linux 中用 C 获取当前时间(以毫秒为单位)?

2024-10-24 08:50:00
admin
原创
244
摘要:问题描述:如何以毫秒为单位获取 Linux 上的当前时间?解决方案 1:这可以使用POSIXclock_gettime函数实现。在当前版本的 POSIX 中,gettimeofday被标记为已过时。这意味着它可能会在将来的版本中被删除。鼓励应用程序编写者使用 函数clock_gettime来代替gettime...

问题描述:

如何以毫秒为单位获取 Linux 上的当前时间?


解决方案 1:

这可以使用POSIXclock_gettime函数实现。

在当前版本的 POSIX 中,gettimeofday被标记为已过时。这意味着它可能会在将来的版本中被删除。鼓励应用程序编写者使用 函数clock_gettime来代替gettimeofday

以下是如何使用的示例clock_gettime

#define _POSIX_C_SOURCE 200809L

#include <inttypes.h>
#include <math.h>
#include <stdio.h>
#include <time.h>

void print_current_time_with_ms (void)
{
    long            ms; // Milliseconds
    time_t          s;  // Seconds
    struct timespec spec;

    clock_gettime(CLOCK_REALTIME, &spec);

    s  = spec.tv_sec;
    ms = round(spec.tv_nsec / 1.0e6); // Convert nanoseconds to milliseconds
    if (ms > 999) {
        s++;
        ms = 0;
    }

    printf("Current time: %"PRIdMAX".%03ld seconds since the Epoch
",
           (intmax_t)s, ms);
}

如果您的目标是测量经过的时间,并且您的系统支持“单调时钟”选项,那么您应该考虑使用CLOCK_MONOTONIC而不是CLOCK_REALTIME

解决方案 2:

你必须做这样的事:

struct timeval  tv;
gettimeofday(&tv, NULL);

double time_in_mill = 
         (tv.tv_sec) * 1000 + (tv.tv_usec) / 1000 ; // convert tv_sec & tv_usec to millisecond

解决方案 3:

以下是获取当前时间戳(以毫秒为单位)的实用函数:

#include <sys/time.h>

long long current_timestamp() {
    struct timeval te; 
    gettimeofday(&te, NULL); // get current time
    long long milliseconds = te.tv_sec*1000LL + te.tv_usec/1000; // calculate milliseconds
    // printf("milliseconds: %lld
", milliseconds);
    return milliseconds;
}

关于时区

gettimeofday()支持指定时区,我使用NULL,忽略时区,但如果需要,您可以指定时区。


@Update-时区

由于long时间的表示与时区本身无关或不受其影响,因此设置tzgettimeofday() 的参数是没有必要的,因为它不会产生任何区别。

并且,根据的手册gettimeofday(),该结构的使用timezone已经过时,因此该tz参数通常应指定为 NULL,有关详细信息,请检查手册页。

解决方案 4:

用于gettimeofday()获取秒和微秒的时间。合并并四舍五入为毫秒留作练习。

解决方案 5:

C11timespec_get

它返回最多纳秒的时间,四舍五入到实现的分辨率。

它已经在 Ubuntu 15.10 中实现。API 看起来与 POSIX 相同clock_gettime

#include <time.h>
struct timespec ts;
timespec_get(&ts, TIME_UTC);
struct timespec {
    time_t   tv_sec;        /* seconds */
    long     tv_nsec;       /* nanoseconds */
};

更多详细信息请访问:https: //stackoverflow.com/a/36095407/895245

解决方案 6:

源自 Dan Moulding 的 POSIX 答案,这应该有效:

#include <time.h>
#include <math.h>

long millis(){
    struct timespec _t;
    clock_gettime(CLOCK_REALTIME, &_t);
    return _t.tv_sec*1000 + lround(_t.tv_nsec/1e6);
}

David Guyon 还指出:使用 -lm 进行编译

解决方案 7:

此版本不需要数学库,并检查了clock_gettime()的返回值。

#include <time.h>
#include <stdlib.h>
#include <stdint.h>

/**
 * @return milliseconds
 */
uint64_t get_now_time() {
  struct timespec spec;
  if (clock_gettime(1, &spec) == -1) { /* 1 is CLOCK_MONOTONIC */
    abort();
  }

  return spec.tv_sec * 1000 + spec.tv_nsec / 1e6;
}

解决方案 8:

Jirka Justra 的答案返回一个 long,通常为 32 位。自 1970 年 unix 时间 0 以来的毫秒数需要更多位,因此数据类型应为 long long 或 unsigned long long,通常为 64 位。此外,正如 Kevin Thibedeau 所评论的那样,舍入可以在不转换为浮点或使用 math.h 的情况下完成。

#include <time.h>
long long millis () {
  struct timespec t ;
  clock_gettime ( CLOCK_REALTIME , & t ) ;
  return t.tv_sec * 1000 + ( t.tv_nsec + 500000 ) / 1000000 ;
}

如果您要测量少于 50 天的时间,32 位就足够了。大多数计算机上的数据类型 int 是 32 位或 64 位,因此数据类型可以是 unsigned int。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2593  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1555  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   32  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   28  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   24  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用