- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在嵌入式 Linux 上工作,自 1970 年 1 月 1 日起,系统/ Controller 时间以毫秒的形式保持。我正在尝试使用 gmtime 但无法获得准确的结果。将此时间(毫秒)转换为实时小时:分钟:秒:天:月的任何示例都会有所帮助。
最佳答案
你可以使用 civil_from_days
这是在 Howard Hinnant 的 chrono-Compatible Low-Level Date Algorithms 中派生和详细解释的.此函数计算自 1/1/1970 以来的天数,并将其转换为 {y, m, d}
。 field 。完成后,您只需要处理从毫秒时间戳中减去天数以获得自午夜以来的毫秒数,然后将其分解为 h:M:s.ms
。 .
完整代码如下:
#include <iostream>
#include <iomanip>
#include <cstdint>
int
main()
{
using namespace std;
int64_t t = 1490285505123; // milliseconds since epoch
int32_t z = (t >= 0 ? t : t - (1000*86400-1))/(1000*86400); // days since epoch
t -= z * (1000LL * 86400); // milliseconds since midnight
z += 719468;
int32_t era = (z >= 0 ? z : z - 146096) / 146097;
int32_t doe = z - era * 146097;
int32_t yoe = (doe - doe/1460 + doe/36524 - doe/146096) / 365;
int32_t y = yoe + era * 400;
int32_t doy = doe - (365*yoe + yoe/4 - yoe/100);
int32_t m = (5*doy + 2)/153;
int32_t d = doy - (153*m + 2)/5 + 1; // day
m += m < 10 ? 3 : -9; // month
y += m <= 2; // year
int32_t h = t / (1000 * 3600); // hour
t -= h * (1000 * 3600);
int32_t M = t / (1000 * 60); // minute
t -= M * (1000 * 60);
int32_t s = t / 1000; // second
int32_t ms = t - s * 1000; // ms
cout.fill('0');
cout << setw(4) << y << '-' << setw(2) << m << '-' << setw(2) << d
<< ' ' << setw(2) << h << ':' << setw(2) << M
<< ':' << setw(2) << s << '.' << setw(3) << ms << '\n';
}
举个例子,我将 1490285505123ms
用作输入,输出为:
2017-03-23 16:11:45.123
这考虑到了闰年。它不考虑闰秒。您的嵌入式 Linux 系统/ Controller 不太可能同时执行这两种操作,因此尝试这样做是不正确的。
上述算法对t
的有效性范围非常大:
-5877641-06-23 00:00:00.000 <= t <= 5880010-09-09 23:59:59.999
(+/- 580 万年)
如果您不介意限制 t
的下限至 0000-03-01 00:00:00.000
那么你可以简化 era
的计算到:
int32_t era = z / 146097;
如果可以限制t
的下限至 1970-01-01 00:00:00.000
然后计算z
可以简化为:
int32_t z = t / (1000 * 86400); // days since epoch
最后,如果你愿意限制t
到这 400 年的范围:
2000-03-01 00:00:00.000 <= t <= 2400-02-29 23:59:59.999
然后era
可以变得简单:
int32_t const era = 5;
Fwiw,这是一个high-level date/time library利用 C++11/14 <chrono>
执行完全相同计算的库,只是语法更清晰。你的 std::lib 必须支持 <chrono>
使用这个库:
#include "date.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std;
using namespace std::chrono;
cout << sys_time<milliseconds>(1490285505123ms) << '\n';
}
关于c++ - gmtime() 函数是否考虑闰年?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42964040/
我有一个开始的问题 here .我发现了原因并且没有尝试解决其他问题。 我需要将 CherryPy 设置为在不同平台上可用的最长可能 session 时间。为此 CherryPy 使用 time.gm
我正在用 c++/c 检索 GMT 时间。但它返回不正确的时间。例如,现在的时间应该是上午 9 点,但 struct tm 对象返回凌晨 3 点。知道为什么或我做错了什么吗? time_t rawti
我在嵌入式 Linux 上工作,自 1970 年 1 月 1 日起,系统/ Controller 时间以毫秒的形式保持。我正在尝试使用 gmtime 但无法获得准确的结果。将此时间(毫秒)转换为实时小
我在多线程环境中打印事件,控制台是所有线程共享的静态互斥锁。 问题是随机发生的每一百或一千个事件,我得到的时间是本地时间而不是 UTC。 我只在 Linux 机器(使用 g++ 构建)中看到过这个错误
我有这个代码: time_t tt = time(NULL); tm* currentTime = gmtime(&tt); tm* storedTime = gmtime(&m_time); 其中m
我有一个在 Cubox(armhf 平台)上运行的网络服务器(CherryPy),启动服务器后出现以下错误: [14/Aug/2015:09:33:40] HTTP Traceback (most r
是否有一种预定义的方法可以将小时和分钟添加到通过 time.h 获取的 gmtime 中?我想编写一个程序来显示各个国家的时间,那么我必须自己编写逻辑还是有预定义的方法? 最佳答案 如果您有时区名称(
如果我的服务器未配置为使用格林威治标准时间,我不明白为什么 gmdate() 和 date() 返回相同的值。 这是为什么? echo time(); // 13110
将 C 代码迁移到 Swift,对应的等效代码是什么? time(&CurrentTime); tm = gmtime(&CurrentTime); dayOfYear = tm->tm_yday +
根据documentation struct tm *gmtime(const time_t *timer); 应该将 timer 指向的 time_t 转换为分解时间。 现在他们决定让函数接受指向
import time print time.strftime("%a, %d %b %Y %I:%M %p %Z", time.gmtime()) 我住在加利福尼亚。出于某种原因,此代码以 GMT
在谷歌应用引擎 ( http://shell.appspot.com/ ) 上: >>> time.gmtime(1000*365*24*60*60) (2969, 5, 3, 0, 0, 0, 2,
我正在尝试使用 epoch 时间在 STM32L051T6 微 Controller 上设置 RTC 时间。下面是我的代码。 void Rtc_SetTime(uint32_t time_) {
有两个标准的 C 库函数 gmtime() and localtime() .他们都返回这样的结构(一个在 GMT,一个在本地 TZ 和夏令时): struct tm { int tm_sec
我尝试: ts = -216345600000 datetime.datetime.fromtimestamp(ts/1000) ValueError:时间戳超出平台 localtime()/gmti
我有一个在 TZ=UTC 运行的服务器,我有这样的代码: time_t t = time(NULL); struct tm tm; gmtime_r(&t, &tm); 问题是 tm.tm_sec =
如何逆向gmtime(),把时间+日期放在哪里,得到秒数? 我有类似 'Jul 9, 2009 @ 20:02:58 UTC' 之类的字符串,我想返回 epoch 和 2009 年 7 月 9 日之间
我有以下测试代码来查看 gmtime 和 localtime 之间的差异。但他们给了我相同的结果: UTC:2013-05-02T13:59:58 Local:2013-05-02T13:59:58
我有一个 C 程序,我在其中使用遍历目录结构的递归函数。它接受一个 time_t 变量并从中创建一个 gmtime 结构。 递归dir函数来自How to recursively list direc
我一直在搜索谷歌机器,但没有想出任何答案。调用电话时: time.gmtime() 这最终会返回一个时间,正如主题行所说,比我的系统时间早 5 小时。我无法弄清楚发生了什么。 time.tzname
我是一名优秀的程序员,十分优秀!