LINUXC 时间相关操作

news2025/1/6 15:59:15

文章目录

      • 时间戳
      • 获取本地时间
      • struct tm 结构体
      • 高精度的时间
      • struct timeval 结构体
      • 相关函数
        • time()
        • localtime()
        • gmtime()
        • gettimeofday()
        • strftime()
        • mktime()
      • 示例代码

时间戳

时间戳是指计算机中存储的数字型时间。它是以一个特定的时间点作为起点(通常是1970年1月1日0时0分0秒)开始,直到当前时间经过的秒数,即唯一标识了某一个时间的数字。时间戳也被称为日历时间,在linux系统中时间戳是一个long int 类型,可以用time函数获取。

获取本地时间

通过使用 localtime() 函数,可以将时间戳(秒数)转换为 struct tm 结构体,对应本地时区。
通过使用gmtime() 函数,可以将时间戳(秒数)转换为 struct tm 结构体,对应格林尼治标准时间(GMT)。

struct tm 结构体

struct tm {
    int tm_sec;   // 秒,范围从 0 到 59
    int tm_min;   // 分,范围从 0 到 59
    int tm_hour;  // 时,范围从 0 到 23
    int tm_mday;  // 一个月中的日,范围从 1 到 31
    int tm_mon;   // 月份,范围从 0 到 11
    int tm_year;  // 年份,从 1900 开始
    int tm_wday;  // 一周中的日,范围从 0 (周日) 到 6 (周六)
    int tm_yday;  // 一年中的日,范围从 0 到 365
    int tm_isdst; // 夏令时标识
};

**注意:**在struct tm 中 年份的表示是从1900年开始到现在的年份的个数,使用时需要加1900,才能表示现在的年份。

高精度的时间

通过time函数的得到的时间戳只能精确到秒级别,想要获取高精度时间达到微妙级别需要使用函数 gettimeofday 和结构体struct timeval。

struct timeval 结构体

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

相关函数

time()
#include <time.h>
time_t time(time_t *tloc);

Linux下可以使用time()来查看当前时间,这个函数会计算从1970年1月1号00:00(UTC)到当前的时间跨度。秒级别。

localtime()
struct tm *localtime(const time_t *timep);

将时间戳转化为本地时间

gmtime()
struct tm *gmtime(const time_t *timep);

将时间戳转化为格林尼治标准时间。

gettimeofday()
#include <sys/time.h>

// 调用成功返回0,失败返回-1
int gettimeofday(struct timeval *tv, struct timezone *tz);

Linux下可以使用gettimeofday()来查看当前时间,这个函数会计算从1970年1月1号00:00(UTC)到当前的时间跨度。该函数所算出的时间跨度会存放在第一个参数tv里。时间跨度可以精确到微妙,time_t和suseconds_t的实际类型是long int。日常使用时,只需传第一个参数,第二个参数传NULL(因为linux内核不会使用这个参数)

strftime()
size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);

将struct tm 转化为格式化字符串。

mktime()
time_t mktime(struct tm *tm);

所指向的结构转换为自 1970 年 1 月 1 日以来持续时间的秒数,发生错误时返回-1。

示例代码

改代码实现一部分ls命令的功能,会用到时间的转换

getstatus.c

#include "getstatus.h"
#include <bits/types/time_t.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#define FILE_TYPE_MASK 0xF000


typedef unsigned int u32;

char file_type[7]={'p','c','d','b','-','l','s'};
char file_wr[][4]={"---\0","--x\0","-w-\0","-wx\0","r--\0","r-x\0","rw-\0","rwx\0"};

int show_time(time_t time)
{
    time_t t = time;
    struct tm * p = localtime(&t);

    int year = p->tm_year + 1900;
    int month = p->tm_mon + 1;
    int day = p->tm_mday;
    int h = p->tm_hour;
    int m = p->tm_min;
    int s = p->tm_sec;
    printf("%02d月 %02d %04d %02d:%02d ",month,day,year,h,m);
    return 0;

}




void get_filestatus(struct stat * status)
{
    u32 information = status->st_mode;
    //获取文件类型
    int tmp = ((information & FILE_TYPE_MASK)>>12)/2;
    printf("%c",file_type[tmp]);
    //所有者权限
    tmp = (information & 0x01c0)>>6;
    printf("%s",file_wr[tmp]);
    //所有组权限
    tmp = (information & 0x0038)>>3;
    printf("%s",file_wr[tmp]);
    //other
    tmp = (information & 0x0007);
    printf("%s",file_wr[tmp]);

    printf(" %ld ",status->st_nlink);
    //获取user name
    struct passwd * pwd = getpwuid(status->st_uid);
    printf(" %s ",pwd->pw_name);
    struct group * gwd = getgrgid(status->st_gid);
    printf(" %s ",gwd->gr_name);
    printf(" %6ld ",status->st_size);
    show_time(status->st_atim.tv_sec);

}

getstatus.h

#ifndef __GETSTATUS_H
#define __GETSTATUS_H

