返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言Unix时间戳与本地时间的转化
  • 797
分享到

C语言Unix时间戳与本地时间的转化

2023-06-06 18:06:53 797人浏览 泡泡鱼
摘要

本篇内容主要讲解“C语言Unix时间戳与本地时间的转化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言Unix时间戳与本地时间的转化”吧!前言我们平常说时间都说的几点几分几秒,星期几,但是在

本篇内容主要讲解“C语言Unix时间戳与本地时间的转化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言Unix时间戳与本地时间的转化”吧!

前言

我们平常说时间都说的几点几分几秒,星期几,但是在计算机里面并不是直接使用我们所说的时间,而是使用Unix时间戳,这样不管是哪个平台,哪个系统,都可以根据自己对时间的定义进行转换,像Java,PHP等都提供了接口来进行转化,C库里面也有这样的函数,那具体是怎么实现的呢?要了解这个问题首先我们就必须要清楚什么是Unix时间戳,什么是我们平常使用的时间。

1. Unix时间戳

UNIX时间戳:Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp)

是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。

UNIX时间戳的0按照ISO 8601规范为 :1970-01-01T00:00:00Z.

一个小时表示为UNIX时间戳格式为:3600秒;一天表示为UNIX时间戳为86400秒,闰秒不计算。

在大多数的UNIX系统中UNIX时间戳存储为32位,这样会引发2038年问题或Y2038。

对应的时间和秒数如下

时间
1 分钟60 秒
1 小时3600 秒
1 天86400 秒
1 周604800 秒
1 月 (30.44 天)2629743 秒
1 年 (365.24 天)31556926 秒

2. 本地时间

平常我们最常听见的是阴历和阳历之分,阴历是按照月亮的运行规律来计算日期的,那我们所说的阳历又是什么呢?其实阳历或者说叫西历最早是叫做儒略历,是由罗马共和国独裁官儒略·恺撒(即盖乌斯·尤里乌斯·凯撒)采纳数学家兼天文学家索西琴尼的计算后,于公元前45年1月1日起执行的取代旧罗马历法的一种历法,但令人遗憾的是,当时那些颁发历书的祭司们,却不了解改历的实质。结果,可笑的是,当时罗马执掌颁布历书的祭司竟把原来历法上规定的“每隔三年置闰”误解为“每三年置一闰”。从公元前45年起,到公元前9年为止,这之间本应设置10个闰年,他们却设置了13个闰年。公元前9年,人们终于发现这一差错,这时恺撒的外甥奥古斯都执掌政权,他纠正了这个错误,才停止了“三年一闰”。奥古斯都下令改正过来,改到次年(公元前8年)才置闰年。当改正这种闰年的错误时已经多闰了3年,为了去掉着多闰的3年,奥古斯都又下令停闰3年,即以公元前5年、公元前1年、公元前4年仍为平年,以后恢复了每4年一闰的规定了。奥古斯都为了宣扬这一功劳,仿效儒略·恺撒的做法,下令把自己出生的儒略历中的8月改称为奥古斯都月(这一名称在西方沿用到今天)。8月后的大,小月份都翻转过来了,9月为30天,10月为31天,11月为30天,12月为31天,这种置月方式一直沿用至今。如此一来,一年多出了一天,于是也从二月份29天里再减去一天,二月份只剩下28天了 1582年罗马教皇格里高利对”儒略历”又进行修改,规定被4整除的年为闰年,但逢百之年只有能被400除尽才能是闰年。这就是使用至今的“格里历”。这样做是为了使历年与回归年相接近。回归年的周期是365.2425天。儒略历一年的平均长度为365.25日,比回归年(365.2425天)长11分14秒,自公元325年(该年采用儒略历作为宗教日历)积累到十六世纪末,春分日由3月21日提早到3月11日。于是罗马教皇格里高利十三世(GreGorius XⅢ)于1582年10月4日还下令将次日(即原10月5日)定为10月15日,把春分日又恢复为3月21日。这样,1582年的10月5日-14日这十天就成了“不存在”的日子,变为历史的空白。1949年9月27日,经过中国人民政治协商会议第一届全体会议通过,中华人民共和国使用国际社会多数国家通用的西历和西元作为历法和纪年。

