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

2024-10-24 08:50:00
admin
原创
80
摘要:问题描述:如何以毫秒为单位获取 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。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用