#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>

void get_filestatus(struct stat *status);

#endif


main.c

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "getstatus.h"
int main(int argc, char **argv)
{
    struct stat st;
    if (argc < 2)
    {
        printf("use: command filename1 filename2 ...\n");
        exit(-1);
    }
    for(int i=1;i<argc;i++)
    {
        stat(argv[i], &st);
        get_filestatus(&st);
        printf("%s \n",argv[i]);
    }
    while(1){}

}

效果

wangju@wangju-virtual-machine:~/learn/filestatus$ ls | xargs -i ./myls {}
-rw-rw-r-- 1  wangju  wangju    1491 01月 03 2025 14:33 getstatus.c 
-rw-rw-r-- 1  wangju  wangju     176 01月 03 2025 15:01 getstatus.h 
-rw-rw-r-- 1  wangju  wangju     478 01月 03 2025 14:33 main.c 
-rwxrwxr-x 1  wangju  wangju   17376 01月 03 2025 15:02 myls 
-rwxrwxr-x 1  wangju  wangju   17376 1227 2024 14:17 t 
drwxrwxr-x 2  wangju  wangju    4096 1226 2024 19:40 test 
wangju@wangju-virtual-machine:~/learn/filestatus$ ll
总用量 64
drwxrwxr-x  3 wangju wangju  4096 13 15:01 ./
drwxrwxr-x 11 wangju wangju  4096 12 14:50 ../
-rw-rw-r--  1 wangju wangju  1491 1226 19:38 getstatus.c
-rw-rw-r--  1 wangju wangju   176 13 15:00 getstatus.h
-rw-rw-r--  1 wangju wangju   478 1227 14:17 main.c
-rwxrwxr-x  1 wangju wangju 17376 1226 19:38 myls*
-rwxrwxr-x  1 wangju wangju 17376 1227 14:17 t*
drwxrwxr-x  2 wangju wangju  4096 1226 18:57 test/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2270938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Json字符串解析失败

通过第三方服务&#xff0c;拿到响应体的data对象&#xff08;拿到的时候对象是有值的&#xff09; 通过JSON.parseObject方法&#xff0c;拿到的对象&#xff0c;值为null 通过查看对应的json字符串&#xff0c;发现命名不一样... JSONField SeriealizedName注解是用来解析j…

网络安全 | 信息安全管理体系(ISMS)认证与实施

网络安全 | 信息安全管理体系&#xff08;ISMS&#xff09;认证与实施 一、前言二、信息安全管理体系&#xff08;ISMS&#xff09;概述2.1 ISMS 的定义与内涵2.2 ISMS 的核心标准 ——ISO/IEC 27001 三、信息安全管理体系&#xff08;ISMS&#xff09;认证3.1 认证的意义与价值…

《黄药师》药业管理软件 UploadFile 文件上传致RCE漏洞复现

0x01 产品简介 《黄药师》药业管理软件是一款针对我国医药或医疗器械企业经营管理特点而设计的综合管理软件。《黄药师》系列管理软件集进销存、财务、经营分析和GSP管理为一体,从企业经营的各个环节对资金流、物流、信息流等进行系统的管理。它采用“一看就懂,一学就会,一…

电子应用设计方案84:智能 AI 煤气灶系统设计

智能 AI 煤气灶系统设计 一、引言 智能 AI 煤气灶系统旨在提供更安全、便捷和高效的烹饪体验&#xff0c;结合人工智能技术实现智能化的控制和管理。 二、系统概述 1. 系统目标 - 精确控制火力大小&#xff0c;实现精准烹饪。 - 具备智能防干烧和熄火保护功能&#xff0c;确保…

带虚继承的类对象模型

文章目录 1、代码2、 单个虚继承3、vbptr是什么4、虚继承的多继承 1、代码 #include<iostream> using namespace std;class Base { public:int ma; };class Derive1 :virtual public Base { public:int mb; };class Derive2 :public Base { public:int mc; };class Deri…

python +tkinter绘制彩虹和云朵

python tkinter绘制彩虹和云朵 彩虹&#xff0c;简称虹&#xff0c;是气象中的一种光学现象&#xff0c;当太阳光照射到半空中的水滴&#xff0c;光线被折射及反射&#xff0c;在天空上形成拱形的七彩光谱&#xff0c;由外圈至内圈呈红、橙、黄、绿、蓝、靛、紫七种颜色。事实…

学习随想:高维AI数据的训练和推理与一维数据的排序和查找

以下是看Attention Is All You Need这篇文章的一点随想。 说实话&#xff0c;我没看懂transformer是咋回事&#xff0c;但突然一个类比念头&#xff0c;让我感觉有点概念了&#xff0c;虽然所有的类比都是不完备的。 学习随想记录如下&#xff0c;仅供查考&#xff1a; 物理世…

vue 处理二进制文件流下载,封装请求

