根據毫秒數計算出準確的“年/月/日/時/分/秒/星期”並不是件容易的事
根據毫秒數計算出當前的“年/月/日/時/分/秒/星期”並不是件容易的事
- 作者:鍾超
- 部落格:柳大·PoechantBlog.CSDN.net
- 日期:April 4th, 2012
下文中會用到一些公式,比如:empirical formula
和Gauss' 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 formula
和Gauss' 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
-
相關文章
- 根據年月日判斷星期幾的c程式C程式
- iOS 獲取當前的年、月、日、小時、分鐘、秒iOS
- 為什麼說程式設計不是一件容易的事兒程式設計
- java 根據日期取得星期Java
- JavaScript年月日精確到秒倒數計時JavaScript
- iOS 將一串 毫秒數 字串 轉換成 分 秒 毫秒 的格式*iOS字串
- 根據傳入的年,月引數,返回當月的最大天數,平潤都可計算
- jQuery精確到毫秒倒數計時詳解jQuery
- Java獲取時間戳,毫秒數和秒數Java時間戳
- 根據設計稿,計算出網頁REM的大小,有那麼難嗎?網頁REM
- 使用multicolumns statistics幫助Optimizer計算出更準確的cardinality
- android 根據設定的日期獲取星期幾Android
- java 實現根據年月得到這個月的日曆Java
- 年月日小時分鐘秒倒數計時效果程式碼例項
- php 將秒數轉換為時間(年、天、小時、分、秒)PHP
- 如何根據網站訪問量計算出所需要的頻寬或流量大小網站
- PHP日期加減月數,天數,週數,小時,分,秒等等PHP
- 秒、毫秒、微秒、納秒、皮秒
- JavaScript 天小時分鐘和秒倒數計時JavaScript
- javascript小時、分鐘和秒倒數計時效果JavaScript
- 計算兩個時間日期相差的天數、分鐘數或者秒數
- Java unix時間戳 移除秒毫秒部分Java時間戳
- 原生js實現的天小時分鐘和秒倒數計時效果JS
- 根據生日求年齡的SQLSQL
- MySQL並行複製延時時間不準確MySql並行
- 李想十六年的創業分享:做正確的事,不做容易的事創業
- [譯] 如何根據瀏覽器的現代、過時進行包的分發瀏覽器
- Vue根據條件新增click事件Vue事件
- 根據datetimepicker選擇的日期計算年齡
- 根據條件動態更新不同表的資料
- S根據年月實現獲得當月天數
- js根據時間排序JS排序
- List根據時間排序排序
- 我的工作日誌 - 2020年9月25日 星期五 雨
- 計算出你和另一個人的關係(超準)
- python - 根據均值和標準差生成隨機整數Python隨機
- AR Engine毫秒級平面檢測,帶來更準確的呈現效果
- js 根據開始日期和結束日期顯示倒數計時JS