3. 蔡勒公式

清楚了Unix时间戳和公历的意义,怎么讲秒数转化成本地时间大家心里应该有个大概了,既然本地时间知道了,那我们可不可以根据这个日期直接知道那一天是星期几呢?数学家蔡勒(Zeller)推算出了这个公式,大家称为蔡勒公式,使用这个公式随便给出一个日期,就可以计算出是星期几。

公式具体是这样的

W = [C / 4] - 2C + y + [y / 4] + [13 * (M + 1) / 5] + d - 1

或者是:w = y + [y / 4] + [c / 4] - 2c + [26(m + 1) / 10] + d - 1

公式中的符号含义如下:

w:星期; w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六

c:世纪-1(前两位数)

y:年(后两位数)

m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)

d:日 [ ]代表取整,即只要整数部分。

下面以中华人民共和国成立100周年纪念日那天(2049年10月1日)来计算是星期几,过程如下:

w = y + [y / 4] + [c / 4] - 2c + [26(m + 1) / 10] + d - 1

= 49 + [49 / 4] + [20 / 4] - 2 × 20 + [26 × (10 + 1) / 10] + 1 - 1

= 49 + [12.25] + 5 - 40 + [28.6]

= 49 + 12 + 5 - 40 + 28

= 54 (除以7余5)

即2049年10月1日(100周年国庆)是星期五。

再比如计算2006年4月4日,过程如下:

w = y + [y / 4] + [c / 4] - 2c + [26(m + 1) / 10] + d - 1

= 6 + [6 / 4] + [20 / 4] - 2 * 20 + [26 * (4 + 1) / 10] + 4 - 1

= -12 (除以7余5,注意对负数的取模运算!实际上应该是星期二而不是星期五)

不过要注意的是,蔡勒公式只适合于1582年(明朝万历十年)10月15日之后的情形。

4. 具体实现

清楚了上面这些内容,我们来看一下用C怎么实现Unix时间戳和本地时间的相互转化,并根据指定的时间算出对应的日期