后端返回的文件流 前端需要处理成下载文件 刚开始一直报错 处理的方法 // http.js import instance from ./axios;export const get (url, params {}, config {}) > instance.get(url, { params, ...config });// api.js /*** 获取下载错误信息* param {string} batchI…

LeetCode 热题 100_将有序数组转换为二叉搜索树(42_108_简单_C++)(二叉树;递归)

LeetCode 热题 100_将有序数组转换为二叉搜索树&#xff08;42_108&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;递归&#xff09;&#xff1a; 代码实现代码实现&#xff08;递归&#xff09;&#xff1…

Elasticsearch:利用 AutoOps 检测长时间运行的搜索查询

作者&#xff1a;来自 Elastic Valentin Crettaz 了解 AutoOps 如何帮助你调查困扰集群的长期搜索查询以提高搜索性能。 AutoOps 于 11 月初在 Elastic Cloud Hosted 上发布&#xff0c;它通过性能建议、资源利用率和成本洞察、实时问题检测和解决路径显著简化了集群管理。 Au…

Unity2022接入Google广告与支付SDK、导出工程到Android Studio使用JDK17进行打包完整流程与过程中的相关错误及处理经验总结

注&#xff1a;因为本人也是第一次接入广告与支付SDK相关的操作&#xff0c;网上也查了很多教程&#xff0c;很多也都是只言片语或者缺少一些关键步骤的说明&#xff0c;导致本人也是花了很多时间与精力踩了很多的坑才搞定&#xff0c;发出来也是希望能帮助到其他人在遇到相似问…

Spring实现Logback日志模板设置动态参数

版权说明&#xff1a; 本文由博主keep丶原创&#xff0c;转载请保留此块内容在文首。 原文地址&#xff1a; https://blog.csdn.net/qq_38688267/article/details/144842327 文章目录 背景设计日志格式实现配置动态取值logback-spring.xml 相关博客 背景 多个单体服务间存在少量…

element-ui dialog 组件源码分享

简单分享 dialog 组件源码&#xff0c;主要从以下三个方面&#xff1a; 1、dialog 页面结构。 2、dialog 组件属性。 3、dialog 组件挂载。 4、dialog 组件事件。 一、dialog 页面结构&#xff1a; 二、组件属性&#xff1a; 2.1 visible 是否显示 Dialog&#xff0c;支持…

Vue3 组件之插槽

文章目录 Vue3 组件之插槽概述默认插槽具名插槽默认内容插槽没有提供内容有提供内容 作用域插槽简单使用使用解构形式 Vue3 组件之插槽 概述 插槽专门用于父组件向子组件传递标签结构。在使用时&#xff0c;一般会在子组件中通过slot来声明占位&#xff0c;在父组件中&#x…

postgres docker安装

mkdir -p /root/postgresql/data docker pull postgres:14 docker run --privilegedtrue --name postgres -e POSTGRES_PASSWORD123456 -e ALLOW_IP_RANGE0.0.0.0/0 -p 5432:5432 -v /root/postgresql/data:/var/lib/postgresql/data -d postgres:14#地址&#xff1a;192.168.3…

探索Wiki:开源知识管理平台及其私有化部署

在如今的信息时代&#xff0c;企业和团队的知识管理变得愈发重要。如何有效地存储、整理、共享和协作&#xff0c;是提高团队效率和创新能力的关键因素之一。今天&#xff0c;我要为大家介绍一款非常有用的github上开源知识管理工具——Wiki&#xff0c;并分享它的私有化部署方…

Python多分类Logistic回归详解与实践

在机器学习中&#xff0c;Logistic回归是一种基本但非常有效的分类算法。它不仅可以用于二分类问题&#xff0c;还可以扩展应用于多分类问题。本文将详细介绍如何使用Python实现一个多分类的Logistic回归模型&#xff0c;并给出详细的代码示例。 一、Logistic回归简介 Logist…

打造三甲医院人工智能矩阵新引擎(三):多模态大模型篇-Med-Gemini多面手

一、引言 1.1 研究背景与意义 近年来,随着人工智能技术的迅猛发展,医疗多模态大模型如Med-Gemini应运而生,成为医疗领域的研究热点。这些模型整合了文本、影像、基因等多源数据,能够模拟人类医生的思维方式,为医疗决策提供全面、精准的支持,有望解决传统医疗模式中的诸…

Servlet解析

概念 Servlet是运行在服务端的小程序&#xff08;Server Applet)&#xff0c;可以处理客户端的请求并返回响应&#xff0c;主要用于构建动态的Web应用&#xff0c;是SpringMVC的基础。 生命周期 加载和初始化 默认在客户端第一次请求加载到容器中&#xff0c;通过反射实例化…

游戏如何检测iOS越狱

不同于安卓的开源生态&#xff0c;iOS一直秉承着安全性更高的闭源生态&#xff0c;系统中的硬件、软件和服务会经过严格审核和测试&#xff0c;来保障安全性与稳定性。 据FairGurd观察&#xff0c;虽然iOS系统具备一定的安全性&#xff0c;但并非没有漏洞&#xff0c;如市面上…