- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 linux 时钟,它向我发送带字节的时钟,我不知道如何从中获取时钟,我知道它是一种“time_t”类型(可能是自从1/1/1970), 请看下面的几个例子,我从时钟收到了什么(我不确定它发送的是本地时间还是 GMT 时间)
此字节表示 11/09/2017 16:52(本地时间)或 11/09/2017 21:52(格林威治标准时间)
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,66,120,53,34,0,0,0
此字节表示 11/10/2017 10:27(本地时间)或 11/10/2017 15:27(格林威治标准时间)
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,162,111,54,34,0,0,0
这个字节表示 11/13/2017 14:20(Local time) 或 11/13/2017 19:20(GMT)
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,160,154,58,34,0,0,0
最佳答案
通过一些逆向工程,可以查看来自 Linux 时钟的数据在做什么。
如果您阅读数据行,您会发现最后 7 个字节是递增计数器,最低有效字节位于第一个位置。如果您计算一下,3 个计数器的总数如下:
573929538
573992866
574266016
查看第一个数字与第二个和第三个数字的差异,您得到以下信息:
63328
336478
...这是您的样本之间耗时,以秒为单位。
出于某种原因,原始值不是自 Unix 纪元以来的秒数,而是自 1999 年 9 月的一天以来的秒数。
无论如何,以下源代码显示了如何将数据转换为本地时间的基础知识。
#include <time.h>
int main(int argc, char* argv[])
{
const unsigned long localEpoch = 936316800; // local epoch Sept 1999
std::vector<std::vector<int>> timeData =
{
{ 66, 120, 53, 34, 0, 0, 0 },
{ 162, 111, 54, 34, 0, 0, 0 },
{ 160, 154, 58, 34, 0, 0, 0 }
};
for (auto& data : timeData)
{
// convert to total seconds
unsigned long total = 0;
for (std::vector<int>::iterator it = data.begin(); it != data.end(); ++it)
{
total += (*it) << (std::distance(data.begin(), it) * 8);
}
std::cout << "Seconds: " << total << std::endl;
// add to local epoch and display
time_t raw = total + localEpoch;
struct tm timeinfo;
localtime_s(&timeinfo, &raw);
char fmt[100] = { 0 };
asctime_s(fmt, 100, &timeinfo);
std::cout << fmt << std::endl;
}
return 0;
}
它给出了以下输出:
Seconds: 573929538
Thu Nov 9 16:52:18 2017
Seconds: 573992866
Fri Nov 10 10:27:46 2017
Seconds: 574266016
Mon Nov 13 14:20:16 2017
希望对您有所帮助。 (注意我是在 VS 中完成的,所以时间格式化功能是 Windows 的变体,但你明白了。)
(编辑):按要求确定,这里有一些等效的 C# 代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
class Program
{
public static void Main(string[] args)
{
int[,] timeData = new int[,]
{
{ 66, 120, 53, 34, 0, 0, 0 },
{ 162, 111, 54, 34, 0, 0, 0 },
{ 160, 154, 58, 34, 0, 0, 0 }
};
for (int line = 0; line < timeData.GetLength(0); ++line)
{
ulong total = 0;
for (int i = 0; i < timeData.GetLength(1); ++i)
{
total += (ulong)timeData[line,i] << (8 * i);
}
System.Console.WriteLine("Seconds: " + total.ToString());
DateTime result = FromUnixTime(total + localEpoch);
System.Console.WriteLine(result.ToString());
}
System.Console.ReadKey();
}
public static DateTime FromUnixTime(ulong unixTime)
{
return epoch.AddSeconds(unixTime);
}
private static readonly DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
private static readonly ulong localEpoch = 936316800; // local epoch Sept 1999
}
}
(感谢 this question 进行 Epoch 转换。)
关于c++ - 将字节数组转换为 time_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47290497/
我想将日期时间字符串保存到 time_t,然后将其转换回完全原始的字符串。 但是下面的代码会输出"2016-04-25_10:10:05" 并且通过更改 date_str,输出中的小时将不正确。 如果
我有两个 time_t 变量:timeA 和 timeB。 我想做的是检查 timeA 是否与 timeB 相同。但是,我知道在某些情况下它们不会完全相同,两者之间可能会有 1 或 2 秒的差异,所以
我正在尝试编写函数来帮助自己轻松地将 string 转换为 time_t 并将 time_t 转换为 string。然而,它总是给我错误的一年和一个错误的时间。怎么了? 我需要它独立于操作系统! 例如
time_t raw_time = time(NULL); tm* current_time = localtime(&raw_time); 我自己得到了答案......我完全搞砸了警告。无论如何谢谢
我的 time_t 值为 1530173696,代表 2018 年 6 月 28 日,星期四 8:14:56 AM。 我想将时间向下舍入到最接近的小时。具体来说,向下到 1530172800,代表 T
我正在开发嵌入式系统。我们的平台是 32 位,因此 time_t 大小是 32 位。 现在我想将一个结构作为 char 数组发送到 Windows 7 计算机。我的结构体的字段之一是time_t。我无
time_t 这是依赖于平台的类型。我发现 difftime 以秒为单位返回差异,但我没有找到无需任何转换即可进行简单减法的函数。我怎么知道标准不保证在整个时间连续体中始终如一,并且没有说明有关 ti
我正在尝试转换 static char bufferTR[] = "1645"; 像这样的事情...... struct tm *tick_time = localtime(&temp); 在此函数中
在我当前的项目中,我有一个 C 结构来保存时间戳,如下所示: struct timestamp { uint16_t year; uint8_t month; uint8_t day
我有从 2004 年到特定日期的毫秒数。我想将其转换为 time_t 以使用 ctime() 显示它? 也许还有另一种方法可以通过这个毫秒时间戳来可视化日期,有人有吗? 最佳答案 假设“从 2004
我应该如何修改此代码以在每 00:00AM 打印(“Its Midnight”)? #include #include int main(void) { struct tm * localti
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
我是 C 编程新手,我需要一些帮助来完成一个简单的任务。 所以我有这个功能: char *time2str(time_t time) { static_char *str_fmt = "%0
我正在使用处理 time_t 的 API。现在我也有一个来自 API 的结果,它也在 time_t 中检索数据,但问题是第一个只需要日期、小时和分钟,但我检索的数据包括秒,我如何从数据中删除秒>
我正在尝试将“Tue Feb 13 00:26:36 2018”转换为 time_t,我该怎么做,我尝试寻找一个函数但找不到。这是使用非托管 C++。 最佳答案 如果你使用的是 C++11,你可以这样
我有一个 double 的纪元,需要传入一个需要 time_t 的函数。如何将 double 中的纪元转换为 time_t?我在 Linux 上使用 C++ 代码。谢谢。 最佳答案 如果你在 doub
根据 http://www.cplusplus.com/reference/clibrary/ctime/time_t/ time_t 是自 1970 年 1 月 1 日午夜 UTC 以来的秒数。因此
我试图找出时间将溢出 time_t 值的日期 #include #include #include main(){ time_t now,end; now=time(NU
如果我有这个字符串: 2011-10-08T07:07:09Z 是否有可能从中获取time_t?如果可以,如何实现? 最佳答案 是的,是的。首先,使用 strptime(3) 将其转换为 segmen
我不明白为什么这会抛出undefined reference to `floor'”: double curr_time = (double)time(NULL); return floor(curr
我是一名优秀的程序员,十分优秀!