`
Poechant
  • 浏览: 227602 次
博客专栏
Bebe66e7-3a30-3fc9-aeea-cfa3b474b591
Nginx高性能Web服务...
浏览量:24243
5738817b-23a1-3a32-86de-632d7da73b1e
Cumulus实时媒体服务...
浏览量:22051
社区版块
存档分类
最新评论

根据毫秒数计算出准确的“年/月/日/时/分/秒/星期”并不是件容易的事

 
阅读更多

根据毫秒数计算出当前的“年/月/日/时/分/秒/星期”并不是件容易的事

  • 作者:钟超
  • 博客:柳大·PoechantBlog.CSDN.net
  • 日期:April 4th, 2012

下文中会用到一些公式,比如:empirical formulaGauss' formula等。主要思想取自 Nginx 的时间管理机制中。

1 毫秒、秒、分、时

如果已知毫秒数为:

unsigned int msec_total;

那么秒数和余毫秒数为:

unsigned int sec_total = msec_total /  1000;
unsigned int msec = msec_total % 1000; /* What we want */

分钟数和余秒数为:

unsigned int min_total = sec_total / 60;
unsigned int sec = sec_total % 60;

小时数和余分钟数为:

unsigned int hour_total = min_total / 60;
unsigned int min = min_total % 60;

余小时数为:

unsigned int hour = hour_total % 24;

剩下的内容非常重要。

2 总天数

unsigned int day_total = hour_total / 24;
day_total = day_total - (31 + 28) + 719527; /* days since March 1, 1 BC */

3 年数

什么是闰年?有如下几类:

  • 能被4整除,但不能被100整除;
  • 能被400整除。

所以总年数是:

/* 总年数 */
year = (days + 2) * 400 / (365 * 400 + 100 - 4 + 1);

还要继续知道整年的余天:

/* yday是整年的余天 */
yday = days - (365 * year + year / 4 - year / 100 + year / 400);

/* 如果余天小于0,说明年数应该减一 */
if (yday < 0) {
    /* 可以被4整除,且不可以被100整除,且可以被400整除 */
    leap = (year % 4 == 0) && (year % 100 || (year % 400 == 0));
    /* 加当年的年数补差值 */
    yday = 365 + leap + yday;
    year--;
}

具体的解释看注释。

4 月份和日期

转载请注明来自柳大的CSDN博客:Blog.CSDN.net

这里用到empirical formulaGauss' formula

/*
 * The empirical formula that maps "yday" to month.
 * There are at least 10 variants, some of them are:
 *     mon = (yday + 31) * 15 / 459
 *     mon = (yday + 31) * 17 / 520
 *     mon = (yday + 31) * 20 / 612
 */

/* 30.6 为平均每月天数 */
mon = (yday + 31) * 10 / 306;

/* the Gauss' formula that evaluates days before the month */

mday = yday - (367 * mon / 12 - 30) + 1;

if (yday >= 306) {

    year++;
    mon -= 10;

    /*
     * there is no "yday" in Win32 SYSTEMTIME
     *
     * yday -= 306;
     */

} else {

    mon += 2;

    /*
     * there is no "yday" in Win32 SYSTEMTIME
     *
     * yday += 31 + 28 + leap;
     */
}

5 星期

wday = (4 + days) % 7; /* 今儿是星期几?注意,1970年1年1日为星期四 */

6 整理日期

msec; /* 毫秒 */
sec;  /* 秒 */
min;  /* 分 */
hour; /* 小时 */
mday; /* 日 */
mon;  /* 月 */
year; /* 年 */
wday; /* 星期 */

7 后记

7.1 将闰秒写入计算机的时间计算方法?

闰秒是人为加入的,计算机中如何表示?什么时候插入闰秒,是由人来决定的,只不过原因是可探究的,但依然无法用公式或程序来计算。

7.2 谁决定是否加入闰秒?

是否加入闰秒由位于巴黎的国际地球自转和参考座标系统服务决定,在格里历的每年的6月或12月的最后一天的最后一分钟进行跳秒或不跳秒,也就是说每年的这两个一分钟并不就是等于60秒,而是在60秒上下变化。

7.3 停止闰秒的表决(以下摘自中文维基)

全球定位系统服务界面委员会在得克萨斯州沃斯堡举行的第47届会议中宣布,他们已经邮寄出停止闰秒的表决案。这项表决案的计划是[1]:

  • 2008年4月:国际电信联盟的工作小组将递交给研究小组关于劝说停止闰秒的7A建议项目。
  • 在2008年,研究小组将通过经由邮件让各会员国投票表决该议案。
  • 2011年:如果70%以上的会员国同意,国际电信会议将批准该建议案。
  • 2013年:如果70%以上的会员国投票废止闰秒,闰秒将停止使用,并且世界时(UTC)将成为连续的时间刻度尺。

-

转载请注明来自柳大的CSDN博客:Blog.CSDN.net

-

分享到:
评论

相关推荐

    使用oracle计算系统当前时间的毫秒数

    2. **转换为自1970年1月1日以来的天数**:接着将`SYSDATE`减去1970年1月1日(使用`TO_DATE`函数)得到的结果表示的是自1970年1月1日至当前日期的时间差(单位是天)。 3. **转换为毫秒数**:由于一天有86400秒,而...

    把毫秒数转换为年月日时分秒

    毫秒数是时间戳的一种形式,它表示自1970年1月1日(UTC/GMT的午夜)开始所经过的毫秒数。在处理时间相关的程序和应用中,有时我们需要将这些毫秒数转换为人类可读的日期和时间格式,即年月日时分秒。这个过程涉及到...

    C# 1970年至今的秒数转为时间

    在计算机编程中,经常需要处理时间戳,特别是从1970年1月1日午夜(UTC)以来的秒数表示的时间戳。这种时间戳格式广泛应用于Web服务、数据库系统以及各种网络协议中。对于C#开发者来说,能够将这种时间戳格式转换为可...

    C#实现毫秒转换成时分秒的方法

    在C#编程中,有时我们需要将时间以毫秒为单位的数值转换成更易读的时、分、秒格式。这种需求通常出现在处理高精度时间计算或者时间间隔表示的场景中。本文将深入探讨如何使用C#实现毫秒到时分秒的转换,并提供一个...

    C/C++获取(毫秒/微秒/纳秒级)系统时间差方法大全

    在C/C++编程中,获取系统的毫秒、微秒或纳秒级时间差是常见的需求,特别是在性能测试、定时任务或者高精度计时场景中。本文将详细介绍四种常用的方法。 ### 方法一:利用 `SYSTEMTIME` `SYSTEMTIME` 结构体是...

    C#日期间隔计算,能计算年,月,天

    然而,需要注意的是,`TimeSpan`的`Years`和`Months`属性并不总是准确的,因为它们基于总天数除以365(年)和30(月)。对于更精确的计算,例如考虑闰年,你需要手动计算。下面是一个更精确的计算年、月的方法: ``...

    python 实现毫秒转换为时分秒

    在Python编程中,有时我们需要处理时间相关的数据,例如将毫秒转换为更易读的时分秒格式。这个任务在处理服务器返回的数据时尤其常见,因为服务器可能以毫秒为单位提供时间戳。本篇文章将深入探讨如何实现这一转换,...

    时间精确到时分秒时,使用getTime获取毫秒数

    `getTime()` 是 JavaScript 中 Date 对象的一个内置方法,它能够返回自1970年1月1日(UTC)凌晨0点0分0秒以来的毫秒数。这个值通常用于计算两个日期之间的差值或者在数据库中存储日期。在这个主题中,我们将深入探讨...

    js计算两个时间差 天 时 分 秒 毫秒的代码

    通过上述步骤,你可以实现计算两个时间差,并以天、时、分、秒和毫秒的形式显示出来。这个功能在处理时间相关的业务逻辑或用户界面展示时非常有用。记住,JavaScript的日期和时间操作可能会受到时区的影响,所以在...

    java 日期操作工具类:包括计算两个时间相差距离多少天多少小时多少分多少秒

    这可以通过`getTime()`方法实现,它返回Date对象自1970年1月1日00:00:00 GMT以来的毫秒数。 - 求出毫秒差后,再将其转换成天、小时、分钟和秒。每单位的换算公式为: - 天:`总毫秒数 / (24 * 60 * 60 * 1000)` -...

    js计算时间差精确到秒

    其中一个重要的方法是 `getTime()`,它返回从1970年1月1日午夜到指定日期之间的毫秒数。 ```javascript var date1 = new Date(beginTime); var date2 = new Date(endTime); var diffMs = date2.getTime() - date1....

    利用毫秒减值计算时长的js代码

    这个函数的作用是将一个表示时间的毫秒数(ms)转换为可读的时长格式,如天、小时、分钟和秒。这样的代码在需要将时间长度以更人性化的方式展示给用户时非常有用,例如,用于记录和显示用户活动持续时间、视频播放时...

    易语言获取系统时间到毫秒

    时间戳是自某个固定时间点(通常为1970年1月1日00:00:00 UTC)以来的秒数,而毫秒则是更精确的时间单位,表示秒的小数部分。在易语言中,我们可以通过内置函数来获取当前的系统时间。 易语言提供了“取系统时间”...

    java编程计算一个人出生日期离现在时间的毫秒值

    在Java中,`Date`类有一个`getTime()`方法,它返回从1970年1月1日(UTC)00:00:00开始到当前日期的毫秒数。如果你有一个表示出生日期的`Date`对象,你可以直接调用`getTime()`来获取这个日期距离1970年1月1日的毫秒...

    JS实现获取毫秒值及转换成年月日时分秒的方法

    - 示例中的`getTime(second, getDateType)`函数接收一个毫秒值和一个整数参数,用于根据参数获取年、月、日、时、分或秒。例如,`getTime(1523604904000, 1)`将返回1523604904000毫秒对应的年份。 6. 在线工具: ...

    js倒计时,年 月,日,时,分,秒

    然后,我们需要一个函数来计算当前日期与目标日期之间的差距,并格式化为年、月、日、时、分、秒。这里涉及到了日期和时间的数学运算,以及字符串格式化: ```javascript function getTimeRemaining(targetDate) { ...

    js 毫秒转天时分秒的实例

    在JavaScript编程中,有时我们需要将时间以毫秒为单位转换为更易读的天、时、分、秒格式。这在处理时间间隔或者倒计时时非常有用。本文将详细讲解如何使用JavaScript实现这个功能,通过一个具体的实例来展示转换过程...

    Java输出系统当前的日期(年月日时分秒毫秒)

    代码如下: package test.remote.tools.combine; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; public class TestOutDate { public ...

Global site tag (gtag.js) - Google Analytics