#include <stdio.h>#include <stdbool.h>#define UTC_BASE_YEAR 1970#define MONTH_PER_YEAR 12#define DAY_PER_YEAR 365#define SEC_PER_DAY 86400#define SEC_PER_HOUR 3600#define SEC_PER_MIN 60const unsigned char g_day_per_mon[MONTH_PER_YEAR] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};typedef struct{ unsigned short nYear; unsigned char nMonth; unsigned char nDay; unsigned char nHour; unsigned char nMin; unsigned char nSec; unsigned char DayIndex; } mytime_struct;unsigned char applib_dt_is_leap_year(unsigned short year){       if ((year % 400) == 0) { return 1; } else if ((year % 100) == 0) { return 0; } else if ((year % 4) == 0) { return 1; } else { return 0; }}unsigned char applib_dt_last_day_of_mon(unsigned char month, unsigned short year){       if ((month == 0) || (month > 12)) { return g_day_per_mon[1] + applib_dt_is_leap_year(year); } if (month != 2) { return g_day_per_mon[month - 1]; } else { return g_day_per_mon[1] + applib_dt_is_leap_year(year); }}unsigned char applib_dt_dayindex(unsigned short year, unsigned char month, unsigned char day){ char century_code, year_code, month_code, day_code; int week = 0; century_code = year_code = month_code = day_code = 0; if (month == 1 || month == 2) { century_code = (year - 1) / 100; year_code = (year - 1) % 100; month_code = month + 12; day_code = day; } else { century_code = year / 100; year_code = year % 100; month_code = month; day_code = day; }  week = year_code + year_code / 4 + century_code / 4 - 2 * century_code + 26 * ( month_code + 1 ) / 10 + day_code - 1; week = week > 0 ? (week % 7) : ((week % 7) + 7); return week;}void utc_sec_2_mytime(unsigned int utc_sec, mytime_struct *result, bool daylightSaving){    int sec, day; unsigned short y; unsigned char m; unsigned short d; unsigned char dst;    if (daylightSaving) { utc_sec += SEC_PER_HOUR; }   sec = utc_sec % SEC_PER_DAY; result->nHour = sec / SEC_PER_HOUR;  sec %= SEC_PER_HOUR; result->nMin = sec / SEC_PER_MIN;  result->nSec = sec % SEC_PER_MIN;    day = utc_sec / SEC_PER_DAY; for (y = UTC_BASE_YEAR; day > 0; y++) { d = (DAY_PER_YEAR + applib_dt_is_leap_year(y)); if (day >= d) {  day -= d; } else {  break; } } result->nYear = y; for (m = 1; m < MONTH_PER_YEAR; m++) { d = applib_dt_last_day_of_mon(m, y); if (day >= d) {  day -= d; } else {  break; } } result->nMonth = m; result->nDay = (unsigned char) (day + 1);  result->DayIndex = applib_dt_dayindex(result->nYear, result->nMonth, result->nDay);}unsigned int mytime_2_utc_sec(mytime_struct *currTime, bool daylightSaving){    unsigned short i; unsigned int no_of_days = 0; int utc_time; unsigned char dst;    if (currTime->nYear < UTC_BASE_YEAR) { return 0; }  for (i = UTC_BASE_YEAR; i < currTime->nYear; i++) { no_of_days += (DAY_PER_YEAR + applib_dt_is_leap_year(i)); }  for (i = 1; i < currTime->nMonth; i++) { no_of_days += applib_dt_last_day_of_mon((unsigned char) i, currTime->nYear); }  no_of_days += (currTime->nDay - 1);  utc_time = (unsigned int) no_of_days * SEC_PER_DAY + (unsigned int) (currTime->nHour * SEC_PER_HOUR +        currTime->nMin * SEC_PER_MIN + currTime->nSec); if (dst && daylightSaving) { utc_time -= SEC_PER_HOUR; } return utc_time;}int main(int arGC, char *argv[]){ mytime_struct my_time; unsigned int sec; char *DayIndex[] = {"Sun.", "Mon.", "Tues.", "Wed.", "Thur.", "Fri.", "Sat."};  utc_sec_2_mytime(1484537668 + 8 * SEC_PER_HOUR, &my_time, false); printf("%d-%d-%d %d:%d:%d %s\n", my_time.nYear, my_time.nMonth, my_time.nDay,  my_time.nHour, my_time.nMin, my_time.nSec, DayIndex[my_time.DayIndex]); sec = mytime_2_utc_sec(&my_time, false); printf("sec = %d\n", sec); return 0;}

基本上的内容就这些了,平常最好能够直接使用系统提供的接口,如果不能使用的话就自己实现,根据上面的代码修改成自己需要的,如果有不对的地方,希望能够批评指正

总结

到此,相信大家对“C语言Unix时间戳与本地时间的转化”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: C语言Unix时间戳与本地时间的转化

本文链接: https://lsjlt.com/news/248202.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言Unix时间戳与本地时间的转化
    本篇内容主要讲解“C语言Unix时间戳与本地时间的转化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言Unix时间戳与本地时间的转化”吧!前言我们平常说时间都说的几点几分几秒,星期几,但是在...
    99+
    2023-06-06
  • python unix时间戳与正常时间转
            有时候业务需要,需要把正常的时间格式与unix时间戳格式进行转换。       在python中转化方式如下,直接利用time中的函数: #! /usr/bin/env python #coding:utf-8 impo...
    99+
    2023-01-31
    时间 python unix
  • UTC时间、GMT时间、本地时间、Unix时间戳的具体使用
    目录1.UTC时间 与 GMT时间2.UTC时间 与 本地时3.UTC 与 Unix时间戳1.UTC时间 与 GMT时间 我们可以认为格林威治时间就是时间协调时间(GMT=UTC),...
    99+
    2024-04-02
  • php时间如何转unix时间戳
    这篇文章主要介绍“php时间如何转unix时间戳”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php时间如何转unix时间戳”文章能帮助大家解决问题。使用 time() 函数获取当前时间的 Unix...
    99+
    2023-07-05
  • C语言怎么把时间戳转换成时间
    本篇内容介绍了“C语言怎么把时间戳转换成时间”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!#include <stdio.h...
    99+
    2023-06-04
  • unix时间戳怎么转换成时间
    在Unix系统中,时间戳表示从1970年1月1日00:00:00 UTC至当前时间的秒数。要将Unix时间戳转换为常规时间格式,可以...
    99+
    2024-03-01
    unix
  • php中时间戳怎么转为本地时间
    本篇内容介绍了“php中时间戳怎么转为本地时间”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在PHP中,将时间戳转为本地时间的函数是date...
    99+
    2023-06-29
  • 如何将 Unix 时间戳转换为 MySQL 时间戳值?
    MySQL 借助 FROM_UNIXTIME() 函数将 Unix 时间戳转换为时间戳数据类型值。示例mysql> Select FROM_UNIXTIME(1508622563); +-------------------...
    99+
    2023-10-22
  • C#实现时间戳与标准时间的互转
    目录前言1.标准时间转时间戳的方法2.时间戳转为标准时间3.TimeZone.CurrentTimeZone.ToLocalTime()方法补充前言 C# 时间戳与 标准时间的转其实...
    99+
    2024-04-02
  • php时间转unix时间戳的代码怎么写
    这篇文章主要讲解了“php时间转unix时间戳的代码怎么写”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php时间转unix时间戳的代码怎么写”吧!使用strtotime函数strtotim...
    99+
    2023-07-05
  • 怎么将Java时间转换成unix时间戳
    怎么将Java时间转换成unix时间戳?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体内容如下import java.text.DateFormat; i...
    99+
    2023-05-30
    java unix 时间戳
  • pandas实现datetime64与unix时间戳互转
    目录datetime64与unix时间戳互转unix 时间戳与pandas中的Timestamp互转datetime模块pandas默认时间格式转换为unix间戳举个栗子样例date...
    99+
    2024-04-02
  • golang 实现时间戳和时间的转化
    说实话,golang的时间转化还是很麻烦的,最起码比php麻烦很多,上码好好学学一下 package main import ( "time" "fmt" ) ...
    99+
    2024-04-02
  • python 时间戳与格式化时间的转化实现代码
    python 里面与时间有关的模块主要是 time 和 datetime 如果想获取系统当前时间戳:time.time() ,是一个float型的数据 获取系统当前的时间信息 : time.ctime() ...
    99+
    2022-06-04
    时间 代码 python
  • 【python】时间与时间戳互相转换
    全文一览 一、时间戳转换为时间1.0 获取时间戳1.1 datetime 法1.2 time 法 二、时间转化为时间戳 时间戳 : ,1683876941.119018 时间格式: ...
    99+
    2023-09-02
    python 数据结构 开发语言
  • php中时间戳转为本地时间的函数是什么
    本文操作环境:Windows10系统、PHP7.1版、Dell G3电脑。php中时间戳转为本地时间的函数是什么PHP date() 函数可把时间戳格式化为可读性更好的日期和时间。Tip时间戳是一个字符序列,表示一定的事件发生的日期/时间。...
    99+
    2018-09-16
    PHP
  • php怎么转换unix时间戳
    在开发网站和应用程序时,我们经常需要处理时间和日期。在PHP中,时间戳是一个很常见的时间格式,它表示自1970年1月1日0时0分0秒(UTC)起已经经过的秒数。但是,Unix时间戳显示的时间格式并不人性化,因此在实际应用中我们需要将其转换为...
    99+
    2023-05-14
    php时间戳 php
  • Unix、UTC、GPS时间戳及转换
    UTC时间 UTC时间的英文全称:Universal Time Coordinated,中文名称:协调世界时。俗的理解为,这个时间是全世界通用的,即全世界都公用的一个时间。可以认为格林威治时间就是时间协调时间(GMT=UTC),格林威治时间...
    99+
    2023-08-18
    unix linux 服务器
  • Java怎么与Unix时间戳进行转换
    今天就跟大家聊聊有关Java怎么与Unix时间戳进行转换,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。方法实现    public ...
    99+
    2023-05-30
    java unix 时间戳
  • mysql UNIX时间戳与日期的相互转换
    UNIX时间戳转换为日期用函数: FROM_UNIXTIME()select FROM_UNIXTIME(1156219870); 日期转换为UNIX时间戳用函数: UNIX_TIMESTAMP(...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作